summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2008-08-05 16:48:11 +0000
committerMartin Odersky <odersky@gmail.com>2008-08-05 16:48:11 +0000
commite2be618472daa31f442b61a11a4bd3fe434cddce (patch)
tree1c607318344a9e2f4ce6548a93af3293a6562081 /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
parente50c7947b58e4937e1d5bd8a346be3c44592962c (diff)
downloadscala-e2be618472daa31f442b61a11a4bd3fe434cddce.tar.gz
scala-e2be618472daa31f442b61a11a4bd3fe434cddce.tar.bz2
scala-e2be618472daa31f442b61a11a4bd3fe434cddce.zip
fixed #1163.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index d60f7ef97e..6c50f40d9b 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -100,15 +100,19 @@ abstract class RefChecks extends InfoTransform {
def isFBounded(tsym: Symbol) =
tsym.info.baseTypeSeq exists (_ contains tsym)
- def infoString(sym: Symbol) = {
+ def infoString(sym: Symbol) = infoString0(sym, sym.owner != clazz)
+ def infoStringWithLocation(sym: Symbol) = infoString0(sym, true)
+
+ def infoString0(sym: Symbol, showLocation: Boolean) = {
val sym1 = analyzer.underlying(sym)
sym1.toString() +
- (if (sym1.owner == clazz) ""
- else (sym1.locationString +
- (if (sym1.isAliasType) ", which equals "+self.memberInfo(sym1)
- else if (sym1.isAbstractType) " with bounds "+self.memberInfo(sym1)
- else if (sym1.isTerm) " of type "+self.memberInfo(sym1)
- else "")))
+ (if (showLocation)
+ sym1.locationString +
+ (if (sym1.isAliasType) ", which equals "+self.memberInfo(sym1)
+ else if (sym1.isAbstractType) " with bounds "+self.memberInfo(sym1)
+ else if (sym1.isTerm) " of type "+self.memberInfo(sym1)
+ else "")
+ else "")
}
def overridesType(tp1: Type, tp2: Type): Boolean = (tp1.normalize, tp2.normalize) match {
@@ -130,8 +134,14 @@ abstract class RefChecks extends InfoTransform {
def overrideError(msg: String) {
if (other.tpe != ErrorType && member.tpe != ErrorType)
- unit.error(pos, "error overriding " + infoString(other) +
- ";\n " + infoString(member) + " " + msg);
+ unit.error(pos, "error overriding " + infoStringWithLocation(other) +
+ ";\n " + infoString(member) + " " + msg +
+ (if ((other.owner isSubClass member.owner) &&
+ other.isDeferred && !member.isDeferred)
+ ";\n (Note that "+infoStringWithLocation(other)+" is abstract,"+
+ "\n and is therefore overridden by concrete "+
+ infoStringWithLocation(member)+")"
+ else ""))
}
def overrideTypeError() {