Skip to content

Commit 2e0be2d

Browse files
committed
Add non-infering completers for infering tracked
1 parent a44e0ba commit 2e0be2d

File tree

3 files changed

+23
-18
lines changed

3 files changed

+23
-18
lines changed

compiler/src/dotty/tools/dotc/config/Feature.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ object Feature:
111111
* feature is defined.
112112
*/
113113
def enabled(feature: TermName)(using Context): Boolean =
114-
enabledBySetting(feature) || enabledByImport(feature) || feature == modularity
114+
enabledBySetting(feature) || enabledByImport(feature)
115115

116116
/** Is auto-tupling enabled? */
117117
def autoTuplingEnabled(using Context): Boolean = !enabled(nme.noAutoTupling)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2756,6 +2756,9 @@ object SymDenotations {
27562756
/** Sets all missing fields of given denotation */
27572757
def complete(denot: SymDenotation)(using Context): Unit
27582758

2759+
/** Is this a completer for an explicit type tree */
2760+
def isNonInfering: Boolean = false
2761+
27592762
def apply(sym: Symbol): LazyType = this
27602763
def apply(module: TermSymbol, modcls: ClassSymbol): LazyType = this
27612764

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

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,9 @@ class Namer { typer: Typer =>
278278
if rhs.isEmpty || flags.is(Opaque) then flags |= Deferred
279279
if flags.is(Param) then tree.rhs else analyzeRHS(tree.rhs)
280280

281+
def isNonInferingTree(tree: ValOrDefDef): Boolean =
282+
!tree.tpt.isEmpty || tree.mods.isOneOf(TermParamOrAccessor)
283+
281284
// to complete a constructor, move one context further out -- this
282285
// is the context enclosing the class. Note that the context in which a
283286
// constructor is recorded and the context in which it is completed are
@@ -291,6 +294,7 @@ class Namer { typer: Typer =>
291294

292295
val completer = tree match
293296
case tree: TypeDef => TypeDefCompleter(tree)(cctx)
297+
case tree: ValOrDefDef if isNonInferingTree(tree) => NonInferingCompleter(tree)(cctx)
294298
case _ => Completer(tree)(cctx)
295299
val info = adjustIfModule(completer, tree)
296300
createOrRefine[Symbol](tree, name, flags, ctx.owner, _ => info,
@@ -1736,6 +1740,10 @@ class Namer { typer: Typer =>
17361740
}
17371741
}
17381742

1743+
class NonInferingCompleter(original: ValOrDefDef)(ictx: Context) extends Completer(original)(ictx) {
1744+
override def isNonInfering: Boolean = true
1745+
}
1746+
17391747
/** Possible actions to perform when deciding on a forwarder for a member */
17401748
private enum CanForward:
17411749
case Yes
@@ -1994,14 +2002,13 @@ class Namer { typer: Typer =>
19942002
def needsTracked(sym: Symbol, param: ValDef)(using Context) =
19952003
!sym.is(Tracked)
19962004
&& sym.isTerm
1997-
&& sym.maybeOwner.isPrimaryConstructor
1998-
// && !sym.flags.is(Synthetic)
1999-
// && !sym.maybeOwner.flags.is(Synthetic)
2000-
&& !sym.maybeOwner.maybeOwner.flags.is(Synthetic)
20012005
&& (
20022006
isContextBoundWitnessWithAbstractMembers(sym, param)
2003-
|| isReferencedInPublicSignatures(sym)
2004-
|| isPassedToTrackedParentParameter(sym, param)
2007+
|| sym.maybeOwner.isPrimaryConstructor
2008+
// && !sym.flags.is(Synthetic)
2009+
// && !sym.maybeOwner.flags.is(Synthetic)
2010+
// && !sym.maybeOwner.maybeOwner.flags.is(Synthetic)
2011+
&& isReferencedInPublicSignatures(sym)
20052012
)
20062013

20072014
/** Under x.modularity, we add `tracked` to context bound witnesses
@@ -2011,6 +2018,11 @@ class Namer { typer: Typer =>
20112018
param.hasAttachment(ContextBoundParam)
20122019
&& sym.info.memberNames(abstractTypeNameFilter).nonEmpty
20132020

2021+
extension (sym: Symbol)
2022+
def infoWithForceNonInferingCompleter(using Context): Type = sym.infoOrCompleter match
2023+
case tpe: LazyType if tpe.isNonInfering => sym.info
2024+
case info => info
2025+
20142026
/** Under x.modularity, we add `tracked` to term parameters whose types are referenced
20152027
* in public signatures of the defining class
20162028
*/
@@ -2022,20 +2034,10 @@ class Namer { typer: Typer =>
20222034
case info: ClassInfo =>
20232035
info.decls.filter(_.isTerm).filter(_.isPublic)
20242036
.filter(_ != sym.maybeOwner)
2025-
.exists(d => tpeContainsSymbolRef(d.info, accessorSyms))
2037+
.exists(d => tpeContainsSymbolRef(d.infoWithForceNonInferingCompleter, accessorSyms))
20262038
case _ => false
20272039
checkOwnerMemberSignatures(owner)
20282040

2029-
def isPassedToTrackedParentParameter(sym: Symbol, param: ValDef)(using Context): Boolean =
2030-
// TODO(kπ) Add tracked if the param is passed as a tracked arg in parent. Can we touch the inheritance terms?
2031-
val owner = sym.maybeOwner.maybeOwner
2032-
val accessorSyms = maybeParamAccessors(owner, sym)
2033-
owner.infoOrCompleter match
2034-
// case info: ClassInfo =>
2035-
// info.parents.foreach(println)
2036-
// info.parents.exists(tpeContainsSymbolRef(_, accessorSyms))
2037-
case _ => false
2038-
20392041
private def namedTypeWithPrefixContainsSymbolRef(tpe: Type, syms: List[Symbol])(using Context): Boolean = tpe match
20402042
case tpe: NamedType => tpe.prefix.exists && tpeContainsSymbolRef(tpe.prefix, syms)
20412043
case _ => false

0 commit comments

Comments
 (0)