Skip to content

Commit c01f86f

Browse files
committed
Drop case distinction on newScheme
1 parent 5abd5c5 commit c01f86f

File tree

1 file changed

+17
-36
lines changed

1 file changed

+17
-36
lines changed

compiler/src/dotty/tools/dotc/cc/CheckCaptures.scala

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -911,62 +911,43 @@ class CheckCaptures extends Recheck, SymTransformer:
911911
override def recheckClosureBlock(mdef: DefDef, expr: Closure, pt: Type)(using Context): Type =
912912
val anonfun = mdef.symbol
913913

914-
def matchParams(paramss: List[ParamClause], pt: Type): Unit =
914+
def matchParamsAndResult(paramss: List[ParamClause], pt: Type): Unit =
915915
//println(i"match $mdef against $pt")
916916
paramss match
917917
case params :: paramss1 => pt match
918918
case defn.PolyFunctionOf(poly: PolyType) =>
919919
assert(params.hasSameLengthAs(poly.paramInfos))
920-
matchParams(paramss1, poly.instantiate(params.map(_.symbol.typeRef)))
920+
matchParamsAndResult(paramss1, poly.instantiate(params.map(_.symbol.typeRef)))
921921
case FunctionOrMethod(argTypes, resType) =>
922922
assert(params.hasSameLengthAs(argTypes), i"$mdef vs $pt, ${params}")
923923
for (argType, param) <- argTypes.lazyZip(params) do
924924
val paramTpt = param.asInstanceOf[ValDef].tpt
925925
val paramType = freshToCap(paramTpt.nuType)
926926
checkConformsExpr(argType, paramType, param)
927927
.showing(i"compared expected closure formal $argType against $param with ${paramTpt.nuType}", capt)
928-
if ccConfig.newScheme then
929-
if resType.isValueType && isFullyDefined(resType, ForceDegree.none) then
930-
val localResType = pt match
931-
case RefinedType(_, _, mt: MethodType) =>
932-
inContext(ctx.withOwner(anonfun)):
933-
Internalize(mt)(resType)
934-
case _ => resType
935-
mdef.tpt.updNuType(localResType)
936-
// Make sure we affect the info of the anonfun by the previous updNuType
937-
// unless the info is already defined in a previous phase and does not change.
938-
assert(!anonfun.isCompleted || anonfun.denot.validFor.firstPhaseId != thisPhase.id)
939-
//println(i"updating ${mdef.tpt} to $localResType/${mdef.tpt.nuType}")
940-
else if !pt.isInstanceOf[RefinedType]
941-
&& !(isEtaExpansion(mdef) && ccConfig.handleEtaExpansionsSpecially)
942-
then
943-
// If the closure is not an eta expansion and the expected type is a parametric
944-
// function type, check whether the closure's result conforms to the expected
945-
// result type. This constrains parameter types of the closure which can give better
946-
// error messages. It also prevents mapping fresh to result caps in the closure's
947-
// result type.
948-
// If the closure is an eta expanded method reference it's better to not constrain
949-
// its internals early since that would give error messages in generated code
950-
// which are less intelligible. An example is the line `a = x` in
951-
// neg-custom-args/captures/vars.scala. That's why this code is conditioned.
952-
// to apply only to closures that are not eta expansions.
953-
assert(paramss1.isEmpty)
954-
capt.println(i"pre-check closure $expr of type ${mdef.tpt.nuType} against $resType")
955-
checkConformsExpr(mdef.tpt.nuType, resType, expr)
928+
if resType.isValueType && isFullyDefined(resType, ForceDegree.none) then
929+
val localResType = pt match
930+
case RefinedType(_, _, mt: MethodType) =>
931+
inContext(ctx.withOwner(anonfun)):
932+
Internalize(mt)(resType)
933+
case _ => resType
934+
mdef.tpt.updNuType(localResType)
935+
// Make sure we affect the info of the anonfun by the previous updNuType
936+
// unless the info is already defined in a previous phase and does not change.
937+
assert(!anonfun.isCompleted || anonfun.denot.validFor.firstPhaseId != thisPhase.id)
938+
//println(i"updating ${mdef.tpt} to $localResType/${mdef.tpt.nuType}")
956939
case _ =>
957940
case Nil =>
958941

959942
openClosures = (anonfun, pt) :: openClosures
960943
// openClosures is needed for errors but currently makes no difference
961944
// TODO follow up on this
962945
try
963-
matchParams(mdef.paramss, pt)
946+
matchParamsAndResult(mdef.paramss, pt)
964947
capt.println(i"recheck closure block $mdef: ${anonfun.infoOrCompleter}")
965-
if !anonfun.isCompleted then
966-
anonfun.ensureCompleted() // this will recheck def
967-
else
968-
recheckDef(mdef, anonfun)
969-
948+
if !anonfun.isCompleted
949+
then anonfun.ensureCompleted() // this will recheck def
950+
else recheckDef(mdef, anonfun)
970951
recheckClosure(expr, pt, forceDependent = true)
971952
finally
972953
openClosures = openClosures.tail

0 commit comments

Comments
 (0)