summaryrefslogtreecommitdiff
path: root/sources/scalac/typechecker/RefCheck.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/typechecker/RefCheck.java')
-rw-r--r--sources/scalac/typechecker/RefCheck.java60
1 files changed, 33 insertions, 27 deletions
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index 24c452cf70..d3a603642a 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -69,14 +69,14 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
for (Scope.SymbolIterator it = closure[i].members().iterator(true);
it.hasNext();) {
Symbol other = it.next();
- Symbol members = ((other.flags & PRIVATE) != 0) ? other
+ Symbol member = ((other.flags & PRIVATE) != 0) ? other
: clazz.info().lookup(other.name);
- Symbol member = Symbol.NONE;
- if (members.kind != NONE &&
- members.owner() != other.owner() &&
- (members.owner() == clazz ||
- !members.owner().isSubClass(other.owner())))
- member = checkOverride(pos, clazz, members, other);
+ if (member.owner() == other.owner())
+ member = other;
+ else if (member.type() instanceof Type.OverloadedType)
+ member = findOverriding(pos, clazz, member, other);
+ if (member.kind != NONE && member != other)
+ checkOverride(pos, clazz, member, other);
if (clazz.kind == CLASS && (clazz.flags & ABSTRACTCLASS) == 0) {
if ((member.flags & DEFERRED) != 0) {
abstractClassError(
@@ -116,21 +116,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
clazz.flags |= ABSTRACTCLASS;
}
- /** Check that all conditions for overriding `other' by `member' are met.
- * That is for overriding member M and overridden member O:
- *
- * 1. M must have the same or stronger access privileges as O.
- * 2. O must not be final.
- * 3. O is deferred, or M has `override' modifier.
- * 4. O is not a class, nor a class constructor.
- * 5. If O is a type alias, then M is an alias of O.
- * 6. If O is an abstract type then
- * either M is an abstract type, and M's bounds are sharper than O's bounds.
- * or M is a type alias or class which conforms to O's bounds.
- * 7. If O and M are values, then M's type is a subtype of O's type.
- * 8. If O is an immutable value, then so is M.
- */
- Symbol checkOverride(int pos, Symbol clazz, Symbol members, Symbol other) {
+ Symbol findOverriding(int pos, Symbol clazz, Symbol members, Symbol other) {
Type self = clazz.thisType();
Symbol member = members;
Type memberinfo = normalizedInfo(self, member);
@@ -153,10 +139,29 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
}
}
}
- if (member == members) {
- }
}
- if (member.owner() == clazz) pos = member.pos;
+ return member;
+ }
+
+ /** Check that all conditions for overriding `other' by `member' are met.
+ * That is for overriding member M and overridden member O:
+ *
+ * 1. M must have the same or stronger access privileges as O.
+ * 2. O must not be final.
+ * 3. O is deferred, or M has `override' modifier.
+ * 4. O is not a class, nor a class constructor.
+ * 5. If O is a type alias, then M is an alias of O.
+ * 6. If O is an abstract type then
+ * either M is an abstract type, and M's bounds are sharper than O's bounds.
+ * or M is a type alias or class which conforms to O's bounds.
+ * 7. If O and M are values, then M's type is a subtype of O's type.
+ * 8. If O is an immutable value, then so is M.
+ */
+ void checkOverride(int pos, Symbol clazz, Symbol member, Symbol other) {
+ if (member.owner() == clazz)
+ pos = member.pos;
+ else if (member.owner().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");
@@ -177,6 +182,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
":\n both are inherited from mixin classes; " +
"\n an overriding definition in the current template is required");
} else {
+ Type self = clazz.thisType();
switch (other.kind) {
case CLASS:
overrideError(pos, member, other, "cannot override a class");
@@ -189,7 +195,8 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
if (other.isConstructor())
overrideError(pos, member, other,
"cannot override a class constructor");
- if (!memberinfo.isSubType(otherinfo))
+ if (!normalizedInfo(self, member).isSubType(
+ normalizedInfo(self, other)))
overrideTypeError(pos, member, other, self, false);
if (member.kind == TYPE &&
!self.memberLoBound(other).isSubType(
@@ -198,7 +205,6 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
}
}
- return member;
}
void overrideError(int pos, Symbol member, Symbol other, String msg) {