summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-10-02 11:03:51 +0000
committerpaltherr <paltherr@epfl.ch>2003-10-02 11:03:51 +0000
commit57a845d6766e58396184af3897915db42dfb6f6f (patch)
tree01b5f567bf59c37fd507224052413e1fb0e42dfc /sources/scalac/symtab
parent7449ae53ec7afbc0dcfa7210182a36f93d644f3a (diff)
downloadscala-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.java21
-rw-r--r--sources/scalac/symtab/Type.java16
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