summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-08-27 13:30:34 +0000
committerMartin Odersky <odersky@gmail.com>2003-08-27 13:30:34 +0000
commit03a8443eea6b6b6a780264ca7c09bb0354ac8e44 (patch)
tree1bc0af3dead4a1fd059825519297fff2d5ff4281 /sources
parentc6bfe08b2ee617f688b2e29572ca3b1caf7e97d0 (diff)
downloadscala-03a8443eea6b6b6a780264ca7c09bb0354ac8e44.tar.gz
scala-03a8443eea6b6b6a780264ca7c09bb0354ac8e44.tar.bz2
scala-03a8443eea6b6b6a780264ca7c09bb0354ac8e44.zip
*** empty log message ***
Diffstat (limited to 'sources')
-rw-r--r--sources/scalac/symtab/Symbol.java2
-rw-r--r--sources/scalac/symtab/Type.java9
-rw-r--r--sources/scalac/typechecker/RefCheck.java36
3 files changed, 25 insertions, 22 deletions
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index bee27bf63a..c3da3e15d9 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -1079,7 +1079,7 @@ public class TermSymbol extends Symbol {
public static TermSymbol newConstructor(Symbol clazz, int flags) {
TermSymbol sym = new TermSymbol(
- clazz.pos, Names.CONSTRUCTOR, clazz.owner(), flags | FINAL);
+ clazz.pos, Names.CONSTRUCTOR, clazz.owner(), flags);
sym.clazz = clazz;
return sym;
}
diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java
index 847b847baa..339c09b38a 100644
--- a/sources/scalac/symtab/Type.java
+++ b/sources/scalac/symtab/Type.java
@@ -1418,9 +1418,8 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
case TypeRef(Type pre1, Symbol sym1, Type[] args1):
switch (this) {
case TypeRef(Type pre, Symbol sym, Type[] args):
- boolean samepre = pre.isSameAs(pre1);
- if ((samepre && sym == sym1 /* fast case */ ||
- !samepre && pre.isSubType(pre1) && sym == pre.rebind(sym1)) &&
+ if (pre.isSubType(pre1) &&
+ (sym == sym1 || sym == pre.rebind(sym1)) &&
isSubArgs(args, args1, sym.typeParams())
||
sym.kind == TYPE && pre.memberInfo(sym).isSubType(that))
@@ -1630,8 +1629,8 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
||
(sym.kind == sym1.kind || sym1.kind == TYPE) &&
self.memberInfo(sym).subst(tparams, targs)
- .isSubType(sym1.info().substThis(sym.owner(), self)) &&
- sym1.loBound().substThis(sym.owner(), self)
+ .isSubType(sym1.info().substThis(sym1.owner(), self)) &&
+ sym1.loBound().substThis(sym1.owner(), self)
.isSubType(self.memberLoBound(sym).subst(tparams, targs))
||
(sym.kind == TYPE && sym1.kind == ALIAS &&
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index e78d628631..460e98abeb 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -9,6 +9,7 @@
package scalac.typechecker;
import java.util.HashMap;
+import java.util.Iterator;
import scalac.*;
import scalac.util.*;
import scalac.ast.*;
@@ -62,6 +63,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
*/
void checkAllOverrides(int pos, Symbol clazz) {
Type[] closure = clazz.closure();
+ HashMap/*<Symbol,Symbol>*/ overrides = null;
for (int i = 0; i < closure.length; i++) {
for (Scope.SymbolIterator it = closure[i].members().iterator();
it.hasNext();) {
@@ -77,23 +79,25 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
member + member.locationString() + " is not defined" +
(((member.flags & MUTABLE) == 0) ? ""
: "\n(Note that variables need to be initialized to be defined)"));
+ } else if ((member.flags & OVERRIDE) != 0) {
+ if (overrides == null)
+ overrides = new HashMap();
+ if ((other.flags & DEFERRED) == 0 ||
+ overrides.get(member) == null)
+ overrides.put(member, other);
}
- if ((other.flags & OVERRIDE) != 0) {
- Type[] clparents = closure[i].parents();
- Symbol sym1 = null;
- for (int j = clparents.length - 1; sym1 == null && j > 0; j--)
- sym1 = clparents[j].lookup(other.name);
- if (sym1 == null) {
- Symbol superclazz = clazz.info().parents()[0].symbol();
- if (superclazz.isSubClass(closure[i].symbol()))
- superclazz = clparents[0].symbol();
- sym1 = superclazz.lookup(other.name);
- }
- if (sym1 != null && (sym1.flags & DEFERRED) != 0)
- abstractClassError(
- clazz, other + other.locationString() +
- " is marked `override' and overrides an abstract member" + sym1.locationString());
- }
+ }
+ }
+ }
+ if (overrides != null) {
+ for (Iterator/*<Symbol>*/ it = overrides.keySet().iterator();
+ it.hasNext();) {
+ Symbol member = (Symbol) it.next();
+ Symbol other = (Symbol) overrides.get(member);
+ if ((other.flags & DEFERRED) != 0) {
+ abstractClassError(
+ clazz, member + member.locationString() +
+ " is marked `override' and overrides only abstract members");
}
}
}