diff options
author | paltherr <paltherr@epfl.ch> | 2003-07-22 12:28:51 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-07-22 12:28:51 +0000 |
commit | 6d4a913e0fe41ee3742a52f5848003e03c61d9b0 (patch) | |
tree | 29543f63b9055b595563506e0a7bf897c45f8e97 /sources | |
parent | 22f3db43a770b8997788bd6c3bae240b47c1813b (diff) | |
download | scala-6d4a913e0fe41ee3742a52f5848003e03c61d9b0.tar.gz scala-6d4a913e0fe41ee3742a52f5848003e03c61d9b0.tar.bz2 scala-6d4a913e0fe41ee3742a52f5848003e03c61d9b0.zip |
- Added a missing cast in AddInterfaces
- Moved cast insertion code from ExpandMixins to AddInterfaces Refined
- cast insertion test
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scalac/transformer/AddInterfaces.java | 26 | ||||
-rw-r--r-- | sources/scalac/transformer/ExpandMixins.java | 27 |
2 files changed, 24 insertions, 29 deletions
diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java index 71b159faf7..f2916e1d27 100644 --- a/sources/scalac/transformer/AddInterfaces.java +++ b/sources/scalac/transformer/AddInterfaces.java @@ -172,12 +172,32 @@ class AddInterfaces extends Transformer { // constructor, use the class constructor instead. Symbol clsSym = sym.primaryConstructorClass(); if (phase.needInterface(clsSym)) - return gen.Select(qualifier, + return gen.Select(transform(qualifier), phase.getClassSymbol(clsSym).constructor()); else return super.transform(tree); - } else - return super.transform(tree); + } else { + qualifier = transform(qualifier); + Symbol owner = sym.owner(); + if (owner.isClass() + && owner.isJava() && !owner.isInterface() + && owner != defs.ANY_CLASS + && owner != defs.ANYREF_CLASS + && owner != defs.JAVA_OBJECT_CLASS) { + Type qualifierType = qualifier.type().bound(); + if (phase.needInterface(qualifierType.symbol())) { + Type castType = qualifierType.baseType(owner); + qualifier = + gen.Apply( + gen.TypeApply( + gen.Select(qualifier, defs.AS), + new Tree[] { + gen.mkType(tree.pos, castType)}), + Tree.EMPTY_ARRAY); + } + } + return copy.Select(tree, sym, qualifier); + } } case Ident(_): { diff --git a/sources/scalac/transformer/ExpandMixins.java b/sources/scalac/transformer/ExpandMixins.java index 71b2ba60c0..2ff3d357a3 100644 --- a/sources/scalac/transformer/ExpandMixins.java +++ b/sources/scalac/transformer/ExpandMixins.java @@ -290,32 +290,7 @@ public class ExpandMixins extends Transformer { } default: - Tree newTree = super.transform(tree); - - switch (newTree) { - case Apply(Select(Tree qualifier, _), Tree[] args): { - Tree fun = ((Tree.Apply)newTree).fun; - Symbol funOwnerSym = fun.symbol().owner(); - Symbol qualSym = qualifier.type.widen().symbol().moduleClass(); - if (! (qualifier instanceof Tree.Super - || qualSym.isSubClass(funOwnerSym))) { - global.log("inserting cast from " + qualSym + " to " + funOwnerSym);//debug - Type ownerTp = funOwnerSym.type(); - Tree castQualifier = - gen.Apply(gen.TypeApply(gen.Select(qualifier, defs.AS), - new Tree[] { - gen.mkType(qualifier.pos, ownerTp) - }), - Tree.EMPTY_ARRAY); - return copy.Apply(newTree, - copy.Select(fun, castQualifier), - args); - } else - return newTree; - } - default: - return newTree; - } + return super.transform(tree); } } |