summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorschinz <schinz@epfl.ch>2003-05-19 08:37:58 +0000
committerschinz <schinz@epfl.ch>2003-05-19 08:37:58 +0000
commit9c66a1e5b6045efaf925dbd0954a2e55a21c3df3 (patch)
treeaf1fac39c5b3a9803fe686b67872ee938d4f147f /sources/scalac
parentb4cfef25570aa814f48c3513ed2cadfcc6059afe (diff)
downloadscala-9c66a1e5b6045efaf925dbd0954a2e55a21c3df3.tar.gz
scala-9c66a1e5b6045efaf925dbd0954a2e55a21c3df3.tar.bz2
scala-9c66a1e5b6045efaf925dbd0954a2e55a21c3df3.zip
- (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
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/transformer/AddInterfaces.java14
-rw-r--r--sources/scalac/transformer/AddInterfacesPhase.java24
2 files changed, 35 insertions, 3 deletions
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/*<Symbol,Symbol>*/ ownerSubst = null;
protected StackedHashMap identSubst = new StackedHashMap();
protected SymbolSubstTypeMap typeSubst = new SymbolSubstTypeMap();
+ protected ThisTypeMap thisTypeSubst = null;
protected LinkedList/*<List<Tree>>*/ 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);
+ }
+ }
+}