Skip to content

Commit 79c38ca

Browse files
committed
WIP support private inline trait members
1 parent 54e6959 commit 79c38ca

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,21 @@ object InlineTraits:
4141
else inlinedSymbolValOrDef(cls, sym, traitTargs)
4242
end inlinedMemberSymbols
4343

44+
def inlinedPrivateMemberSymbols(cls: ClassSymbol)(using Context): List[Symbol] =
45+
assert(!cls.isInlineTrait, cls)
46+
println(" ")
47+
for
48+
parent <- cls.info.parents
49+
parentSym = parent.typeSymbol
50+
if parentSym.isAllOf(InlineTrait)
51+
sym <- parentSym.info.decls.toList
52+
if sym.isTerm && sym.is(Private)
53+
yield
54+
val traitTargs = parentTargs(cls, sym)
55+
inlinedSymbolPrivateValOrDef(cls, sym, traitTargs)
56+
57+
58+
4459
private def isInlinableMember(sym: Symbol)(using Context): Boolean =
4560
(sym.isTerm || sym.isClass)
4661
&& !sym.isConstructor && !sym.is(ParamAccessor)
@@ -60,6 +75,15 @@ object InlineTraits:
6075
val privateWithin = inlinableDecl.privateWithin // TODO what should `privateWithin` be?
6176
newSymbol(cls, inlinableDecl.name, flags, info, privateWithin, cls.span)
6277

78+
private def inlinedSymbolPrivateValOrDef(cls: ClassSymbol, inlinableDecl: Symbol, traitTargs: List[Type])(using Context): Symbol =
79+
val name = atPhase(ctx.phase.next) { inlinableDecl.name }
80+
val flags = inlinableDecl.flags | Synthetic
81+
val info = inlinableDecl.info
82+
.substThis(inlinableDecl.owner.asClass, ThisType.raw(cls.typeRef))
83+
.subst(inlinableDecl.owner.typeParams, traitTargs)
84+
val privateWithin = inlinableDecl.privateWithin // TODO what should `privateWithin` be?
85+
newSymbol(cls, name, flags, info, privateWithin, cls.span)
86+
6387
private def inlinedSymbolClassDef(cls: ClassSymbol, inlinableDecl: ClassSymbol, traitTargs: List[Type])(using Context): ClassSymbol =
6488
def infoFn(cls1: ClassSymbol) =
6589
inlinableDecl.info.asInstanceOf[ClassInfo].derivedClassInfo(
@@ -98,7 +122,7 @@ object InlineTraits:
98122

99123
def inlinedDefs(cls: ClassSymbol)(using Context): List[Tree] =
100124
atPhase(ctx.phase.next) { cls.info.decls.toList }
101-
.filter(sym => sym.is(Synthetic) && sym.nextOverriddenSymbol.maybeOwner.isInlineTrait)
125+
.filter(sym => sym.is(Synthetic) && (atPhase(ctx.phase.next) { sym.nextOverriddenSymbol }.maybeOwner.isInlineTrait))
102126
.map { sym =>
103127
if sym.isClass then inlinedClassDefs(cls, sym.asClass)
104128
else inlinedValOrDefDefs(cls, sym)
@@ -158,7 +182,7 @@ object InlineTraits:
158182
stat match
159183
case stat: ValOrDefDef =>
160184
if sym.is(Module) then report.error(em"Implementation restriction: object cannot be defined in inline traits", stat.srcPos)
161-
else if sym.is(Private) then report.error(em"Implementation restriction: private ${sym.kindString} cannot be defined in inline traits", stat.srcPos)
185+
// else if sym.is(Private) then report.error(em"Implementation restriction: private ${sym.kindString} cannot be defined in inline traits", stat.srcPos)
162186
else () // Ok
163187
case stat: TypeDef =>
164188
if sym.isClass && !sym.is(Trait) then report.error(em"Implementation restriction: ${sym.kindString} cannot be defined in inline traits", stat.srcPos)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,12 @@ class TraitInlining extends MacroTransform, DenotTransformer {
7171
case tp @ ClassInfo(_, cls, _, decls, _) if needsTraitInlining(sym.asClass) =>
7272
val newDecls = decls.cloneScope
7373
inlinedMemberSymbols(sym.asClass).foreach(newDecls.enter)
74+
inlinedPrivateMemberSymbols(sym.asClass).foreach(newDecls.enter)
7475
val newInfo = tp.derivedClassInfo(decls = newDecls)
7576
ref.copySymDenotation(info = newInfo).copyCaches(ref, ctx.phase.next)
77+
case _ if ref.isTerm && ref.owner.isInlineTrait && ref.is(Private) =>
78+
val newName = (sym.name.expandedName(ref.owner).toString + "$inline$trait").toTermName // TODO use NameKinds
79+
ref.copySymDenotation(name = newName, initFlags = ref.flags &~ Private)
7680
case _ =>
7781
ref
7882
case _ =>

0 commit comments

Comments
 (0)