From 9c66a1e5b6045efaf925dbd0954a2e55a21c3df3 Mon Sep 17 00:00:00 2001 From: schinz Date: Mon, 19 May 2003 08:37:58 +0000 Subject: - (partial) bug fix: modify ThisTypes appearing... - (partial) bug fix: modify ThisTypes appearing in classes which have an interface so that they use the class symbol --- sources/scalac/transformer/AddInterfaces.java | 14 ++++++++++++- sources/scalac/transformer/AddInterfacesPhase.java | 24 ++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) (limited to 'sources/scalac') diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java index 20479eeea4..6e16eeb351 100644 --- a/sources/scalac/transformer/AddInterfaces.java +++ b/sources/scalac/transformer/AddInterfaces.java @@ -54,6 +54,7 @@ class AddInterfaces extends Transformer { protected Pair/**/ ownerSubst = null; protected StackedHashMap identSubst = new StackedHashMap(); protected SymbolSubstTypeMap typeSubst = new SymbolSubstTypeMap(); + protected ThisTypeMap thisTypeSubst = null; protected LinkedList/*>*/ bodyStack = new LinkedList(); @@ -73,7 +74,11 @@ class AddInterfaces extends Transformer { public Tree transform(Tree tree) { // Update tree type, to take into account the new (type) // symbols of enclosing classes / methods. - tree.setType(typeSubst.apply(tree.type())); + Type newTp = typeSubst.apply(tree.type()); + if (thisTypeSubst != null) + tree.setType(thisTypeSubst.apply(newTp)); + else + tree.setType(newTp); if (tree.definesSymbol() && !(tree instanceof ClassDef)) { // Update symbol's owner, if needed. @@ -271,6 +276,10 @@ class AddInterfaces extends Transformer { Tree[] classBody = classImpl.body; Map classMemberMap = phase.getClassMemberMap(classSym); + + assert thisTypeSubst == null; + thisTypeSubst = new ThisTypeMap(ifaceSym, new Type.ThisType(classSym)); + for (int i = 0; i < classBody.length; ++i) { Tree t = classBody[i]; Symbol tSym = t.symbol(); @@ -286,6 +295,8 @@ class AddInterfaces extends Transformer { newClassBody.append(newT); } + thisTypeSubst = null; + Tree[][] oldParentArgs = extractParentArgs(classImpl.parents); Tree[][] parentArgs = new Tree[oldParentArgs.length + 1][]; System.arraycopy(oldParentArgs, 0, parentArgs, 0, oldParentArgs.length); @@ -318,4 +329,5 @@ class AddInterfaces extends Transformer { protected void popOwnerSubst() { ownerSubst = (Pair)ownerSubstStack.removeFirst(); } + } 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); + } + } +} -- cgit v1.2.3