@@ -294,7 +294,8 @@ class Namer { typer: Typer =>
294
294
295
295
val completer = tree match
296
296
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)
298
299
case _ => Completer (tree)(cctx)
299
300
val info = adjustIfModule(completer, tree)
300
301
createOrRefine[Symbol ](tree, name, flags, ctx.owner, _ => info,
@@ -1549,8 +1550,6 @@ class Namer { typer: Typer =>
1549
1550
case completer : Completer => completer.indexConstructor(constr, constrSym)
1550
1551
case _ =>
1551
1552
1552
- // constrSym.info = typeSig(constrSym)
1553
-
1554
1553
tempInfo = denot.asClass.classInfo.integrateOpaqueMembers.asInstanceOf [TempClassInfo ]
1555
1554
denot.info = savedInfo
1556
1555
}
@@ -1659,8 +1658,7 @@ class Namer { typer: Typer =>
1659
1658
case tp : MethodOrPoly => Method | Synthetic | Deferred | Tracked
1660
1659
case _ if name.isTermName => Synthetic | Deferred | Tracked
1661
1660
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
1664
1662
if refinedSyms.nonEmpty then
1665
1663
typr.println(i " parent refinement symbols: ${refinedSyms.toList}" )
1666
1664
original.pushAttachment(ParentRefinements , refinedSyms.toList)
@@ -1945,7 +1943,7 @@ class Namer { typer: Typer =>
1945
1943
// Add refinements for all tracked parameters to the result type.
1946
1944
for params <- ddef.termParamss; param <- params do
1947
1945
val psym = symbolOfTree(param)
1948
- if needsTracked(psym, param) then psym.setFlag(Tracked )
1946
+ if needsTracked(psym, param, sym ) then psym.setFlag(Tracked )
1949
1947
valOrDefDefSig(ddef, sym, paramSymss, wrapRefinedMethType)
1950
1948
else
1951
1949
valOrDefDefSig(ddef, sym, paramSymss, wrapMethType)
@@ -1999,24 +1997,28 @@ class Namer { typer: Typer =>
1999
1997
2000
1998
/** Try to infer if the parameter needs a `tracked` modifier
2001
1999
*/
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
2005
2010
&& (
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
2012
2013
)
2013
2014
2014
2015
/** Under x.modularity, we add `tracked` to context bound witnesses
2015
2016
* that have abstract type members
2016
2017
*/
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
2020
2022
2021
2023
extension (sym : Symbol )
2022
2024
def infoWithForceNonInferingCompleter (using Context ): Type = sym.infoOrCompleter match
@@ -2069,7 +2071,7 @@ class Namer { typer: Typer =>
2069
2071
def setTracked (param : ValDef )(using Context ): Unit =
2070
2072
val sym = symbolOfTree(param)
2071
2073
sym.maybeOwner.maybeOwner.infoOrCompleter match
2072
- case info : ClassInfo if needsTracked(sym, param) =>
2074
+ case info : ClassInfo if needsTracked(sym, param, sym.maybeOwner.maybeOwner ) =>
2073
2075
typr.println(i " set tracked $param, $sym: ${sym.info} containing ${sym.info.memberNames(abstractTypeNameFilter).toList}" )
2074
2076
for acc <- info.decls.lookupAll(sym.name) if acc.is(ParamAccessor ) do
2075
2077
acc.resetFlag(PrivateLocal )
0 commit comments