Skip to content

Commit ee0c24e

Browse files
committed
Some condition reorder fixes related to infering tracked
1 parent 2e0be2d commit ee0c24e

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

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

+21-19
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ class Namer { typer: Typer =>
294294

295295
val completer = tree match
296296
case tree: TypeDef => TypeDefCompleter(tree)(cctx)
297-
case tree: ValOrDefDef if isNonInferingTree(tree) => NonInferingCompleter(tree)(cctx)
297+
case tree: ValOrDefDef if Feature.enabled(Feature.modularity) && isNonInferingTree(tree) =>
298+
NonInferingCompleter(tree)(cctx)
298299
case _ => Completer(tree)(cctx)
299300
val info = adjustIfModule(completer, tree)
300301
createOrRefine[Symbol](tree, name, flags, ctx.owner, _ => info,
@@ -1549,8 +1550,6 @@ class Namer { typer: Typer =>
15491550
case completer: Completer => completer.indexConstructor(constr, constrSym)
15501551
case _ =>
15511552

1552-
// constrSym.info = typeSig(constrSym)
1553-
15541553
tempInfo = denot.asClass.classInfo.integrateOpaqueMembers.asInstanceOf[TempClassInfo]
15551554
denot.info = savedInfo
15561555
}
@@ -1659,8 +1658,7 @@ class Namer { typer: Typer =>
16591658
case tp: MethodOrPoly => Method | Synthetic | Deferred | Tracked
16601659
case _ if name.isTermName => Synthetic | Deferred | Tracked
16611660
case _ => Synthetic | Deferred
1662-
val s = newSymbol(cls, name, flags, tp, coord = original.rhs.span.startPos).entered
1663-
refinedSyms += s
1661+
refinedSyms += newSymbol(cls, name, flags, tp, coord = original.rhs.span.startPos).entered
16641662
if refinedSyms.nonEmpty then
16651663
typr.println(i"parent refinement symbols: ${refinedSyms.toList}")
16661664
original.pushAttachment(ParentRefinements, refinedSyms.toList)
@@ -1945,7 +1943,7 @@ class Namer { typer: Typer =>
19451943
// Add refinements for all tracked parameters to the result type.
19461944
for params <- ddef.termParamss; param <- params do
19471945
val psym = symbolOfTree(param)
1948-
if needsTracked(psym, param) then psym.setFlag(Tracked)
1946+
if needsTracked(psym, param, sym) then psym.setFlag(Tracked)
19491947
valOrDefDefSig(ddef, sym, paramSymss, wrapRefinedMethType)
19501948
else
19511949
valOrDefDefSig(ddef, sym, paramSymss, wrapMethType)
@@ -1999,24 +1997,28 @@ class Namer { typer: Typer =>
19991997

20001998
/** Try to infer if the parameter needs a `tracked` modifier
20011999
*/
2002-
def needsTracked(sym: Symbol, param: ValDef)(using Context) =
2003-
!sym.is(Tracked)
2004-
&& sym.isTerm
2000+
def needsTracked(psym: Symbol, param: ValDef, owningSym: Symbol)(using Context) =
2001+
lazy val abstractContextBound = isContextBoundWitnessWithAbstractMembers(psym, param, owningSym)
2002+
lazy val isRefInSignatures =
2003+
psym.maybeOwner.isPrimaryConstructor
2004+
// && !psym.flags.is(Synthetic)
2005+
// && !psym.maybeOwner.flags.is(Synthetic)
2006+
// && !psym.maybeOwner.maybeOwner.flags.is(Synthetic)
2007+
&& isReferencedInPublicSignatures(psym)
2008+
!psym.is(Tracked)
2009+
&& psym.isTerm
20052010
&& (
2006-
isContextBoundWitnessWithAbstractMembers(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)
2011+
abstractContextBound
2012+
|| isRefInSignatures
20122013
)
20132014

20142015
/** Under x.modularity, we add `tracked` to context bound witnesses
20152016
* that have abstract type members
20162017
*/
2017-
def isContextBoundWitnessWithAbstractMembers(sym: Symbol, param: ValDef)(using Context): Boolean =
2018-
param.hasAttachment(ContextBoundParam)
2019-
&& sym.info.memberNames(abstractTypeNameFilter).nonEmpty
2018+
def isContextBoundWitnessWithAbstractMembers(psym: Symbol, param: ValDef, owningSym: Symbol)(using Context): Boolean =
2019+
(owningSym.isClass || owningSym.isAllOf(Given | Method))
2020+
&& param.hasAttachment(ContextBoundParam)
2021+
&& psym.info.memberNames(abstractTypeNameFilter).nonEmpty
20202022

20212023
extension (sym: Symbol)
20222024
def infoWithForceNonInferingCompleter(using Context): Type = sym.infoOrCompleter match
@@ -2069,7 +2071,7 @@ class Namer { typer: Typer =>
20692071
def setTracked(param: ValDef)(using Context): Unit =
20702072
val sym = symbolOfTree(param)
20712073
sym.maybeOwner.maybeOwner.infoOrCompleter match
2072-
case info: ClassInfo if needsTracked(sym, param) =>
2074+
case info: ClassInfo if needsTracked(sym, param, sym.maybeOwner.maybeOwner) =>
20732075
typr.println(i"set tracked $param, $sym: ${sym.info} containing ${sym.info.memberNames(abstractTypeNameFilter).toList}")
20742076
for acc <- info.decls.lookupAll(sym.name) if acc.is(ParamAccessor) do
20752077
acc.resetFlag(PrivateLocal)

0 commit comments

Comments
 (0)