diff options
Diffstat (limited to 'sources/scalac/transformer/AddInterfacesPhase.java')
-rw-r--r-- | sources/scalac/transformer/AddInterfacesPhase.java | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java index 1e2a15a204..22e7833199 100644 --- a/sources/scalac/transformer/AddInterfacesPhase.java +++ b/sources/scalac/transformer/AddInterfacesPhase.java @@ -258,6 +258,9 @@ public class AddInterfacesPhase extends PhaseDescriptor { // modified anymore. classSubst = Collections.unmodifiableMap(classSubst); + ThisTypeMap thisTpMap = + new ThisTypeMap(ifaceSym, new Type.ThisType(classSym)); + Symbol[] vparams = classConstrSym.valueParams(); for (int i = 0; i < vparams.length; ++i) { vparams[i].setOwner(classConstrSym); @@ -288,8 +291,7 @@ public class AddInterfacesPhase extends PhaseDescriptor { deepCloneSymbol(ifaceMemberSym, classSym, paramsSubst); ifaceMemberSym.flags |= Modifiers.DEFERRED; - // TODO substitute symbols in ThisTypes appearing in - // the type of the class member + classMemberSym.updateInfo(thisTpMap.apply(classMemberSym.info())); classMembersMap.put(ifaceMemberSym, classMemberSym); } else { // Member doesn't go in interface, we just make it @@ -439,3 +441,21 @@ public class AddInterfacesPhase extends PhaseDescriptor { } } } + +class ThisTypeMap extends Type.Map { + private Symbol sym; + private Type tp; + + public ThisTypeMap(Symbol sym, Type tp) { + this.sym = sym; this.tp = tp; + } + + public Type apply(Type t) { + switch (t) { + case ThisType(Symbol s): + return (s == sym) ? tp : t; + default: + return map(t); + } + } +} |