Skip to content

Commit 350dfa7

Browse files
committed
Remove erasure logic from ContextFunctionType
1 parent 4c77f62 commit 350dfa7

File tree

2 files changed

+16
-20
lines changed

2 files changed

+16
-20
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,17 +1879,14 @@ class Definitions {
18791879
*/
18801880
object ContextFunctionType:
18811881
def unapply(tp: Type)(using Context): Option[(List[Type], Type, List[Boolean])] =
1882-
if ctx.erasedTypes then
1883-
atPhase(erasurePhase)(unapply(tp))
1884-
else
1885-
asContextFunctionType(tp) match
1886-
case PolyFunctionOf(mt: MethodType) =>
1887-
Some((mt.paramInfos, mt.resType, mt.erasedParams))
1888-
case tp1 if tp1.exists =>
1889-
val args = tp1.functionArgInfos
1890-
val erasedParams = List.fill(functionArity(tp1)) { false }
1891-
Some((args.init, args.last, erasedParams))
1892-
case _ => None
1882+
asContextFunctionType(tp) match
1883+
case PolyFunctionOf(mt: MethodType) =>
1884+
Some((mt.paramInfos, mt.resType, mt.erasedParams))
1885+
case tp1 if tp1.exists =>
1886+
val args = tp1.functionArgInfos
1887+
val erasedParams = List.fill(functionArity(tp1)) { false }
1888+
Some((args.init, args.last, erasedParams))
1889+
case _ => None
18931890

18941891
/** A whitelist of Scala-2 classes that are known to be pure */
18951892
def isAssuredNoInits(sym: Symbol): Boolean =

compiler/src/dotty/tools/dotc/transform/Bridges.scala

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -129,25 +129,24 @@ class Bridges(root: ClassSymbol, thisPhase: DenotTransformer)(using Context) {
129129
assert(ctx.typer.isInstanceOf[Erasure.Typer])
130130
ctx.typer.typed(untpd.cpy.Apply(ref)(ref, args), member.info.finalResultType)
131131
else
132-
val defn.ContextFunctionType(argTypes, resType, erasedParams) = tp: @unchecked
133-
val anonFun = newAnonFun(ctx.owner,
134-
MethodType(
135-
argTypes.zip(erasedParams.padTo(argTypes.length, false))
136-
.flatMap((t, e) => if e then None else Some(t)),
137-
resType),
138-
coord = ctx.owner.coord)
132+
val mtWithoutErasedParams = atPhase(erasurePhase) {
133+
val defn.ContextFunctionType(argTypes, resType, erasedParams) = tp.dealias: @unchecked
134+
val paramInfos = argTypes.zip(erasedParams).collect { case (argType, erased) if !erased => argType }
135+
MethodType(paramInfos, resType)
136+
}
137+
val anonFun = newAnonFun(ctx.owner, mtWithoutErasedParams, coord = ctx.owner.coord)
139138
anonFun.info = transformInfo(anonFun, anonFun.info)
140139

141140
def lambdaBody(refss: List[List[Tree]]) =
142141
val refs :: Nil = refss: @unchecked
143142
val expandedRefs = refs.map(_.withSpan(ctx.owner.span.endPos)) match
144143
case (bunchedParam @ Ident(nme.ALLARGS)) :: Nil =>
145-
argTypes.indices.toList.map(n =>
144+
mtWithoutErasedParams.paramInfos.indices.toList.map(n =>
146145
bunchedParam
147146
.select(nme.primitive.arrayApply)
148147
.appliedTo(Literal(Constant(n))))
149148
case refs1 => refs1
150-
expand(args ::: expandedRefs, resType, n - 1)(using ctx.withOwner(anonFun))
149+
expand(args ::: expandedRefs, mtWithoutErasedParams.resType, n - 1)(using ctx.withOwner(anonFun))
151150

152151
val unadapted = Closure(anonFun, lambdaBody)
153152
cpy.Block(unadapted)(unadapted.stats,

0 commit comments

Comments
 (0)