summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-03-12 09:52:16 +0000
committerMartin Odersky <odersky@gmail.com>2003-03-12 09:52:16 +0000
commit0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c (patch)
tree3e97518ea344b50802339ab2002ca20583f0cb00 /sources/scalac/symtab
parent86beea21be94408044884415bbafcad5e0574c66 (diff)
downloadscala-0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c.tar.gz
scala-0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c.tar.bz2
scala-0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/symtab')
-rw-r--r--sources/scalac/symtab/Type.java33
1 files changed, 21 insertions, 12 deletions
diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java
index 3874954d30..ad862d5cf4 100644
--- a/sources/scalac/symtab/Type.java
+++ b/sources/scalac/symtab/Type.java
@@ -121,7 +121,7 @@ public class Type implements Modifiers, Kinds, TypeTags {
}
public static Type typeRef(Type pre, Symbol sym, Type[] args) {
- if (pre.isStable() || pre == ErrorType)
+ if (pre.isLegalPrefix() || pre == ErrorType)
return TypeRef(pre, sym, args);
else if (sym.kind == ALIAS)
return pre.memberInfo(sym);
@@ -458,6 +458,22 @@ public class Type implements Modifiers, Kinds, TypeTags {
}
}
+ /** Is this type a legal prefix?
+ */
+ public boolean isLegalPrefix() {
+ switch (unalias()) {
+ case ThisType(_):
+ case SingleType(_, _):
+ return true;
+ case TypeRef(_, Symbol sym, _):
+ return sym.kind == CLASS &&
+ ((sym.flags & JAVA) != 0 ||
+ (sym.flags & (TRAIT | ABSTRACTCLASS)) == 0);
+ default:
+ return false;
+ }
+ }
+
/** Is this type a reference to an object type?
*/
public boolean isObjectType() {
@@ -895,7 +911,8 @@ public class Type implements Modifiers, Kinds, TypeTags {
Type toPrefix(Type pre, Symbol clazz) {
if (pre == NoType || clazz.kind != CLASS)
return this;
- else if (pre.widen().symbol().isSubClass(symbol()))
+ else if (symbol().isSubClass(clazz) &&
+ pre.widen().symbol().isSubClass(symbol()))
return pre;
else
return toPrefix(pre.baseType(clazz).prefix(), clazz.owner());
@@ -1218,15 +1235,7 @@ public class Type implements Modifiers, Kinds, TypeTags {
case NoType:
return false;
- case ThisType(Symbol sym1):
- switch (this) {
- case ThisType(Symbol sym):
- return sym.isSubClass(sym1);
- case SingleType(_, _):
- return this.isSameAs(that);
- }
- break;
-
+ case ThisType(_):
case SingleType(_, _):
switch (this) {
case ThisType(_):
@@ -1238,7 +1247,7 @@ public class Type implements Modifiers, Kinds, TypeTags {
case TypeRef(Type pre1, Symbol sym1, Type[] args1):
switch (this) {
case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym == sym1 && pre.isSubType(pre1) && isSubArgs(args, args1))
+ if (sym == sym1 && pre.isSameAs(pre1) && isSubArgs(args, args1))
return true;
break;
}