Skip to content

Commit 66722b9

Browse files
committed
Move implementation into TypeApplications etaExpandWithAsf
1 parent eabdf44 commit 66722b9

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,22 @@ class TypeApplications(val self: Type) extends AnyVal {
320320
}
321321
}
322322

323+
// Like `target.etaExpand(target.typeParams)`
324+
// except call `asSeenFrom` to fix class type parameter bounds
325+
// e.g. in pos/i18569:
326+
// given prefix `M2.type` and symbol `trait F`
327+
// the result of `prefix.select(sym)` is `M2.F`
328+
// however F's type parameter T is `<: M1#A` rather than `<: M2.A`
329+
// so add a call to `asSeenFrom` with prefix `M2.type` and owner `trait M1`
330+
def etaExpandWithAsf(prefix: Type, owner: Symbol)(using Context): Type =
331+
val tparams = self.typeParams
332+
HKTypeLambda(tparams.map(_.paramName))(
333+
tl => tparams.map {
334+
case p: Symbol => HKTypeLambda.toPInfo(tl.integrate(tparams, p.info.asSeenFrom(prefix, owner)))
335+
case p => HKTypeLambda.toPInfo(tl.integrate(tparams, p.paramInfo))
336+
},
337+
tl => tl.integrate(tparams, self.appliedTo(tparams.map(_.paramRef))))
338+
323339
/** Maps [Ts] => C[Ts] to C */
324340
def etaCollapse(using Context): Type = self match
325341
case EtaExpansion(classType) => classType

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

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,22 +1199,8 @@ class Namer { typer: Typer =>
11991199
if mbr.isType then
12001200
val forwarderName = checkNoConflict(alias.toTypeName, isPrivate = false, span)
12011201
var target = pathType.select(sym)
1202-
val tparams = target.typeParams
1203-
if tparams.nonEmpty then
1204-
// like `target = target.etaExpand(target.typeParams)`
1205-
// except call `asSeenFrom` to fix class type parameter bounds
1206-
// e.g. in pos/i18569:
1207-
// `Test#F` should have `M2.A` or `Test.A` as bounds, not `M1#A`.
1208-
target = HKTypeLambda(tparams.map(_.paramName))(
1209-
tl => tparams.map {
1210-
case p: Symbol =>
1211-
val info = p.info.asSeenFrom(pathType, sym.owner)
1212-
HKTypeLambda.toPInfo(tl.integrate(tparams, info))
1213-
case p =>
1214-
val info = p.paramInfo
1215-
HKTypeLambda.toPInfo(tl.integrate(tparams, info))
1216-
},
1217-
tl => tl.integrate(tparams, target.appliedTo(tparams.map(_.paramRef))))
1202+
if target.typeParams.nonEmpty then
1203+
target = target.etaExpandWithAsf(pathType, sym.owner)
12181204
newSymbol(
12191205
cls, forwarderName,
12201206
MandatoryExportTypeFlags | (sym.flags & RetainedExportTypeFlags),

0 commit comments

Comments
 (0)