Skip to content

Commit e89f4a0

Browse files
committed
No longer eagerly evaluate calleeType/calleeIsErased
1 parent 52ec016 commit e89f4a0

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,7 +1444,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
14441444
NoType
14451445
}
14461446

1447-
val calleeIsErased = calleeType.widen match {
1447+
lazy val calleeIsErased = calleeType.widen match {
14481448
case mt: MethodType if mt.isErasedMethod =>
14491449
val companion = mt.companion.asInstanceOf[ErasedMethodCompanion]
14501450
params.map(p => companion.isErased(paramIndex(p.name)))
@@ -1466,7 +1466,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
14661466

14671467
/** Returns the type and whether the parameter is erased */
14681468
def protoFormal(i: Int): (Type, Boolean) =
1469-
if (protoFormals.length == params.length) (protoFormals(i), calleeIsErased(i) || isDefinedErased(i))
1469+
if (protoFormals.length == params.length) (protoFormals(i), isDefinedErased(i))
14701470
else (errorType(WrongNumberOfParameters(protoFormals.length), tree.srcPos), isDefinedErased(i))
14711471

14721472
/** Is `formal` a product type which is elementwise compatible with `params`? */
@@ -1504,21 +1504,23 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
15041504
val inferredParams: List[untpd.ValDef] =
15051505
for ((param, i) <- params.zipWithIndex) yield
15061506
val (formal, isErased) = protoFormal(i)
1507-
val param0 =
1508-
if (!param.tpt.isEmpty) param
1507+
val (param0, isErased1) =
1508+
if (!param.tpt.isEmpty) (param, false)
15091509
else
15101510
val knownFormal = isFullyDefined(formal, ForceDegree.failBottom)
1511-
val paramType =
1512-
if knownFormal then formal
1513-
else inferredFromTarget(param, formal, calleeType, paramIndex)
1514-
.orElse(errorType(AnonymousFunctionMissingParamType(param, tree, formal), param.srcPos))
1511+
val (paramType, isErased1) =
1512+
if knownFormal then (formal, false)
1513+
else
1514+
val tpe = inferredFromTarget(param, formal, calleeType, paramIndex)
1515+
.orElse(errorType(AnonymousFunctionMissingParamType(param, tree, formal), param.srcPos))
1516+
(tpe, calleeIsErased(i))
15151517
val paramTpt = untpd.TypedSplice(
15161518
(if knownFormal then InferredTypeTree() else untpd.TypeTree())
15171519
.withType(paramType.translateFromRepeated(toArray = false))
15181520
.withSpan(param.span.endPos)
15191521
)
1520-
cpy.ValDef(param)(tpt = paramTpt)
1521-
if isErased then param0.withAddedFlags(Flags.Erased) else param0
1522+
(cpy.ValDef(param)(tpt = paramTpt), isErased1)
1523+
if isErased || isErased1 then param0.withAddedFlags(Flags.Erased) else param0
15221524
desugared = desugar.makeClosure(inferredParams, fnBody, resultTpt, isContextual, tree.span)
15231525

15241526
typed(desugared, pt)

0 commit comments

Comments
 (0)