@@ -1791,6 +1791,7 @@ class Namer { typer: Typer =>
1791
1791
sym.owner.typeParams.foreach(_.ensureCompleted())
1792
1792
completeTrailingParamss(constr, sym, indexingCtor = true )
1793
1793
if Feature .enabled(modularity) then
1794
+ // println(i"[indexConstructor] Checking if params of $constr need tracked")
1794
1795
constr.termParamss.foreach(_.foreach(setTracked))
1795
1796
1796
1797
/** The signature of a module valdef.
@@ -1931,22 +1932,26 @@ class Namer { typer: Typer =>
1931
1932
def wrapRefinedMethType (restpe : Type ): Type =
1932
1933
wrapMethType(addParamRefinements(restpe, paramSymss))
1933
1934
1935
+ def addTrackedIfNeeded (ddef : DefDef , owningSym : Symbol ): Boolean =
1936
+ var wasSet = false
1937
+ for params <- ddef.termParamss; param <- params do
1938
+ val psym = symbolOfTree(param)
1939
+ if needsTracked(psym, param, owningSym) then
1940
+ psym.setFlag(Tracked )
1941
+ wasSet = true
1942
+ wasSet
1943
+
1944
+ if Feature .enabled(modularity) then addTrackedIfNeeded(ddef, sym.maybeOwner)
1945
+
1934
1946
if isConstructor then
1935
1947
// set result type tree to unit, but take the current class as result type of the symbol
1936
1948
typedAheadType(ddef.tpt, defn.UnitType )
1937
1949
val mt = wrapMethType(effectiveResultType(sym, paramSymss))
1938
1950
if sym.isPrimaryConstructor then checkCaseClassParamDependencies(mt, sym.owner)
1939
1951
mt
1940
- else if Feature .enabled(modularity) then
1941
- // set every context bound evidence parameter of a given companion method
1942
- // to be tracked, provided it has a type that has an abstract type member.
1943
- // Add refinements for all tracked parameters to the result type.
1944
- for params <- ddef.termParamss; param <- params do
1945
- val psym = symbolOfTree(param)
1946
- if needsTracked(psym, param, sym) then psym.setFlag(Tracked )
1947
- valOrDefDefSig(ddef, sym, paramSymss, wrapRefinedMethType)
1948
1952
else
1949
- valOrDefDefSig(ddef, sym, paramSymss, wrapMethType)
1953
+ val paramFn = if Feature .enabled(Feature .modularity) && sym.isAllOf(Given | Method ) then wrapRefinedMethType else wrapMethType
1954
+ valOrDefDefSig(ddef, sym, paramSymss, paramFn)
1950
1955
end defDefSig
1951
1956
1952
1957
/** Complete the trailing parameters of a DefDef,
@@ -1998,6 +2003,7 @@ class Namer { typer: Typer =>
1998
2003
/** Try to infer if the parameter needs a `tracked` modifier
1999
2004
*/
2000
2005
def needsTracked (psym : Symbol , param : ValDef , owningSym : Symbol )(using Context ) =
2006
+ // println(i"Checking if $psym needs tracked")
2001
2007
lazy val abstractContextBound = isContextBoundWitnessWithAbstractMembers(psym, param, owningSym)
2002
2008
lazy val isRefInSignatures =
2003
2009
psym.maybeOwner.isPrimaryConstructor
@@ -2071,8 +2077,9 @@ class Namer { typer: Typer =>
2071
2077
def setTracked (param : ValDef )(using Context ): Unit =
2072
2078
val sym = symbolOfTree(param)
2073
2079
sym.maybeOwner.maybeOwner.infoOrCompleter match
2074
- case info : ClassInfo if needsTracked(sym, param, sym.maybeOwner.maybeOwner) =>
2075
- typr.println(i " set tracked $param, $sym: ${sym.info} containing ${sym.info.memberNames(abstractTypeNameFilter).toList}" )
2080
+ case info : ClassInfo
2081
+ if ! sym.is(Tracked ) && isContextBoundWitnessWithAbstractMembers(sym, param, sym.maybeOwner.maybeOwner) =>
2082
+ typr.println(i " set tracked $param, $sym: ${sym.info}" )
2076
2083
for acc <- info.decls.lookupAll(sym.name) if acc.is(ParamAccessor ) do
2077
2084
acc.resetFlag(PrivateLocal )
2078
2085
acc.setFlag(Tracked )
0 commit comments