diff options
author | paltherr <paltherr@epfl.ch> | 2003-04-11 14:33:20 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-04-11 14:33:20 +0000 |
commit | 6bb5add14b677f23683c1cafab7f74beea52f9f9 (patch) | |
tree | 19d87fa03338218c88cde636194da9d1cfccb3c0 /sources/scalac | |
parent | 53e9038cd0437b84ecf833e27c42f70831c01f32 (diff) | |
download | scala-6bb5add14b677f23683c1cafab7f74beea52f9f9.tar.gz scala-6bb5add14b677f23683c1cafab7f74beea52f9f9.tar.bz2 scala-6bb5add14b677f23683c1cafab7f74beea52f9f9.zip |
- Renamed class TreeCopier into AttributedTreeC...
- Renamed class TreeCopier into AttributedTreeCopier and moved it into
file SubstTransformer.java.
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/ast/SubstTransformer.java | 74 | ||||
-rw-r--r-- | sources/scalac/ast/TreeCopier.java | 74 |
2 files changed, 74 insertions, 74 deletions
diff --git a/sources/scalac/ast/SubstTransformer.java b/sources/scalac/ast/SubstTransformer.java index cc9ebfa781..038a7a934b 100644 --- a/sources/scalac/ast/SubstTransformer.java +++ b/sources/scalac/ast/SubstTransformer.java @@ -242,3 +242,77 @@ public class SubstTransformer extends Transformer { } } } + + +/** + * Superclass for tree copiers. Takes care of duplicating symbols and + * types when needed. + * + * @author Michel Schinz + * @version 1.0 + */ +public class AttributedTreeCopier extends SubstTransformer { + public AttributedTreeCopier(Global global, TreeFactory make) { + super(global, make); + } + + private boolean inPattern = false; + + // Return true iff tree's symbol must be copied. By default, + // symbols which are defined are copied. + public boolean mustCopySymbol(Tree tree) { + switch (tree) { + case Ident(Name name): + return (inPattern && name.isVariable()) || tree.definesSymbol(); + default: + return tree.definesSymbol(); + } + } + + public Tree copy(Tree tree) { + // Copy all symbols that have to be copied. + Traverser symCopier = new Traverser() { + public void traverse(Tree tree) { + if (tree.hasSymbol()) { + Symbol sym = tree.symbol(); + + if (sym != Symbol.NONE + && mustCopySymbol(tree) + && !symbolMap.containsKey(sym)) { + Symbol newSym = sym.cloneSymbol(); + + if (symbolMap.containsKey(newSym.owner())) + newSym.setOwner((Symbol)symbolMap.get(newSym.owner())); + + symbolMap.put(sym, newSym); + } + } + switch (tree) { + case CaseDef(Tree pat, Tree guard, Tree body): + inPattern = true; traverse(pat); inPattern = false; + traverse(guard); + traverse(body); + break; + default: + super.traverse(tree); + } + } + }; + symCopier.traverse(tree); + + // Copy tree + Tree newTree = transform(tree); + + // Update symbols + Iterator symbolsIt = symbolMap.entrySet().iterator(); + while (symbolsIt.hasNext()) { + Map.Entry symPair = (Map.Entry)symbolsIt.next(); + Symbol oldSym = (Symbol)symPair.getKey(); + Symbol newSym = (Symbol)symPair.getValue(); + + newSym.setInfo(smApplier.apply(typeMap.apply(oldSym.info()))); + } + + return newTree; + } +} diff --git a/sources/scalac/ast/TreeCopier.java b/sources/scalac/ast/TreeCopier.java index 092f7960c2..2f12558655 100644 --- a/sources/scalac/ast/TreeCopier.java +++ b/sources/scalac/ast/TreeCopier.java @@ -13,77 +13,3 @@ import scalac.*; import scalac.util.Name; import scalac.symtab.*; import java.util.*; - -/** - * Superclass for tree copiers. Takes care of duplicating symbols and - * types when needed. - * - * @author Michel Schinz - * @version 1.0 - */ - -public class TreeCopier extends SubstTransformer { - public TreeCopier(Global global, TreeFactory make) { - super(global, make); - } - - private boolean inPattern = false; - - // Return true iff tree's symbol must be copied. By default, - // symbols which are defined are copied. - public boolean mustCopySymbol(Tree tree) { - switch (tree) { - case Ident(Name name): - return (inPattern && name.isVariable()) || tree.definesSymbol(); - default: - return tree.definesSymbol(); - } - } - - public Tree copy(Tree tree) { - // Copy all symbols that have to be copied. - Traverser symCopier = new Traverser() { - public void traverse(Tree tree) { - if (tree.hasSymbol()) { - Symbol sym = tree.symbol(); - - if (sym != Symbol.NONE - && mustCopySymbol(tree) - && !symbolMap.containsKey(sym)) { - Symbol newSym = sym.cloneSymbol(); - - if (symbolMap.containsKey(newSym.owner())) - newSym.setOwner((Symbol)symbolMap.get(newSym.owner())); - - symbolMap.put(sym, newSym); - } - } - switch (tree) { - case CaseDef(Tree pat, Tree guard, Tree body): - inPattern = true; traverse(pat); inPattern = false; - traverse(guard); - traverse(body); - break; - default: - super.traverse(tree); - } - } - }; - symCopier.traverse(tree); - - // Copy tree - Tree newTree = transform(tree); - - // Update symbols - Iterator symbolsIt = symbolMap.entrySet().iterator(); - while (symbolsIt.hasNext()) { - Map.Entry symPair = (Map.Entry)symbolsIt.next(); - Symbol oldSym = (Symbol)symPair.getKey(); - Symbol newSym = (Symbol)symPair.getValue(); - - newSym.setInfo(smApplier.apply(typeMap.apply(oldSym.info()))); - } - - return newTree; - } -} |