summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-11-21 10:14:16 +0000
committerMartin Odersky <odersky@gmail.com>2003-11-21 10:14:16 +0000
commitd9fad519e8d13b10e38649f5605c3d7009bca558 (patch)
tree33dc32435ea7d0b0c590a1be4b5424d1c57c4ded /sources/scalac
parentc69637585f3d084b73d492371b45f4ab178fd438 (diff)
downloadscala-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.java6
-rw-r--r--sources/scalac/symtab/Type.java20
-rw-r--r--sources/scalac/typechecker/Analyzer.java4
-rw-r--r--sources/scalac/typechecker/RefCheck.java16
-rw-r--r--sources/scalac/typechecker/RefCheckPhase.java9
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),