Skip to content

Commit 953a385

Browse files
authored
Merge pull request #3283 from m-sp/master
move 'extend final class' to error class
2 parents 6edced8 + c419e6e commit 953a385

File tree

4 files changed

+22
-1
lines changed

4 files changed

+22
-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
@@ -100,6 +100,7 @@ public enum ErrorMessageID {
100100
NoReturnFromInlineID,
101101
ReturnOutsideMethodDefinitionID,
102102
UncheckedTypePatternID,
103+
ExtendFinalClassID,
103104
;
104105

105106
public int errorNumber() {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1770,4 +1770,12 @@ object messages {
17701770
|"""
17711771
}
17721772

1773+
case class ExtendFinalClass(clazz:Symbol, finalClazz: Symbol)(implicit ctx: Context)
1774+
extends Message(ExtendFinalClassID) {
1775+
val kind = "Syntax"
1776+
val msg = hl"$clazz cannot extend ${"final"} $finalClazz"
1777+
val explanation =
1778+
hl"""A class marked with the ${"final"} keyword cannot be extended"""
1779+
}
1780+
17731781
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ class Namer { typer: Typer =>
876876
else {
877877
val pclazz = pt.typeSymbol
878878
if (pclazz.is(Final))
879-
ctx.error(em"cannot extend final $pclazz", cls.pos)
879+
ctx.error(ExtendFinalClass(cls, pclazz), cls.pos)
880880
if (pclazz.is(Sealed) && pclazz.associatedFile != cls.associatedFile)
881881
ctx.error(em"cannot extend sealed $pclazz in different compilation unit", cls.pos)
882882
pt

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,4 +998,16 @@ class ErrorMessagesTests extends ErrorMessagesTest {
998998
val ReturnOutsideMethodDefinition(owner) :: Nil = messages
999999
assertEquals("object A", owner.show)
10001000
}
1001+
@Test def extendFinalClass = checkMessagesAfter("refchecks") {
1002+
"""final class A
1003+
|
1004+
|class B extends A
1005+
""".stripMargin
1006+
}.expect { (ictx, messages) =>
1007+
implicit val ctx: Context = ictx
1008+
assertMessageCount(1, messages)
1009+
val ExtendFinalClass(extender, parent) :: Nil = messages
1010+
assertEquals(extender.show, "class B")
1011+
assertEquals(parent.show, "class A")
1012+
}
10011013
}

0 commit comments

Comments
 (0)