Skip to content

Commit b4e8acd

Browse files
authored
Merge pull request #3447 from thebignet/trait-redefined-final-method-from-any-ref
New format for trait redefined final method from AnyRef error message…
2 parents 0155804 + b092560 commit b4e8acd

File tree

4 files changed

+26
-2
lines changed

4 files changed

+26
-2
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
@@ -112,6 +112,7 @@ public enum ErrorMessageID {
112112
UndefinedNamedTypeParameterID,
113113
IllegalStartOfStatementID,
114114
TraitIsExpectedID,
115+
TraitRedefinedFinalMethodFromAnyRefID,
115116
;
116117

117118
public int errorNumber() {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1916,4 +1916,10 @@ object messages {
19161916
|"""
19171917
}
19181918
}
1919+
1920+
case class TraitRedefinedFinalMethodFromAnyRef(method: Symbol)(implicit ctx: Context) extends Message(TraitRedefinedFinalMethodFromAnyRefID) {
1921+
val kind = "Syntax"
1922+
val msg = hl"Traits cannot redefine final $method from ${"class AnyRef"}."
1923+
val explanation = ""
1924+
}
19191925
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ object RefChecks {
116116
if (!cls.owner.is(ModuleClass)) {
117117
def clashes(sym: Symbol) =
118118
sym.isClass &&
119-
sym.name.stripModuleClassSuffix == cls.name.stripModuleClassSuffix
119+
sym.name.stripModuleClassSuffix == cls.name.stripModuleClassSuffix
120120

121121
val others = cls.owner.linkedClass.info.decls.filter(clashes)
122122
others.foreach { other =>
@@ -606,7 +606,7 @@ object RefChecks {
606606
// override a concrete method in Object. The jvm, however, does not.
607607
val overridden = decl.matchingDecl(defn.ObjectClass, defn.ObjectType)
608608
if (overridden.is(Final))
609-
ctx.error("trait cannot redefine final method from class AnyRef", decl.pos)
609+
ctx.error(TraitRedefinedFinalMethodFromAnyRef(overridden), decl.pos)
610610
}
611611
}
612612

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,4 +1172,21 @@ class ErrorMessagesTests extends ErrorMessagesTest {
11721172
val TraitIsExpected(symbol) :: Nil = messages
11731173
assertEquals("class B", symbol.show)
11741174
}
1175+
1176+
@Test def traitRedefinedFinalMethodFromAnyRef =
1177+
checkMessagesAfter("refchecks") {
1178+
"""
1179+
|trait C {
1180+
| def wait (): Unit
1181+
|}
1182+
""".stripMargin
1183+
}
1184+
.expect { (ictx, messages) =>
1185+
implicit val ctx: Context = ictx
1186+
1187+
assertMessageCount(1, messages)
1188+
val TraitRedefinedFinalMethodFromAnyRef(method) = messages.head
1189+
assertEquals("method wait", method.show)
1190+
}
1191+
11751192
}

0 commit comments

Comments
 (0)