diff options
author | Martin Odersky <odersky@gmail.com> | 2003-03-12 09:52:16 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-03-12 09:52:16 +0000 |
commit | 0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c (patch) | |
tree | 3e97518ea344b50802339ab2002ca20583f0cb00 /sources/scalac/symtab | |
parent | 86beea21be94408044884415bbafcad5e0574c66 (diff) | |
download | scala-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.java | 33 |
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; } |