@@ -77,10 +77,15 @@ object NamerOps:
7777 val ApplyProxyFlags = Synthetic | ConstructorProxy | Inline | Method
7878
7979 /** Does symbol `cls` need constructor proxies to be generated? */
80- def needsConstructorProxies (cls : Symbol )(using Context ): Boolean =
81- cls.isClass
82- && ! cls.flagsUNSAFE.isOneOf(NoConstructorProxyNeededFlags )
83- && ! cls.isAnonymousClass
80+ def needsConstructorProxies (sym : Symbol )(using Context ): Boolean =
81+ sym.isClass
82+ && ! sym.flagsUNSAFE.isOneOf(NoConstructorProxyNeededFlags )
83+ && ! sym.isAnonymousClass
84+ ||
85+ sym.isType && sym.is(Exported )
86+ && sym.info.loBound.underlyingClassRef(refinementOK = false ).match
87+ case tref : TypeRef => tref.prefix.isStable
88+ case _ => false
8489
8590 /** The completer of a constructor proxy apply method */
8691 class ApplyProxyCompleter (constr : Symbol )(using Context ) extends LazyType :
@@ -114,7 +119,7 @@ object NamerOps:
114119 }.withSourceModule(modul)
115120
116121 /** A new symbol that is the constructor companion for class `cls` */
117- def constructorCompanion (cls : ClassSymbol )(using Context ): TermSymbol =
122+ def classConstructorCompanion (cls : ClassSymbol )(using Context ): TermSymbol =
118123 val companion = newModuleSymbol(
119124 cls.owner, cls.name.toTermName,
120125 ConstructorCompanionFlags , ConstructorCompanionFlags ,
@@ -125,6 +130,10 @@ object NamerOps:
125130 cls.registerCompanion(companion.moduleClass)
126131 companion
127132
133+ def typeConstructorCompanion (tsym : Symbol , prefix : Type , proxy : Symbol )(using Context ): TermSymbol =
134+ newSymbol(tsym.owner, tsym.name.toTermName,
135+ ConstructorCompanionFlags | StableRealizable | Method , ExprType (prefix.select(proxy)), coord = tsym.coord)
136+
128137 /** Add all necesssary constructor proxy symbols for members of class `cls`. This means:
129138 *
130139 * - if a member is a class that needs a constructor companion, add one,
@@ -137,12 +146,21 @@ object NamerOps:
137146
138147 def memberExists (cls : ClassSymbol , name : TermName ): Boolean =
139148 cls.baseClasses.exists(_.info.decls.lookupEntry(name) != null )
149+
140150 for mbr <- cls.info.decls do
141- if needsConstructorProxies(mbr)
142- && ! mbr.asClass.unforcedRegisteredCompanion.exists
143- && ! memberExists(cls, mbr.name.toTermName)
144- then
145- constructorCompanion(mbr.asClass).entered
151+ if needsConstructorProxies(mbr) then
152+ mbr match
153+ case mbr : ClassSymbol =>
154+ if ! mbr.unforcedRegisteredCompanion.exists
155+ && ! memberExists(cls, mbr.name.toTermName)
156+ then
157+ classConstructorCompanion(mbr).entered
158+ case _ =>
159+ mbr.info.loBound.underlyingClassRef(refinementOK = false ) match
160+ case ref : TypeRef =>
161+ val proxy = ref.symbol.registeredCompanion
162+ if proxy.is(ConstructorProxy ) && ! memberExists(cls, mbr.name.toTermName) then
163+ typeConstructorCompanion(mbr, ref.prefix, proxy).entered
146164
147165 if cls.is(Module )
148166 && needsConstructorProxies(cls.linkedClass)
0 commit comments