@@ -162,37 +162,6 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
162162 else symd
163163 end transformSym
164164
165- /** If `tp` is an unboxed capturing type or a function returning an unboxed capturing type,
166- * convert it to be boxed.
167- */
168- private def box (tp : Type )(using Context ): Type =
169- def recur (tp : Type ): Type = tp.dealiasKeepAnnotsAndOpaques match
170- case tp @ CapturingType (parent, refs) =>
171- if tp.isBoxed || parent.derivesFrom(defn.Caps_CapSet ) then tp
172- else tp.boxed
173- case tp @ AnnotatedType (parent, ann) =>
174- if ann.symbol.isRetains && ! parent.derivesFrom(defn.Caps_CapSet )
175- then CapturingType (parent, ann.tree.toCaptureSet, boxed = true )
176- else tp.derivedAnnotatedType(box(parent), ann)
177- case tp1 @ AppliedType (tycon, args) if defn.isNonRefinedFunction(tp1) =>
178- val res = args.last
179- val boxedRes = recur(res)
180- if boxedRes eq res then tp
181- else tp1.derivedAppliedType(tycon, args.init :+ boxedRes)
182- case tp1 @ defn.RefinedFunctionOf (rinfo : MethodType ) =>
183- val boxedRinfo = recur(rinfo)
184- if boxedRinfo eq rinfo then tp
185- else boxedRinfo.toFunctionType(alwaysDependent = true )
186- case tp1 : MethodOrPoly =>
187- val res = tp1.resType
188- val boxedRes = recur(res)
189- if boxedRes eq res then tp
190- else tp1.derivedLambdaType(resType = boxedRes)
191- case _ => tp
192- tp match
193- case tp : MethodOrPoly => tp // don't box results of methods outside refinements
194- case _ => recur(tp)
195-
196165 private trait SetupTypeMap extends FollowAliasesMap :
197166 private var isTopLevel = true
198167
@@ -257,9 +226,9 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
257226 CapturingType (OrType (tp1, parent2, tp.isSoft), refs2, tp2.isBoxed)
258227 case tp @ AppliedType (tycon, args)
259228 if ! defn.isFunctionClass(tp.dealias.typeSymbol) && (tp.dealias eq tp) =>
260- tp.derivedAppliedType(tycon, args.mapConserve(box ))
229+ tp.derivedAppliedType(tycon, args.mapConserve(_.boxDeeply ))
261230 case tp : RealTypeBounds =>
262- tp.derivedTypeBounds(tp.lo, box( tp.hi) )
231+ tp.derivedTypeBounds(tp.lo, tp.hi.boxDeeply )
263232 case tp : LazyRef =>
264233 normalizeCaptures(tp.ref)
265234 case _ =>
@@ -542,7 +511,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
542511 if tree.isInferred
543512 then transformInferredType(tree.tpe)
544513 else transformExplicitType(tree.tpe, sym, freshen = ! boxed, tptToCheck = tree)
545- if boxed then transformed = box( transformed)
514+ if boxed then transformed = transformed.boxDeeply
546515 tree.setNuType(
547516 if sym.hasAnnotation(defn.UncheckedCapturesAnnot ) then makeUnchecked(transformed)
548517 else transformed)
@@ -612,7 +581,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
612581
613582 case tree @ SeqLiteral (elems, tpt : TypeTree ) =>
614583 traverse(elems)
615- tpt.setNuType(box( transformInferredType(tpt.tpe)) )
584+ tpt.setNuType(transformInferredType(tpt.tpe).boxDeeply )
616585
617586 case tree @ Try (body, catches, finalizer) =>
618587 val tryOwner = firstCanThrowEvidence(body) match
0 commit comments