summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-07-10 15:34:13 +0000
committerpaltherr <paltherr@epfl.ch>2003-07-10 15:34:13 +0000
commit3b96193f16e4392e36fdc32e11d28304d46923ff (patch)
treeba5cce1c3339ed3215259b903309ce247e6a53b5
parent7a4d11c99780a6de513cd818f41b923df0502a6c (diff)
downloadscala-3b96193f16e4392e36fdc32e11d28304d46923ff.tar.gz
scala-3b96193f16e4392e36fdc32e11d28304d46923ff.tar.bz2
scala-3b96193f16e4392e36fdc32e11d28304d46923ff.zip
- Added method Symbol.cloneSymbol(Symbol)
-rw-r--r--sources/scalac/ast/SubstTransformer.java9
-rw-r--r--sources/scalac/symtab/Symbol.java7
-rw-r--r--sources/scalac/symtab/Type.java5
-rw-r--r--sources/scalac/transformer/AddInterfacesPhase.java17
-rw-r--r--sources/scalac/transformer/Erasure.java3
-rw-r--r--sources/scalac/transformer/ExpandMixins.java23
-rw-r--r--sources/scalac/transformer/LambdaLift.java6
7 files changed, 29 insertions, 41 deletions
diff --git a/sources/scalac/ast/SubstTransformer.java b/sources/scalac/ast/SubstTransformer.java
index cb64187c2b..ee8541dbb0 100644
--- a/sources/scalac/ast/SubstTransformer.java
+++ b/sources/scalac/ast/SubstTransformer.java
@@ -279,11 +279,10 @@ public class AttributedTreeCopier extends SubstTransformer {
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()));
-
+ Symbol oldOwner = sym.owner();
+ Symbol newOwner = (Symbol)symbolMap.get(oldOwner);
+ if (newOwner == null) newOwner = oldOwner;
+ Symbol newSym = sym.cloneSymbol(newOwner);
symbolMap.put(sym, newSym);
}
}
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index b23b36e09a..69b3053de3 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -75,6 +75,13 @@ public abstract class Symbol implements Modifiers, Kinds {
*/
public abstract Symbol cloneSymbol();
+ /** Return a fresh symbol with the same fields as this one and the
+ * given owner.
+ */
+ public Symbol cloneSymbol(Symbol owner) {
+ return cloneSymbol().setOwner(owner);
+ }
+
/** copy all fields to `sym'
*/
public void copyTo(Symbol sym) {
diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java
index ae2960bb4e..72a25d61ec 100644
--- a/sources/scalac/symtab/Type.java
+++ b/sources/scalac/symtab/Type.java
@@ -697,7 +697,7 @@ public class Type implements Modifiers, Kinds, TypeTags {
Symbol[] syms1 = members1.elements();
Symbol[] syms2 = new Symbol[syms1.length];
for (int i = 0; i < syms2.length; i++) {
- syms2[i] = syms1[i].cloneSymbol().setOwner(tp1.symbol());
+ syms2[i] = syms1[i].cloneSymbol(tp1.symbol());
}
for (int i = 0; i < syms2.length; i++) {
syms2[i].setInfo(syms1[i].info().subst(syms1, syms2));
@@ -2159,8 +2159,7 @@ public class Type implements Modifiers, Kinds, TypeTags {
Type symlb = sym.loBound().substThis(sym.owner(), glbThisType);
Scope.Entry e = s.lookupEntry(sym.name);
if (e == Scope.Entry.NONE) {
- Symbol sym1 = sym.cloneSymbol();
- sym1.setOwner(glbThisType.symbol());
+ Symbol sym1 = sym.cloneSymbol(glbThisType.symbol());
sym1.setInfo(syminfo);
if (sym1.kind == TYPE) sym1.setLoBound(symlb);
s.enter(sym1);
diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java
index 3c51efae91..754d3e1b8c 100644
--- a/sources/scalac/transformer/AddInterfacesPhase.java
+++ b/sources/scalac/transformer/AddInterfacesPhase.java
@@ -200,13 +200,6 @@ public class AddInterfacesPhase extends PhaseDescriptor {
else return className;
}
- /** Clone symbol and set its owner immediately. */
- protected Symbol cloneSymbol(Symbol original, Symbol newOwner) {
- Symbol clone = original.cloneSymbol();
- clone.setOwner(newOwner);
- return clone;
- }
-
/** Clone the symbol itself, and if it represents a method, clone
* its type and value arguments too, then update the symbol's type
* to use these new symbols. Also applies the given substitution
@@ -216,20 +209,20 @@ public class AddInterfacesPhase extends PhaseDescriptor {
Symbol newOwner,
SymbolSubstTypeMap map) {
SymbolSubstTypeMap symMap;
- Symbol clone = cloneSymbol(original, newOwner);
+ Symbol clone = original.cloneSymbol(newOwner);
if (clone.isMethod()) {
Symbol[] tparams = clone.typeParams();
Symbol[] newTParams = new Symbol[tparams.length];
symMap = new SymbolSubstTypeMap(map);
for (int i = 0; i < tparams.length; ++i) {
- newTParams[i] = cloneSymbol(tparams[i], clone);
+ newTParams[i] = tparams[i].cloneSymbol(clone);
symMap.insertSymbol(tparams[i], newTParams[i]);
}
Symbol[] vparams = clone.valueParams();
Symbol[] newVParams = new Symbol[vparams.length];
for (int i = 0; i < vparams.length; ++i) {
- newVParams[i] = cloneSymbol(vparams[i], clone);
+ newVParams[i] = vparams[i].cloneSymbol(clone);
newVParams[i].updateInfo(symMap.apply(newVParams[i].info()));
symMap.insertSymbol(vparams[i], newVParams[i]);
}
@@ -266,7 +259,7 @@ public class AddInterfacesPhase extends PhaseDescriptor {
Symbol classSym = (Symbol)ifaceToClass.get(ifaceSym);
if (classSym == null) {
- classSym = cloneSymbol(ifaceSym, ifaceSym.owner());
+ classSym = ifaceSym.cloneSymbol(ifaceSym.owner());
classSym.name = className(ifaceSym.name);
classSym.flags &= ~Modifiers.INTERFACE;
@@ -282,7 +275,7 @@ public class AddInterfacesPhase extends PhaseDescriptor {
Map classSubst = newClassSubst(classSym);
Symbol[] tparams = classConstrSym.typeParams();
for (int i = 0; i < tparams.length; ++i) {
- Symbol newParam = cloneSymbol(tparams[i], classConstrSym);
+ Symbol newParam = tparams[i].cloneSymbol(classConstrSym);
classSubst.put(tparams[i], newParam);
}
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java
index 1722eb3677..63bb24931c 100644
--- a/sources/scalac/transformer/Erasure.java
+++ b/sources/scalac/transformer/Erasure.java
@@ -271,8 +271,7 @@ public class Erasure extends Transformer implements Modifiers {
// where owner of all parameters is bridge symbol itself.
Symbol[] params1 = new Symbol[params.length];
for (int i = 0; i < params.length; i++) {
- params1[i] = params[i].cloneSymbol();
- params1[i].setOwner(bridgeSym);
+ params1[i] = params[i].cloneSymbol(bridgeSym);
}
bridgeSym.setType(Type.MethodType(params1, restp));
diff --git a/sources/scalac/transformer/ExpandMixins.java b/sources/scalac/transformer/ExpandMixins.java
index 0cb5638ceb..9c589cf4f8 100644
--- a/sources/scalac/transformer/ExpandMixins.java
+++ b/sources/scalac/transformer/ExpandMixins.java
@@ -122,11 +122,11 @@ public class ExpandMixins extends Transformer {
return (Tree[][])s.toArray(new Tree[s.size()][]);
}
- protected Symbol renameSymbol(Map symbolMap, Symbol oldSymbol) {
+ protected Symbol renameSymbol(Map symbolMap, Symbol oldSymbol, Symbol newOwner) {
Name newName = freshNameCreator.newName(oldSymbol.name);
if (oldSymbol.name.isTypeName()) newName = newName.toTypeName();
else if (oldSymbol.name.isConstrName()) newName = newName.toConstrName();
- Symbol newSymbol = oldSymbol.cloneSymbol();
+ Symbol newSymbol = oldSymbol.cloneSymbol(newOwner);
newSymbol.name = newName;
symbolMap.put(oldSymbol, newSymbol);
@@ -212,8 +212,7 @@ public class ExpandMixins extends Transformer {
Tree actual = sectionA[p];
Symbol memberSymbol =
- renameSymbol(symbolMap, formal.symbol());
- memberSymbol.setOwner(owner);
+ renameSymbol(symbolMap, formal.symbol(), owner);
Type memberType = typeMap.apply(formal.tpe.type());
memberSymbol.updateInfo(memberType);
@@ -248,8 +247,11 @@ public class ExpandMixins extends Transformer {
if (memSymT != memSymM) {
if ((memSym.flags & Modifiers.DEFERRED) != 0)
leftOutMembers.add(member);
- else
- renameSymbol(symbolMap, memSym);
+ else {
+ Symbol newMemSym = renameSymbol(symbolMap, memSym, owner);
+ newMembers.enterOrOverload(newMemSym);
+ mixedInSymbols.put(memSym, newMemSym);
+ }
}
}
@@ -267,15 +269,6 @@ public class ExpandMixins extends Transformer {
treeCopier.popSymbolSubst();
newBody.add(newMember);
-
- if (newMember.definesSymbol()) {
- Symbol sym = newMember.symbol();
-
- sym.setOwner(owner);
- newMembers.enterOrOverload(sym);
-
- mixedInSymbols.put(member.symbol(), newMember.symbol());
- }
}
}
diff --git a/sources/scalac/transformer/LambdaLift.java b/sources/scalac/transformer/LambdaLift.java
index 201c2b6152..2b8a05135d 100644
--- a/sources/scalac/transformer/LambdaLift.java
+++ b/sources/scalac/transformer/LambdaLift.java
@@ -436,10 +436,9 @@ public class LambdaLift extends OwnerTransformer
Symbol[] freevars = get(free.ftvs, owner).toArray();
Symbol[] params = new Symbol[freevars.length];
for (int i = 0; i < params.length; i++) {
- params[i] = freevars[i].cloneSymbol();
+ params[i] = freevars[i].cloneSymbol(owner);
params[i].pos = owner.pos;
params[i].flags = PARAM | SYNTHETIC;
- params[i].setOwner(owner);
}
for (int i = 0; i < params.length; i++)
params[i].setInfo(freevars[i].info().subst(freevars, params));
@@ -450,11 +449,10 @@ public class LambdaLift extends OwnerTransformer
Symbol[] freevars = get(free.fvs, owner).toArray();
Symbol[] params = new Symbol[freevars.length];
for (int i = 0; i < params.length; i++) {
- params[i] = freevars[i].cloneSymbol();
+ params[i] = freevars[i].cloneSymbol(owner);
params[i].pos = owner.pos;
params[i].flags &= CAPTURED;
params[i].flags |= PARAM | SYNTHETIC;
- params[i].setOwner(owner);
params[i].setInfo(freevars[i].type());
}
return params;