@@ -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