summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-07-22 12:28:51 +0000
committerpaltherr <paltherr@epfl.ch>2003-07-22 12:28:51 +0000
commit6d4a913e0fe41ee3742a52f5848003e03c61d9b0 (patch)
tree29543f63b9055b595563506e0a7bf897c45f8e97
parent22f3db43a770b8997788bd6c3bae240b47c1813b (diff)
downloadscala-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
-rw-r--r--sources/scalac/transformer/AddInterfaces.java26
-rw-r--r--sources/scalac/transformer/ExpandMixins.java27
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);
}
}