summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-04-30 21:17:56 +0000
committerPaul Phillips <paulp@improving.org>2010-04-30 21:17:56 +0000
commitf662b62e2b079968b46e1474f73117fdf7684271 (patch)
tree249ba8c79cd4a5f8e133e444e92f3d03a5708afc /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
parent4758f2a87c2c069e9021bd23de4dd304d3623af7 (diff)
downloadscala-f662b62e2b079968b46e1474f73117fdf7684271.tar.gz
scala-f662b62e2b079968b46e1474f73117fdf7684271.tar.bz2
scala-f662b62e2b079968b46e1474f73117fdf7684271.zip
Accumulate missing abstract member errors so th...
Accumulate missing abstract member errors so they can all be printed instead of only the first. Closes #2213, no review.
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, 21 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index ea4109bd3a..72f6f1ae39 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -393,12 +393,22 @@ abstract class RefChecks extends InfoTransform {
// 2. Check that only abstract classes have deferred members
if (clazz.isClass && !clazz.isTrait) {
+ def isClazzAbstract = clazz hasFlag ABSTRACT
+ val abstractErrors = new ListBuffer[String]
+ def abstractErrorMessage =
+ // a little formatting polish
+ if (abstractErrors.size <= 2) abstractErrors mkString " "
+ else abstractErrors.tail.mkString(abstractErrors.head + ":\n", "\n", "")
+
def abstractClassError(mustBeMixin: Boolean, msg: String) {
- unit.error(clazz.pos,
- (if (clazz.isAnonymousClass || clazz.isModuleClass) "object creation impossible"
- else if (mustBeMixin) clazz.toString() + " needs to be a mixin"
- else clazz.toString() + " needs to be abstract") + ", since " + msg);
- clazz.setFlag(ABSTRACT)
+ def prelude = (
+ if (clazz.isAnonymousClass || clazz.isModuleClass) "object creation impossible"
+ else if (mustBeMixin) clazz + " needs to be a mixin"
+ else clazz + " needs to be abstract"
+ ) + ", since"
+
+ if (abstractErrors.isEmpty) abstractErrors ++= List(prelude, msg)
+ else abstractErrors += msg
}
def javaErasedOverridingSym(sym: Symbol): Symbol =
@@ -415,7 +425,7 @@ abstract class RefChecks extends InfoTransform {
((member hasFlag JAVA) && javaErasedOverridingSym(member) != NoSymbol)
for (member <- clazz.tpe.nonPrivateMembersAdmitting(VBRIDGE))
- if (member.isDeferred && !(clazz hasFlag ABSTRACT) && !ignoreDeferred(member)) {
+ if (member.isDeferred && !isClazzAbstract && !ignoreDeferred(member)) {
abstractClassError(
false, infoString(member) + " is not defined" + analyzer.varNotice(member))
} else if ((member hasFlag ABSOVERRIDE) && member.isIncompleteIn(clazz)) {
@@ -449,7 +459,11 @@ abstract class RefChecks extends InfoTransform {
if (!parents.isEmpty && parents.head.typeSymbol.hasFlag(ABSTRACT))
checkNoAbstractDecls(parents.head.typeSymbol)
}
- if (!(clazz hasFlag ABSTRACT)) checkNoAbstractDecls(clazz)
+ if (abstractErrors.isEmpty && !isClazzAbstract)
+ checkNoAbstractDecls(clazz)
+
+ if (abstractErrors.nonEmpty)
+ unit.error(clazz.pos, abstractErrorMessage)
}
/** Returns whether there is a symbol declared in class `inclazz`