Skip to content

Commit f038212

Browse files
committed
New format for trait redefined final method from AnyRef error message (+tests)
1 parent 28f6c3f commit f038212

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ public enum ErrorMessageID {
110110
MissingEmptyArgumentListID,
111111
DuplicateNamedTypeParameterID,
112112
UndefinedNamedTypeParameterID,
113-
IllegalStartOfStatementID
113+
IllegalStartOfStatementID,
114+
TraitRedefinedFinalMethodFromAnyRefID
114115
;
115116

116117
public int errorNumber() {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1888,4 +1888,11 @@ object messages {
18881888
}
18891889
val explanation = "A statement is either an import, a definition or an expression."
18901890
}
1891+
1892+
case class TraitRedefinedFinalMethodFromAnyRef()(implicit ctx: Context) extends Message(TraitRedefinedFinalMethodFromAnyRefID) {
1893+
val kind = "Syntax"
1894+
val msg = "Trait cannot redefine final method from class AnyRef"
1895+
val explanation = hl"""A method was defined in a trait trying to redefine a method declared in class AnyRef.
1896+
All classes inherit from AnyRef and should not redefine its methods"""
1897+
}
18911898
}

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(), 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
@@ -1151,4 +1151,21 @@ class ErrorMessagesTests extends ErrorMessagesTest {
11511151
assertEquals(IllegalStartOfStatement(isModifier = false), err)
11521152
assertEquals(IllegalStartOfStatement(isModifier = true), errWithModifier)
11531153
}
1154+
1155+
@Test def traitRedefinedFinalMethodFromAnyRef =
1156+
checkMessagesAfter("refchecks") {
1157+
"""
1158+
|trait C {
1159+
| def wait (): Unit
1160+
|}
1161+
""".stripMargin
1162+
}
1163+
.expect { (ictx, messages) =>
1164+
implicit val ctx: Context = ictx
1165+
1166+
assertMessageCount(1, messages)
1167+
val err :: Nil = messages
1168+
1169+
assertEquals(TraitRedefinedFinalMethodFromAnyRef(), err)
1170+
}
11541171
}

0 commit comments

Comments
 (0)