Skip to content

Commit f1d146d

Browse files
committed
Disallow tracked for unusupported definitions, move tracked modifier behind a flag, reemove debugs and add some more tests
1 parent 6465291 commit f1d146d

File tree

7 files changed

+29
-8
lines changed

7 files changed

+29
-8
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1481,6 +1481,10 @@ object desugar {
14811481
rhsOK(rhs)
14821482
}
14831483

1484+
val legalTracked: MemberDefTest = {
1485+
case ValDef(_, _, _) => true
1486+
}
1487+
14841488
def checkOpaqueAlias(tree: MemberDef)(using Context): MemberDef =
14851489
def check(rhs: Tree): MemberDef = rhs match
14861490
case bounds: TypeBoundsTree if bounds.alias.isEmpty =>
@@ -1506,6 +1510,7 @@ object desugar {
15061510
} else tested
15071511
tested = checkOpaqueAlias(tested)
15081512
tested = checkApplicable(Opaque, legalOpaque)
1513+
tested = checkApplicable(Tracked, legalTracked)
15091514
tested
15101515
case _ =>
15111516
tree

compiler/src/dotty/tools/dotc/parsing/Scanners.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ object Scanners {
212212

213213
def featureEnabled(name: TermName) = Feature.enabled(name)(using languageImportContext)
214214
def erasedEnabled = featureEnabled(Feature.erasedDefinitions)
215+
def trackedEnabled = featureEnabled(Feature.modularity)
215216

216217
private var postfixOpsEnabledCache = false
217218
private var postfixOpsEnabledCtx: Context = NoContext
@@ -1195,7 +1196,7 @@ object Scanners {
11951196

11961197
def isSoftModifier: Boolean =
11971198
token == IDENTIFIER
1198-
&& (softModifierNames.contains(name) || name == nme.erased && erasedEnabled)
1199+
&& (softModifierNames.contains(name) || name == nme.erased && erasedEnabled || name == nme.tracked && trackedEnabled)
11991200

12001201
def isSoftModifierInModifierPosition: Boolean =
12011202
isSoftModifier && inModifierPosition()

compiler/src/dotty/tools/dotc/parsing/Tokens.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ object Tokens extends TokensCommon {
297297

298298
final val closingParens = BitSet(RPAREN, RBRACKET, RBRACE)
299299

300-
final val softModifierNames = Set(nme.inline, nme.into, nme.opaque, nme.open, nme.transparent, nme.infix, nme.tracked)
300+
final val softModifierNames = Set(nme.inline, nme.into, nme.opaque, nme.open, nme.transparent, nme.infix)
301301

302302
def showTokenDetailed(token: Int): String = debugString(token)
303303

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,7 +1426,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
14261426
index(stats)
14271427
typedStats(stats, ctx.owner)
14281428

1429-
def typedBlock(tree: untpd.Block, pt: Type)(using Context): Tree = trace.force(i"typing block $tree, pt = $pt") {
1429+
def typedBlock(tree: untpd.Block, pt: Type)(using Context): Tree = {
14301430
val (stats1, exprCtx) = withoutMode(Mode.Pattern) {
14311431
typedBlockStats(tree.stats)
14321432
}
@@ -2411,7 +2411,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
24112411
else if ctx.reporter.errorsReported then UnspecifiedErrorType
24122412
else errorType(em"cannot infer type; expected type $pt is not fully defined", tree.srcPos))
24132413

2414-
def typedTypeTree(tree: untpd.TypeTree, pt: Type)(using Context): Tree = trace.force(s"typedTypeTree $tree: $pt") {
2414+
def typedTypeTree(tree: untpd.TypeTree, pt: Type)(using Context): Tree = {
24152415
tree match
24162416
case tree: untpd.DerivedTypeTree =>
24172417
tree.ensureCompletions
@@ -2821,7 +2821,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
28212821
case _ =>
28222822
typed(rhs)
28232823

2824-
def typedValDef(vdef: untpd.ValDef, sym: Symbol)(using Context): Tree = trace.force(i"typed val def $vdef, sym = $sym") {
2824+
def typedValDef(vdef: untpd.ValDef, sym: Symbol)(using Context): Tree = {
28252825
val ValDef(name, tpt, _) = vdef
28262826
checkNonRootName(vdef.name, vdef.nameSpan)
28272827
completeAnnotations(vdef, sym)
@@ -2847,7 +2847,6 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
28472847
if tpt.isEmpty then
28482848
sym.info = rhs.tpe
28492849

2850-
28512850
private def retractDefDef(sym: Symbol)(using Context): Tree =
28522851
// it's a discarded method (synthetic case class method or synthetic java record constructor or overridden member), drop it
28532852
val canBeInvalidated: Boolean =
@@ -3638,7 +3637,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
36383637
}
36393638

36403639
/** Typecheck and adapt tree, returning a typed tree. Parameters as for `typedUnadapted` */
3641-
def typed(tree: untpd.Tree, pt: Type, locked: TypeVars)(using Context): Tree = trace.force(i"typing $tree", typr) {
3640+
def typed(tree: untpd.Tree, pt: Type, locked: TypeVars)(using Context): Tree = {
36423641
trace(i"typing $tree, pt = $pt", typr, show = true) {
36433642
record(s"typed $getClass")
36443643
record("typed total")
@@ -3766,7 +3765,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
37663765
def typedExpr(tree: untpd.Tree, pt: Type = WildcardType)(using Context): Tree =
37673766
withoutMode(Mode.PatternOrTypeBits)(typed(tree, pt))
37683767

3769-
def typedType(tree: untpd.Tree, pt: Type = WildcardType, mapPatternBounds: Boolean = false)(using Context): Tree = trace.force(i"typing type $tree, pt = $pt") {
3768+
def typedType(tree: untpd.Tree, pt: Type = WildcardType, mapPatternBounds: Boolean = false)(using Context): Tree = {
37703769
val tree1 = withMode(Mode.Type) { typed(tree, pt) }
37713770
if mapPatternBounds && ctx.mode.is(Mode.Pattern) && !ctx.isAfterTyper then
37723771
tree1 match

tests/neg/abstract-tracked.check

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- [E156] Syntax Error: tests/neg/abstract-tracked.scala:4:14 ----------------------------------------------------------
2+
4 |tracked trait F: // error
3+
|^
4+
|Modifier tracked is not allowed for this definition
5+
5 | val x: Int

tests/neg/abstract-tracked.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import scala.language.experimental.modularity
2+
import scala.language.future
3+
4+
tracked trait F: // error
5+
val x: Int

tests/pos/abstract-tracked.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ trait F:
77
trait G:
88
tracked val y: Int
99

10+
trait H:
11+
tracked val z: Int = 3
12+
1013
object Test:
1114
// val f : F(1) /*: F { val x: 1 }*/ = new F:
1215
// val x: 1 = 1
1316
val f = new F:
1417
val x = 1
1518
val g = new G:
1619
val y: 2 = 2
20+
val h = new H:
21+
override val z = 4
1722

1823
summon[f.x.type <:< 1]
1924
summon[g.y.type <:< 2]
25+
summon[h.z.type <:< 4]

0 commit comments

Comments
 (0)