summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/AddInterfacesPhase.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/transformer/AddInterfacesPhase.java')
-rw-r--r--sources/scalac/transformer/AddInterfacesPhase.java21
1 files changed, 16 insertions, 5 deletions
diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java
index 22e7833199..38f25a4d85 100644
--- a/sources/scalac/transformer/AddInterfacesPhase.java
+++ b/sources/scalac/transformer/AddInterfacesPhase.java
@@ -190,13 +190,15 @@ public class AddInterfacesPhase extends PhaseDescriptor {
* to use these new symbols. Also applies the given substitution
* to the cloned symbols' type. */
protected Symbol deepCloneSymbol(Symbol original,
+ Symbol oldOwner,
Symbol newOwner,
SymbolSubstTypeMap map) {
+ SymbolSubstTypeMap symMap;
Symbol clone = cloneSymbol(original, newOwner);
if (clone.isMethod()) {
Symbol[] tparams = clone.typeParams();
Symbol[] newTParams = new Symbol[tparams.length];
- SymbolSubstTypeMap symMap = new SymbolSubstTypeMap(map);
+ symMap = new SymbolSubstTypeMap(map);
for (int i = 0; i < tparams.length; ++i) {
newTParams[i] = cloneSymbol(tparams[i], clone);
symMap.insertSymbol(tparams[i], newTParams[i]);
@@ -209,9 +211,12 @@ public class AddInterfacesPhase extends PhaseDescriptor {
newVParams[i].updateInfo(symMap.apply(newVParams[i].info()));
symMap.insertSymbol(vparams[i], newVParams[i]);
}
+ } else
+ symMap = map;
- clone.updateInfo(substParams(clone.info(), symMap));
- }
+ ThisTypeMap thisTypeMap = new ThisTypeMap(oldOwner, newOwner);
+ Type newTp = thisTypeMap.apply(substParams(clone.info(), symMap));
+ clone.updateInfo(newTp);
return clone;
}
@@ -287,8 +292,10 @@ public class AddInterfacesPhase extends PhaseDescriptor {
} else if (ifaceMemberSym.isProtected())
ifaceMemberSym.flags ^= Modifiers.PROTECTED;
- classMemberSym =
- deepCloneSymbol(ifaceMemberSym, classSym, paramsSubst);
+ classMemberSym = deepCloneSymbol(ifaceMemberSym,
+ ifaceSym,
+ classSym,
+ paramsSubst);
ifaceMemberSym.flags |= Modifiers.DEFERRED;
classMemberSym.updateInfo(thisTpMap.apply(classMemberSym.info()));
@@ -450,6 +457,10 @@ class ThisTypeMap extends Type.Map {
this.sym = sym; this.tp = tp;
}
+ public ThisTypeMap(Symbol oldSym, Symbol newSym) {
+ this(oldSym, new Type.ThisType(newSym));
+ }
+
public Type apply(Type t) {
switch (t) {
case ThisType(Symbol s):