@@ -41,6 +41,21 @@ object InlineTraits:
41
41
else inlinedSymbolValOrDef(cls, sym, traitTargs)
42
42
end inlinedMemberSymbols
43
43
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
+
44
59
private def isInlinableMember (sym : Symbol )(using Context ): Boolean =
45
60
(sym.isTerm || sym.isClass)
46
61
&& ! sym.isConstructor && ! sym.is(ParamAccessor )
@@ -60,6 +75,15 @@ object InlineTraits:
60
75
val privateWithin = inlinableDecl.privateWithin // TODO what should `privateWithin` be?
61
76
newSymbol(cls, inlinableDecl.name, flags, info, privateWithin, cls.span)
62
77
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
+
63
87
private def inlinedSymbolClassDef (cls : ClassSymbol , inlinableDecl : ClassSymbol , traitTargs : List [Type ])(using Context ): ClassSymbol =
64
88
def infoFn (cls1 : ClassSymbol ) =
65
89
inlinableDecl.info.asInstanceOf [ClassInfo ].derivedClassInfo(
@@ -98,7 +122,7 @@ object InlineTraits:
98
122
99
123
def inlinedDefs (cls : ClassSymbol )(using Context ): List [Tree ] =
100
124
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) )
102
126
.map { sym =>
103
127
if sym.isClass then inlinedClassDefs(cls, sym.asClass)
104
128
else inlinedValOrDefDefs(cls, sym)
@@ -158,7 +182,7 @@ object InlineTraits:
158
182
stat match
159
183
case stat : ValOrDefDef =>
160
184
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)
162
186
else () // Ok
163
187
case stat : TypeDef =>
164
188
if sym.isClass && ! sym.is(Trait ) then report.error(em " Implementation restriction: ${sym.kindString} cannot be defined in inline traits " , stat.srcPos)
0 commit comments