diff options
author | paltherr <paltherr@epfl.ch> | 2003-10-02 11:03:51 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-10-02 11:03:51 +0000 |
commit | 57a845d6766e58396184af3897915db42dfb6f6f (patch) | |
tree | 01b5f567bf59c37fd507224052413e1fb0e42dfc /sources/scalac/symtab | |
parent | 7449ae53ec7afbc0dcfa7210182a36f93d644f3a (diff) | |
download | scala-57a845d6766e58396184af3897915db42dfb6f6f.tar.gz scala-57a845d6766e58396184af3897915db42dfb6f6f.tar.bz2 scala-57a845d6766e58396184af3897915db42dfb6f6f.zip |
- Added a constructor to AbsTypeSymbols
- Changed ExplicitOuter to replace all TypeRefs prefixes by
- localThisTypes. Adapted ExpandMixins and Type to the new TypeRefs
Diffstat (limited to 'sources/scalac/symtab')
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 21 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 16 |
2 files changed, 19 insertions, 18 deletions
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index cc070c24af..6fa6a0db04 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -1358,8 +1358,7 @@ public abstract class TypeSymbol extends Symbol { public TypeSymbol(int kind, int pos, Name name, Symbol owner, int flags) { super(kind, pos, name, owner, flags); assert name.isTypeName() : this; - if (kind != TYPE) - this.constructor = TermSymbol.newConstructor(this, flags & ~MODUL); + this.constructor = TermSymbol.newConstructor(this, flags & ~MODUL); } protected void update(int pos, int flags) { @@ -1371,12 +1370,10 @@ public abstract class TypeSymbol extends Symbol { */ public void copyTo(Symbol sym) { super.copyTo(sym); - if (kind != TYPE) { - Symbol symconstr = ((TypeSymbol) sym).constructor; - constructor.copyTo(symconstr); - if (constructor.isInitialized()) - symconstr.setInfo(fixConstrType(symconstr.type(), sym)); - } + Symbol symconstr = ((TypeSymbol) sym).constructor; + constructor.copyTo(symconstr); + if (constructor.isInitialized()) + symconstr.setInfo(fixConstrType(symconstr.type(), sym)); } protected void copyConstructorInfo(TypeSymbol other) { @@ -1423,18 +1420,17 @@ public abstract class TypeSymbol extends Symbol { /** Get primary constructor */ public Symbol primaryConstructor() { - return (kind == TYPE) ? Symbol.NONE : constructor.firstAlternative(); + return constructor.firstAlternative(); } /** Get all constructors */ public Symbol allConstructors() { - return (kind == TYPE) ? Symbol.NONE : constructor; + return constructor; } /** Get type parameters */ public Symbol[] typeParams() { - return (kind == TYPE) ? Symbol.EMPTY_ARRAY - : primaryConstructor().info().typeParams(); + return primaryConstructor().info().typeParams(); } /** Get value parameters */ @@ -1611,6 +1607,7 @@ public class AbsTypeSymbol extends TypeSymbol { /** Constructor */ public AbsTypeSymbol(int pos, Name name, Symbol owner, int flags) { super(TYPE, pos, name, owner, flags); + allConstructors().setType(Type.MethodType(EMPTY_ARRAY, thisType())); } public static AbsTypeSymbol define( diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index bb4a63f7ce..8be3dcd00a 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -1011,11 +1011,14 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { */ static class AsSeenFromMap extends Map { - private Type pre; - private Symbol clazz; + private final Type pre; + private final Symbol clazz; + private final boolean local; AsSeenFromMap(Type pre, Symbol clazz) { this.pre = pre; this.clazz = clazz; + Global global = Global.instance; + this.local =global.PHASE.EXPLICITOUTER.id()<global.currentPhase.id; } public Type apply(Type t) { @@ -1036,12 +1039,13 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { //System.out.println(t + ".toInstance(" + pre + "," + clazz + ") = " + t1);//DEBUG return t1; } else { + if (local) prefix = sym.owner().thisType(); Type prefix1 = apply(prefix); - Symbol sym1 = (prefix1 == prefix || (sym.flags & MODUL) != 0) - ? sym : prefix1.rebind(sym); Type[] args1 = map(args); if (prefix1 == prefix && args1 == args) return t; - else return typeRef(prefix1, sym1, args1); + Symbol sym1 = (sym.flags & MODUL) == 0 ? prefix1.rebind(sym) : sym; + if (local) prefix1 = localThisType; + return typeRef(prefix1, sym1, args1); } case SingleType(Type prefix, Symbol sym): @@ -1086,7 +1090,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { Type toPrefix(Symbol sym, Type pre, Symbol clazz) { if (pre == NoType || clazz.kind != CLASS) return this; - else if (sym.isSubClass(clazz) && + else if ((sym.isSubClass(clazz) || clazz.isSubClass(sym)) && pre.widen().symbol().isSubClass(sym)) return pre; else |