Skip to content

Commit f31b6c4

Browse files
Adapt body of child to point to inlined members
1 parent 117d800 commit f31b6c4

File tree

1 file changed

+39
-6
lines changed

1 file changed

+39
-6
lines changed

compiler/src/dotty/tools/dotc/inlines/Inlines.scala

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,17 @@ object Inlines:
215215
cls match {
216216
case cls @ tpd.TypeDef(_, impl: Template) =>
217217
val clsOverriddenSyms = cls.symbol.info.decls.toList.flatMap(_.allOverriddenSymbols).toSet
218-
val inlineDefs = inlineTraitAncestors(cls).foldLeft(List.empty[Tree])(
219-
(defs, parent) =>
220-
val overriddenSymbols = clsOverriddenSyms ++ defs.flatMap(_.symbol.allOverriddenSymbols)
221-
defs ::: InlineParentTrait(parent)(using ctx.withOwner(cls.symbol)).expandDefs(overriddenSymbols)
222-
)
223-
val impl1 = cpy.Template(impl)(body = inlineDefs ::: impl.body)
218+
val newDefs = inContext(ctx.withOwner(cls.symbol)) {
219+
inlineTraitAncestors(cls).foldLeft((List.empty[Tree], impl.body)){
220+
case ((inlineDefs, childDefs), parent) =>
221+
val parentTraitInliner = InlineParentTrait(parent)
222+
val overriddenSymbols = clsOverriddenSyms ++ inlineDefs.flatMap(_.symbol.allOverriddenSymbols)
223+
val inlinedDefs1 = inlineDefs ::: parentTraitInliner.expandDefs(overriddenSymbols)
224+
val childDefs1 = parentTraitInliner.adaptDefs(childDefs) // TODO do this outside of inlining: we need to adapt ALL references to inlined stuff
225+
(inlinedDefs1, childDefs1)
226+
}
227+
}
228+
val impl1 = cpy.Template(impl)(body = newDefs._1 ::: newDefs._2)
224229
cpy.TypeDef(cls)(rhs = impl1)
225230
case _ =>
226231
cls
@@ -540,6 +545,8 @@ object Inlines:
540545
}
541546
end expandDefs
542547

548+
def adaptDefs(definitions: List[Tree]): List[Tree] = definitions.mapconserve(defsAdapter(_))
549+
543550
protected class InlineTraitTypeMap extends InlinerTypeMap {
544551
override def apply(t: Type) = super.apply(t) match {
545552
case t: ThisType if t.cls == parentSym => childThisType
@@ -698,6 +705,32 @@ object Inlines:
698705
// TODO make version of inlined that does not return bindings?
699706
Inlined(tpd.ref(parentSym), Nil, inlined(rhs)._2).withSpan(parent.span)
700707

708+
private val defsAdapter =
709+
val typeMap = new DeepTypeMap {
710+
override def apply(tp: Type): Type = tp match {
711+
case TypeRef(_, sym: Symbol) if innerClassNewSyms.contains(sym) =>
712+
TypeRef(childThisType, innerClassNewSyms(sym))
713+
case _ =>
714+
mapOver(tp)
715+
}
716+
}
717+
def treeMap(tree: Tree) = tree match {
718+
case ident: Ident if innerClassNewSyms.contains(ident.symbol) =>
719+
Ident(innerClassNewSyms(ident.symbol).namedType)
720+
case tdef: TypeDef if tdef.symbol.isClass =>
721+
tdef.symbol.info = typeMap(tdef.symbol.info)
722+
tdef
723+
case tree =>
724+
tree
725+
}
726+
new TreeTypeMap(
727+
typeMap = typeMap,
728+
treeMap = treeMap,
729+
substFrom = substFrom,
730+
substTo = substTo,
731+
)
732+
end defsAdapter
733+
701734
private class ParamAccessorsMapper:
702735
private val paramAccessorsTrees: mutable.Map[Symbol, Map[Name, Tree]] = mutable.Map.empty
703736
private val paramAccessorsNewNames: mutable.Map[(Symbol, Name), Name] = mutable.Map.empty

0 commit comments

Comments
 (0)