diff options
author | Martin Odersky <odersky@gmail.com> | 2003-11-21 10:14:16 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-11-21 10:14:16 +0000 |
commit | d9fad519e8d13b10e38649f5605c3d7009bca558 (patch) | |
tree | 33dc32435ea7d0b0c590a1be4b5424d1c57c4ded /sources/scalac | |
parent | c69637585f3d084b73d492371b45f4ab178fd438 (diff) | |
download | scala-d9fad519e8d13b10e38649f5605c3d7009bca558.tar.gz scala-d9fad519e8d13b10e38649f5605c3d7009bca558.tar.bz2 scala-d9fad519e8d13b10e38649f5605c3d7009bca558.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 6 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 20 | ||||
-rw-r--r-- | sources/scalac/typechecker/Analyzer.java | 4 | ||||
-rw-r--r-- | sources/scalac/typechecker/RefCheck.java | 16 | ||||
-rw-r--r-- | sources/scalac/typechecker/RefCheckPhase.java | 9 |
5 files changed, 50 insertions, 5 deletions
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index 3c2ec7d70c..967cd6a6ab 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -1157,7 +1157,7 @@ public abstract class Symbol implements Modifiers, Kinds { assert this.name == that.name : Debug.show(this) + " <> " + Debug.show(that); assert this.owner == that.owner : Debug.show(this) + " != " + Debug.show(that); assert this.isConstructor() == that.isConstructor(); - int overflags = (this.flags & that.flags & (JAVA | ACCESSFLAGS)) | + int overflags = (this.flags & that.flags & (JAVA | ACCESSFLAGS | DEFERRED)) | ((this.flags | that.flags) & ACCESSOR); TermSymbol overloaded = (this.isConstructor()) ? TermSymbol.newConstructor(this.constructorClass(), overflags) @@ -1880,8 +1880,8 @@ public class ClassSymbol extends TypeSymbol { } else { sym = it.next(); while ((sym.flags & SYNTHETIC) == 0) { - System.out.println("skipping " + sym); - sym = it.next(); + //System.out.println("skipping " + sym); + sym = it.next(); } for (int i = 0; i < index; i++) sym = it.next(); diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index e9a220fd55..1122d61f55 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -880,6 +880,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { Type symtype = pre.memberType(sym).derefDef(); Type sym1type = pre.memberType(sym1).derefDef(); + if (sym1.isJava()) symtype = symtype.objParamToAny(); switch (sym1type) { case OverloadedType(Symbol[] alts, Type[] alttypes): for (int i = 0; i < alts.length; i++) { @@ -896,6 +897,25 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { } } } + //where + static Map objToAnyMap = new Map() { + public Type apply(Type t) { + if (t.symbol() == Global.instance.definitions.JAVA_OBJECT_CLASS) + return Global.instance.definitions.ANY_TYPE(); + else return t; + } + }; + + private Type objParamToAny() { + switch (this) { + case MethodType(Symbol[] params, Type restp): + Symbol[] params1 = objToAnyMap.map(params); + if (params1 == params) return this; + else return MethodType(params1, restp); + default: + return this; + } + } // Set Owner ------------------------------------------------------------------ diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index fcb6eaf0d6..44b4773b87 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -266,7 +266,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { accessWithin(sym.owner()) || ((sym.flags & PRIVATE) == 0) && - site.type.symbol().isSubClass(sym.owner()) && + site.type.symbol().isSubClass( + sym.isConstructor() ? sym.constructorClass() + : sym.owner()) && (site instanceof Tree.Super || isSubClassOfEnclosing(site.type.symbol())); } //where diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index 2aee3a04c4..3c39218c72 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -141,6 +141,12 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { } if (clazz.kind == CLASS && (clazz.flags & ABSTRACT) == 0) { if ((member.flags & DEFERRED) != 0) { + Type[] parents = clazz.parents(); + for (int i = 0; i < parents.length; i++) { + Symbol p = parents[i].symbol(); + if (p.isSubClass(member.owner()) && (p.flags & ABSTRACT) == 0) + return; // everything was already checked elsewhere + } abstractClassError( clazz, member + member.locationString() + " is not defined" + @@ -196,10 +202,19 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { * M must be labelled `abstract override'. */ void checkOverride(int pos, Symbol clazz, Symbol member, Symbol other) { + //System.out.println(member + member.locationString() + " overrides " + other + other.locationString() + " in " + clazz);//DEBUG if (member.owner() == clazz) pos = member.pos; else if (member.owner().isSubClass(other.owner())) return; // everything was already checked elsewhere + else { + Type[] parents = clazz.parents(); + for (int i = 0; i < parents.length; i++) { + Symbol p = parents[i].symbol(); + if (p.isSubClass(member.owner()) && p.isSubClass(other.owner())) + return; // everything was already checked elsewhere + } + } if ((member.flags & PRIVATE) != 0) { overrideError(pos, member, other, "has weaker access privileges; it should not be private"); @@ -531,7 +546,6 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { gen.mkRef(tree.pos, mvar)}); // def m: T = { if (m$ == null[T]) m$ = new m$class; m$ } - sym.updateInfo(Type.PolyType(Symbol.EMPTY_ARRAY, sym.type())); sym.flags |= STABLE; Tree ddef = gen.DefDef(sym, body); diff --git a/sources/scalac/typechecker/RefCheckPhase.java b/sources/scalac/typechecker/RefCheckPhase.java index 7749e4b357..87a4653648 100644 --- a/sources/scalac/typechecker/RefCheckPhase.java +++ b/sources/scalac/typechecker/RefCheckPhase.java @@ -10,6 +10,7 @@ package scalac.typechecker; import scalac.*; import scalac.ast.*; +import scalac.symtab.*; import scalac.checkers.*; public class RefCheckPhase extends Phase { @@ -25,6 +26,14 @@ public class RefCheckPhase extends Phase { new RefCheck(global).apply(units[i]); } + public Type transformInfo(Symbol sym, Type tp) { + if (sym.isModule() && !sym.isPackage() && !sym.isGlobalModule()) { + return Type.PolyType(Symbol.EMPTY_ARRAY, tp); + } + else + return tp; + } + public Checker[] postCheckers(Global global) { return new Checker[] { new CheckSymbols(global), |