/* * This file is part of the X10 project (http://x10-lang.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.opensource.org/licenses/eclipse-1.0.php * * (C) Copyright IBM Corporation 2010. */ package x10.visit; import java.util.Map; import java.util.Set; import polyglot.ast.Block; import polyglot.ast.Formal; import polyglot.ast.LocalDecl; import polyglot.ast.Node; import polyglot.types.LocalDef; import polyglot.types.Name; import polyglot.visit.AlphaRenamer; import polyglot.visit.ContextVisitor; import polyglot.visit.NodeVisitor; import x10.ast.Closure; import x10.util.CollectionFactory; public class X10AlphaRenamer extends AlphaRenamer { protected Map<Name, LocalDef> localDefMap = CollectionFactory.newHashMap(); protected TypeRewriter rewriter = new TypeRewriter(renamingMap, localDefMap); private ContextVisitor cv; public X10AlphaRenamer(ContextVisitor visitor) { this(visitor, true); } public X10AlphaRenamer(ContextVisitor visitor, boolean clearOutOfScopeMaps) { super(clearOutOfScopeMaps); cv = visitor; } @Override public NodeVisitor enter(Node n) { if (n instanceof LocalDecl) { LocalDecl l = (LocalDecl) n; localDefMap.put(l.name().id(), l.localDef()); } if (n instanceof Formal) { Formal f = (Formal) n; localDefMap.put(f.name().id(), f.localDef()); } X10AlphaRenamer res = (X10AlphaRenamer) super.enter(n); if (n instanceof Closure) { // [IP] Closures may have formals that shadow outer locals Closure c = (Closure) n; res = (X10AlphaRenamer) res.shallowCopy(); res.renamingMap = CollectionFactory.newHashMap(this.renamingMap); for (Formal f : c.formals()) { res.renamingMap.remove(f.name()); } } return res; } @Override public Node leave(Node old, Node n, NodeVisitor v) { Set<Name> s = null; if (isNewScope(n)) { s = setStack.peek(); } Node res = rewriter.transform(n, old, cv); res = super.leave(old, res, v); if (clearMaps && isNewScope(res)) { localDefMap.keySet().removeAll(s); } return res; } }