Skip to content

Commit d062110

Browse files
Abel Nietofelixmulder
Abel Nieto
authored andcommitted
Move 'invalid super qualifier' error to new error format.
As part of #1589, use the new error message for static super references where the qualifier isn't a parent of the class. Tested: Added unit test.
1 parent 2325863 commit d062110

File tree

4 files changed

+43
-1
lines changed

4 files changed

+43
-1
lines changed

compiler/src/dotty/tools/dotc/reporting/diagnostic/ErrorMessageID.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public enum ErrorMessageID {
5555
RecursiveValueNeedsResultTypeID,
5656
CyclicReferenceInvolvingID,
5757
CyclicReferenceInvolvingImplicitID,
58+
SuperQualMustBeParentID,
5859
;
5960

6061
public int errorNumber() {

compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,4 +1192,21 @@ object messages {
11921192
|""".stripMargin
11931193
}
11941194

1195+
case class SuperQualMustBeParent(qual: untpd.Ident, cls: Symbols.ClassSymbol)(implicit ctx: Context)
1196+
extends Message(SuperQualMustBeParentID) {
1197+
1198+
val msg = hl"""|$qual does not name a parent of $cls"""
1199+
1200+
val kind = "Reference"
1201+
1202+
private val parents: Seq[String] = (cls.info.parents map (_.name.show)).sorted
1203+
1204+
val explanation =
1205+
hl"""|When a qualifier ${"T"} is used in a ${"super"} prefix of the form ${"C.super[T]"},
1206+
|${"T"} must be a parent type of ${"C"}.
1207+
|
1208+
|In this case, the parents of $cls are:
1209+
|${parents.mkString(" - ", "\n - ", "")}
1210+
|""".stripMargin
1211+
}
11951212
}

compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ trait TypeAssigner {
298298
case p :: Nil =>
299299
p
300300
case Nil =>
301-
errorType(em"$mix does not name a parent class of $cls", tree.pos)
301+
errorType(SuperQualMustBeParent(mix, cls), tree.pos)
302302
case p :: q :: _ =>
303303
errorType("ambiguous parent class qualifier", tree.pos)
304304
}

compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,5 +304,29 @@ class ErrorMessagesTests extends ErrorMessagesTest {
304304
assertEquals("x", tree.name.show)
305305
}
306306

307+
@Test def superQualMustBeParent =
308+
checkMessagesAfter("frontend") {
309+
"""
310+
|class A {
311+
| def foo(): Unit = ()
312+
|}
313+
|
314+
|class B {
315+
|}
316+
|
317+
|class C extends A {
318+
| super[B].foo
319+
|}
320+
""".stripMargin
321+
}
322+
.expect { (ictx, messages) =>
323+
implicit val ctx: Context = ictx
324+
val defn = ictx.definitions
307325

326+
assertMessageCount(1, messages)
327+
val SuperQualMustBeParent(qual, cls) :: Nil = messages
328+
329+
assertEquals("B", qual.show)
330+
assertEquals("class C", cls.show)
331+
}
308332
}

0 commit comments

Comments
 (0)