Skip to content

Commit d8dd54b

Browse files
committed
Fix experimental annotation detection
1 parent 540e22f commit d8dd54b

File tree

10 files changed

+45
-32
lines changed

10 files changed

+45
-32
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -978,15 +978,9 @@ object RefChecks {
978978
then
979979
Feature.checkExperimentalDef(sym, pos)
980980

981-
private def checkExperimentalTypes(tpe: Type, pos: SrcPos)(using Context): Unit =
982-
val checker = new TypeTraverser:
983-
def traverse(tp: Type): Unit =
984-
if tp.typeSymbol.isExperimental then
985-
Feature.checkExperimentalDef(tp.typeSymbol, pos)
986-
else
987-
traverseChildren(tp)
988-
if !pos.span.isSynthetic then // avoid double errors
989-
checker.traverse(tpe)
981+
private def checkExperimentalAnnots(sym: Symbol)(using Context): Unit =
982+
for annot <- sym.annotations if annot.symbol.isExperimental do
983+
Feature.checkExperimentalDef(annot.symbol, annot.tree)
990984

991985
/** If @migration is present (indicating that the symbol has changed semantics between versions),
992986
* emit a warning.
@@ -1225,6 +1219,7 @@ class RefChecks extends MiniPhase { thisPhase =>
12251219
override def transformValDef(tree: ValDef)(using Context): ValDef = {
12261220
checkNoPrivateOverrides(tree)
12271221
checkDeprecatedOvers(tree)
1222+
checkExperimentalAnnots(tree.symbol)
12281223
val sym = tree.symbol
12291224
if (sym.exists && sym.owner.isTerm) {
12301225
tree.rhs match {
@@ -1245,6 +1240,7 @@ class RefChecks extends MiniPhase { thisPhase =>
12451240
override def transformDefDef(tree: DefDef)(using Context): DefDef = {
12461241
checkNoPrivateOverrides(tree)
12471242
checkDeprecatedOvers(tree)
1243+
checkExperimentalAnnots(tree.symbol)
12481244
checkImplicitNotFoundAnnotation.defDef(tree.symbol.denot)
12491245
tree
12501246
}
@@ -1258,6 +1254,7 @@ class RefChecks extends MiniPhase { thisPhase =>
12581254
checkAllOverrides(cls)
12591255
checkImplicitNotFoundAnnotation.template(cls.classDenot)
12601256
checkExperimentalInheritance(cls)
1257+
checkExperimentalAnnots(cls)
12611258
tree
12621259
}
12631260
catch {
@@ -1307,6 +1304,12 @@ class RefChecks extends MiniPhase { thisPhase =>
13071304
checkUndesiredProperties(tree.symbol, tree.srcPos)
13081305
tree
13091306
}
1307+
1308+
override def transformTypeDef(tree: TypeDef)(using Context): TypeDef = {
1309+
checkUndesiredProperties(tree.symbol, tree.srcPos)
1310+
checkExperimentalAnnots(tree.symbol)
1311+
tree
1312+
}
13101313
}
13111314

13121315
/* todo: rewrite and re-enable
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import scala.annotation.experimental
2+
3+
@experimental // error
4+
class myExperimentalAnnot extends scala.annotation.Annotation
5+
6+
@myExperimentalAnnot // error
7+
def test: Unit = ()

tests/neg-custom-args/no-experimental/experimentalEnum.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
// nopos-error // nopos-error // nopos-error // FIXME redundant due to enum
12
import scala.annotation.experimental
23

3-
@experimental // FIXME ERROR
4-
enum E: // error
4+
@experimental // error
5+
enum E:
56
case A
6-
case B // error
7+
case B
78

89
def test: Unit =
910
E.A // error
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
import scala.annotation.experimental
2+
13
class MyExperimentalAnnot // error
2-
extends scala.annotation.experimental // error
4+
extends experimental // error

tests/neg-custom-args/no-experimental/experimentalnline.scala renamed to tests/neg-custom-args/no-experimental/experimentalInline.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import scala.annotation.experimental
22

3-
@experimental // FIXME ERROR
3+
@experimental
44
inline def g() = ()
55

66
def test: Unit =

tests/neg-custom-args/no-experimental/experimentalOverride.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import scala.annotation.experimental
22

3-
@experimental // FIXME ERROR
3+
@experimental // error
44
class A:
55
def f() = 1
66

7-
@experimental // FIXME ERROR
7+
@experimental // error
88
class B extends A:
99
override def f() = 2
1010

1111
class C:
12-
@experimental // FIXME ERROR
12+
@experimental // error
1313
def f() = 1
1414

1515
class D extends C:
1616
override def f() = 2
1717

1818
trait A2:
19-
@experimental // FIXME ERROR
19+
@experimental // error
2020
def f(): Int
2121

2222
trait B2:

tests/neg-custom-args/no-experimental/experimentalSam.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import scala.annotation.experimental
22

3-
@experimental // FIXME ERROR
3+
@experimental // error
44
trait ExpSAM {
55
def foo(x: Int): Int
66
}

tests/neg-custom-args/no-experimental/experimentalTerms.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import scala.annotation.experimental
22

3-
@experimental // FIXME ERROR
3+
@experimental // error
44
val x = ()
55

6-
@experimental // FIXME ERROR
6+
@experimental // error
77
def f() = ()
88

9-
@experimental // FIXME ERROR
9+
@experimental // error
1010
object X:
1111
def fx() = 1
1212

tests/neg-custom-args/no-experimental/experimentalType.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import scala.annotation.experimental
22

3-
@experimental // FIXME ERROR
3+
@experimental // error
44
class A
55

6-
@experimental // FIXME ERROR
6+
@experimental // error
77
class B extends A
88

9-
@experimental // FIXME ERROR
10-
type X
9+
@experimental
10+
type X // error
1111

12-
@experimental // FIXME ERROR
13-
type Y = Int
12+
@experimental
13+
type Y = Int // error
1414

15-
@experimental // FIXME ERROR
16-
opaque type Z = Int
15+
@experimental
16+
opaque type Z = Int // error
1717

1818
def test(
1919
p1: A, // error

tests/neg-custom-args/no-experimental/experimentalUnapply.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import scala.annotation.experimental
22

3-
@experimental // FIXME ERROR
3+
@experimental // error
44
class A
55

66
object Extractor1:
77
def unapply(s: Any): Option[A] = ??? // FIXME ERROR
88

99
object Extractor2:
10-
@experimental // FIXME ERROR
10+
@experimental // error
1111
def unapply(s: Any): Option[Int] = ???
1212

1313
def test: Unit =

0 commit comments

Comments
 (0)