Skip to content

Commit a261521

Browse files
Create helper methods for inline trait rewriting
1 parent 29aeb86 commit a261521

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

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

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,24 +71,10 @@ class Inlining extends MacroTransform, SymTransformer {
7171
def transformInlineTrait(inlineTrait: TypeDef)(using Context): TypeDef =
7272
val tpd.TypeDef(_, tmpl: Template) = inlineTrait: @unchecked
7373
val body1 = tmpl.body.flatMap {
74-
case innerClass @ tpd.TypeDef(name, tmpl1: Template) =>
75-
val newTrait = cpy.TypeDef(innerClass)(name = newInnerClassName(name))
76-
val upperBound = innerClass.symbol.primaryConstructor.info match {
77-
case _: MethodType =>
78-
newTrait.symbol.typeRef
79-
case poly: PolyType =>
80-
HKTypeLambda(poly.paramNames)(tl => poly.paramInfos, tl => newTrait.symbol.typeRef.appliedTo(tl.paramRefs.head))
81-
}
82-
val newTypeSym = newSymbol(
83-
owner = inlineTrait.symbol,
84-
name = name.asTypeName,
85-
flags = innerClass.symbol.flags & (Private | Protected),
86-
info = TypeBounds.upper(upperBound),
87-
privateWithin = innerClass.symbol.privateWithin,
88-
coord = innerClass.symbol.coord,
89-
nestingLevel = innerClass.symbol.nestingLevel,
90-
).asType
91-
List(newTrait, TypeDef(newTypeSym))
74+
case innerClass: TypeDef if innerClass.symbol.isClass =>
75+
val newTrait = makeTraitFromInnerClass(innerClass)
76+
val newType = makeTypeFromInnerClass(inlineTrait.symbol, innerClass, newTrait.symbol)
77+
List(newTrait, newType)
9278
case member: MemberDef =>
9379
List(member)
9480
case _ =>
@@ -97,6 +83,28 @@ class Inlining extends MacroTransform, SymTransformer {
9783
val tmpl1 = cpy.Template(tmpl)(body = body1)
9884
cpy.TypeDef(inlineTrait)(rhs = tmpl1)
9985

86+
private def makeTraitFromInnerClass(innerClass: TypeDef)(using Context): TypeDef =
87+
cpy.TypeDef(innerClass)(name = newInnerClassName(innerClass.name))
88+
89+
private def makeTypeFromInnerClass(parentSym: Symbol, innerClass: TypeDef, newTraitSym: Symbol)(using Context): TypeDef =
90+
val upperBound = innerClass.symbol.primaryConstructor.info match {
91+
case _: MethodType =>
92+
newTraitSym.typeRef
93+
case poly: PolyType =>
94+
HKTypeLambda(poly.paramNames)(tl => poly.paramInfos, tl => newTraitSym.typeRef.appliedTo(tl.paramRefs.head))
95+
}
96+
val newTypeSym = newSymbol(
97+
owner = parentSym,
98+
name = newTraitSym.name.asTypeName,
99+
flags = innerClass.symbol.flags & (Private | Protected),
100+
info = TypeBounds.upper(upperBound),
101+
privateWithin = innerClass.symbol.privateWithin,
102+
coord = innerClass.symbol.coord,
103+
nestingLevel = innerClass.symbol.nestingLevel,
104+
).asType
105+
TypeDef(newTypeSym)
106+
end makeTypeFromInnerClass
107+
100108
private class InliningTreeMap extends TreeMapWithImplicits {
101109

102110
/** List of top level classes added by macro annotation in a package object.

0 commit comments

Comments
 (0)