summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-03-13 16:18:29 +0000
committerMartin Odersky <odersky@gmail.com>2003-03-13 16:18:29 +0000
commitab6e0b35fe9524e4a6c1ceff58ca0cc198a54c48 (patch)
treed21bac494353eaccd8cc703198cde3ffc5e0ff5d
parent414752545523175d36055d8731bbdace82d807ca (diff)
downloadscala-ab6e0b35fe9524e4a6c1ceff58ca0cc198a54c48.tar.gz
scala-ab6e0b35fe9524e4a6c1ceff58ca0cc198a54c48.tar.bz2
scala-ab6e0b35fe9524e4a6c1ceff58ca0cc198a54c48.zip
*** empty log message ***
-rw-r--r--sources/scalac/ast/Tree.java1
-rw-r--r--sources/scalac/ast/TreeInfo.java1
-rw-r--r--sources/scalac/symtab/Symbol.java6
-rw-r--r--sources/scalac/typechecker/Analyzer.java60
-rw-r--r--sources/scalac/typechecker/RefCheck.java1
-rw-r--r--test/files/pos/override.scala9
-rw-r--r--test/pos/override.scala9
7 files changed, 55 insertions, 32 deletions
diff --git a/sources/scalac/ast/Tree.java b/sources/scalac/ast/Tree.java
index d7e54dfc52..ee6018717f 100644
--- a/sources/scalac/ast/Tree.java
+++ b/sources/scalac/ast/Tree.java
@@ -331,6 +331,7 @@ public class Tree {
public case This(Tree qualifier) {
if (!qualifier.isType())
throw unexpected("This expects type", qualifier);
+ assert Global.instance.currentPhase.id <= 2 || qualifier.symbol() != null;
}
/**
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java
index a3537e3f19..790bfc5bc6 100644
--- a/sources/scalac/ast/TreeInfo.java
+++ b/sources/scalac/ast/TreeInfo.java
@@ -91,6 +91,7 @@ public class TreeInfo {
case Super(_):
return true;
case Ident(_):
+ assert tree.type != null : tree.toString();
return tree.symbol().isStable();
case Select(Tree qual, _):
return tree.symbol().isStable() && isPureExpr(qual);
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index 2b31c87b96..1a3b5e2073 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -740,7 +740,9 @@ public abstract class Symbol implements Modifiers, Kinds {
if (isVariable()) return "variable";
else if (isModule()) return "module";
else if (isConstructor()) return "constructor";
- else if (isInitializedMethod()) return "method";
+ else if (isInitializedMethod() &&
+ (Global.instance.debug || (flags & STABLE) == 0) )
+ return "method";
else return "value";
default: return "";
}
@@ -856,7 +858,7 @@ public abstract class Symbol implements Modifiers, Kinds {
default:
if (symtype.isSubType(sym1type)) return sym1;
else {
- if (Type.debugSwitch) System.out.println(this + locationString() + " does not override " + sym1 + sym1.locationString() + ", since " + symtype + " !<= " + sym1type);//DEBUG
+ if (Global.instance.debug) System.out.println(this + locationString() + " does not override " + sym1 + sym1.locationString() + ", since " + symtype + " !<= " + sym1type);//DEBUG
return Symbol.NONE;
}
}
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index 342aa50dcd..37d27a1995 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -171,6 +171,14 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
return errorTree(pos);
}
+ void explainTypes(Type found, Type required) {
+ if (global.debug) {
+ Type.debugSwitch = true;
+ found.isSubType(required);
+ Type.debugSwitch = false;
+ }
+ }
+
void typeError(int pos, Type found, Type req) {
String explanation = "";
switch (found) {
@@ -414,11 +422,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
if (found.isSubType(required)) return found;
else {
typeError(pos, found, required);
- if (global.debug) {
- Type.debugSwitch = true;
- found.isSubType(required);
- Type.debugSwitch = false;
- }
+ explainTypes(found, required);
return Type.ErrorType;
}
}
@@ -604,7 +608,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
default:
if (other.isConstructor())
overrideError(pos, member, other, "cannot override a class constructor");
- if (!self.memberInfo(member).isSubType(self.memberInfo(other)))
+ Type selftype = normalizedInfo(self, member);
+ Type othertype = normalizedInfo(self, other);
+ if (!selftype.isSubType(othertype))
overrideTypeError(pos, member, other, self);
}
}
@@ -618,12 +624,20 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
}
void overrideTypeError(int pos, Symbol member, Symbol other, Type site) {
- if (other.type() != Type.ErrorType && member.type() != Type.ErrorType)
+ if (other.type() != Type.ErrorType && member.type() != Type.ErrorType) {
error(pos,
member + member.locationString() +
- infoString(member, site.memberInfo(member)) +
+ infoString(member, normalizedInfo(site, member)) +
"\n cannot override " + other + other.locationString() +
- infoString(other, site.memberInfo(other)));
+ infoString(other, normalizedInfo(site, other)));
+ explainTypes(normalizedInfo(site, member), normalizedInfo(site, other));
+ }
+ }
+
+ Type normalizedInfo(Type site, Symbol sym) {
+ Type tp = site.memberInfo(sym);
+ if (sym.kind == VAL && (sym.flags & STABLE) != 0) tp = tp.resultType();
+ return tp;
}
String infoString(Symbol sym, Type symtype) {
@@ -1097,9 +1111,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
if (sym.owner().kind == CLASS) {
pre = nextcontext.enclClass.owner.thisType();
if (!sym.owner().isPackage()) {
- tree = make.Select(
- tree.pos, gen.mkStableId(tree.pos, pre), name);
- //System.out.println(name + " :::> " + tree);//DEBUG
+ Tree qual = gen.mkStableId(tree.pos, pre);
+ tree = make.Select(tree.pos, qual, name);
+ //System.out.println(name + " :::> " + tree + " " + qual.symbol());//DEBUG
}
} else {
pre = Type.localThisType;
@@ -1288,9 +1302,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
popContext();
if (owner.isTrait()) {
for (int i = 0; i < templ.parents.length; i++)
- checkTrait(templ.parents[i], owner);
+ checkTrait(parents1[i], owner);
for (int i = 0; i < templ.body.length; i++)
- checkPureDef(templ.body[i], owner);
+ checkPureDef(body1[i], owner);
}
Tree.Template templ1 = copy.Template(templ, parents1, body1);
templ1.setType(owner.type());
@@ -1731,15 +1745,14 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
Tree tpe1 = transform(tpe, TYPEmode);
Tree rhs1 = rhs;
if (tpe1 == Tree.Empty) {
- tpe1 = gen.mkType(rhs1.pos, rhs.type);
- //System.out.println("infer " + sym + ":" + rhs.type);//DEBUG
+ tpe1 = gen.mkType(rhs.pos, rhs.type);
// rhs already attributed by defineSym in this case
} else if (rhs != Tree.Empty) {
if ((mods & CASE) != 0) {
- rhs1 = rhs; //rhs was already attributed
+ //rhs was already attribute
} else {
pushContext(tree, sym, context.scope);
- rhs1 = transform(rhs1, EXPRmode, sym.type());
+ rhs1 = transform(rhs, EXPRmode, sym.type());
popContext();
}
}
@@ -2016,11 +2029,8 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
Tree tree1;
if (qual == Tree.Empty) {
clazz = context.enclClass.owner;
- if (clazz != null) { // we are in a class or module
- tree1 = make.This(
- tree.pos,
- make.Ident(tree.pos, clazz.name)
- .setSymbol(clazz).setType(clazz.type()));
+ if (clazz != null) {
+ tree1 = gen.mkStableId(tree.pos, clazz.thisType());
} else {
return error(
tree.pos, tree +
@@ -2032,7 +2042,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
if (clazz.kind == CLASS) {
Context clazzContext = context.outerContext(clazz);
if (clazzContext != Context.NONE) {
- tree1 = tree;
+ if (!(qual1 instanceof Tree.Ident))
+ qual1 = gen.Ident(tree.pos, qual1.symbol());
+ tree1 = copy.This(tree, qual1);
} else {
return error(qual.pos,
clazz.name + " is not an enclosing class");
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index 753c81986b..e2bcf4e027 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -190,6 +190,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
case Ident(Name name):
Scope.Entry e = scopes[level].lookupEntry(name);
Symbol sym = tree.symbol();
+ assert sym != null : name;
if (sym.isLocal() && sym == e.sym) {
int i = level;
while (scopes[i] != e.owner) i--;
diff --git a/test/files/pos/override.scala b/test/files/pos/override.scala
index d930986913..a6c81c9b8a 100644
--- a/test/files/pos/override.scala
+++ b/test/files/pos/override.scala
@@ -1,11 +1,14 @@
trait A extends Object {
- def f = 1
+ def f = 1;
+ val x: A;
}
trait B extends Object {
- def f = 2
+ def f = 2;
}
trait C extends Object with A with B {
- override def f = super.f
+ override def f = super.f;
+ val a: A;
+ val x: a.type = a;
}
diff --git a/test/pos/override.scala b/test/pos/override.scala
index d930986913..a6c81c9b8a 100644
--- a/test/pos/override.scala
+++ b/test/pos/override.scala
@@ -1,11 +1,14 @@
trait A extends Object {
- def f = 1
+ def f = 1;
+ val x: A;
}
trait B extends Object {
- def f = 2
+ def f = 2;
}
trait C extends Object with A with B {
- override def f = super.f
+ override def f = super.f;
+ val a: A;
+ val x: a.type = a;
}