Skip to content

Commit 9b648dc

Browse files
authored
Merge pull request #15432 from dotty-staging/add-deprecated-overriding
Add deprecated overriding checks
2 parents 80a1e95 + 535e451 commit 9b648dc

File tree

3 files changed

+24
-15
lines changed

3 files changed

+24
-15
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

+1
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,7 @@ class Definitions {
951951
@tu lazy val ContextResultCountAnnot: ClassSymbol = requiredClass("scala.annotation.internal.ContextResultCount")
952952
@tu lazy val ProvisionalSuperClassAnnot: ClassSymbol = requiredClass("scala.annotation.internal.ProvisionalSuperClass")
953953
@tu lazy val DeprecatedAnnot: ClassSymbol = requiredClass("scala.deprecated")
954+
@tu lazy val DeprecatedOverridingAnnot: ClassSymbol = requiredClass("scala.deprecatedOverriding")
954955
@tu lazy val ImplicitAmbiguousAnnot: ClassSymbol = requiredClass("scala.annotation.implicitAmbiguous")
955956
@tu lazy val ImplicitNotFoundAnnot: ClassSymbol = requiredClass("scala.annotation.implicitNotFound")
956957
@tu lazy val InlineParamAnnot: ClassSymbol = requiredClass("scala.annotation.internal.InlineParam")

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

+9-15
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ object RefChecks {
316316
/* Check that all conditions for overriding `other` by `member`
317317
* of class `clazz` are met.
318318
*/
319-
def checkOverride(member: Symbol, other: Symbol): Unit = {
319+
def checkOverride(member: Symbol, other: Symbol): Unit =
320320
def memberTp(self: Type) =
321321
if (member.isClass) TypeAlias(member.typeRef.EtaExpand(member.typeParams))
322322
else self.memberInfo(member)
@@ -373,6 +373,11 @@ object RefChecks {
373373
if trueMatch && noErrorType then
374374
emitOverrideError(overrideErrorMsg(msg, compareTypes))
375375

376+
def overrideDeprecation(what: String, member: Symbol, other: Symbol, fix: String): Unit =
377+
report.deprecationWarning(
378+
s"overriding $what${infoStringWithLocation(other)} is deprecated;\n ${infoString(member)} should be $fix.",
379+
if member.owner == clazz then member.srcPos else clazz.srcPos)
380+
376381
def autoOverride(sym: Symbol) =
377382
sym.is(Synthetic) && (
378383
desugar.isDesugaredCaseClassMethodName(member.name) || // such names are added automatically, can't have an override preset.
@@ -423,6 +428,7 @@ object RefChecks {
423428
def otherIsJavaProtected = other.isAllOf(JavaProtected) // or o is Java defined and protected (see #3946)
424429
memberIsPublic || protectedOK && (accessBoundaryOK || otherIsJavaProtected)
425430
end isOverrideAccessOK
431+
426432
if !member.hasTargetName(other.targetName) then
427433
overrideTargetNameError()
428434
else if !isOverrideAccessOK then
@@ -509,22 +515,10 @@ object RefChecks {
509515
overrideError("cannot have a @targetName annotation since external names would be different")
510516
else if !other.isExperimental && member.hasAnnotation(defn.ExperimentalAnnot) then // (1.12)
511517
overrideError("may not override non-experimental member")
512-
else
513-
checkOverrideDeprecated()
514-
}
518+
else if other.hasAnnotation(defn.DeprecatedOverridingAnnot) then
519+
overrideDeprecation("", member, other, "removed or renamed")
515520
end checkOverride
516521

517-
/* TODO enable; right now the annotation is scala-private, so cannot be seen
518-
* here.
519-
*/
520-
def checkOverrideDeprecated() = { /*
521-
if (other.hasDeprecatedOverridingAnnotation) {
522-
val suffix = other.deprecatedOverridingMessage map (": " + _) getOrElse ""
523-
val msg = s"overriding ${other.fullLocationString} is deprecated$suffix"
524-
unit.deprecationWarning(member.pos, msg)
525-
}*/
526-
}
527-
528522
OverridingPairsChecker(clazz, self).checkAll(checkOverride)
529523
printMixinOverrideErrors()
530524

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
trait A:
2+
def f: Int
3+
4+
class B extends A:
5+
@deprecatedOverriding def f = 1
6+
7+
class C extends B:
8+
override def f = 2 // error
9+
10+
trait D extends A:
11+
override def f = 3
12+
13+
object E extends B, D // error
14+

0 commit comments

Comments
 (0)