@@ -123,6 +123,60 @@ object GenericSignatures {
123123 builder.append('L' ).append(name)
124124 }
125125
126+ def classSig (sym : Symbol , pre : Type = NoType , args : List [Type ] = Nil ): Unit = {
127+ def argSig (tp : Type ): Unit =
128+ tp match {
129+ case bounds : TypeBounds =>
130+ if (! (defn.AnyType <:< bounds.hi)) {
131+ builder.append('+' )
132+ boxedSig(bounds.hi)
133+ }
134+ else if (! (bounds.lo <:< defn.NothingType )) {
135+ builder.append('-' )
136+ boxedSig(bounds.lo)
137+ }
138+ else builder.append('*' )
139+ case PolyType (_, res) =>
140+ builder.append('*' ) // scala/bug#7932
141+ case _ : HKTypeLambda =>
142+ fullNameInSig(tp.typeSymbol)
143+ builder.append(';' )
144+ case _ =>
145+ boxedSig(tp)
146+ }
147+
148+ if (pre.exists) {
149+ val preRebound = pre.baseType(sym.owner) // #2585
150+ if (needsJavaSig(preRebound, Nil )) {
151+ val i = builder.length()
152+ jsig(preRebound)
153+ if (builder.charAt(i) == 'L' ) {
154+ builder.delete(builder.length() - 1 , builder.length())// delete ';'
155+ // If the prefix is a module, drop the '$'. Classes (or modules) nested in modules
156+ // are separated by a single '$' in the filename: `object o { object i }` is o$i$.
157+ if (preRebound.typeSymbol.is(ModuleClass ))
158+ builder.delete(builder.length() - 1 , builder.length())
159+
160+ // Ensure every '.' in the generated signature immediately follows
161+ // a close angle bracket '>'. Any which do not are replaced with '$'.
162+ // This arises due to multiply nested classes in the face of the
163+ // rewriting explained at rebindInnerClass.
164+
165+ // TODO revisit this. Does it align with javac for code that can be expressed in both languages?
166+ val delimiter = if (builder.charAt(builder.length() - 1 ) == '>' ) '.' else '$'
167+ builder.append(delimiter).append(sanitizeName(sym.name.asSimpleName))
168+ } else fullNameInSig(sym)
169+ } else fullNameInSig(sym)
170+ } else fullNameInSig(sym)
171+
172+ if (args.nonEmpty) {
173+ builder.append('<' )
174+ args foreach argSig
175+ builder.append('>' )
176+ }
177+ builder.append(';' )
178+ }
179+
126180 @ noinline
127181 def jsig (tp0 : Type , toplevel : Boolean = false , primitiveOK : Boolean = true ): Unit = {
128182
@@ -133,57 +187,6 @@ object GenericSignatures {
133187 typeParamSig(ref.paramName.lastPart)
134188
135189 case RefOrAppliedType (sym, pre, args) =>
136- def argSig (tp : Type ): Unit =
137- tp match {
138- case bounds : TypeBounds =>
139- if (! (defn.AnyType <:< bounds.hi)) {
140- builder.append('+' )
141- boxedSig(bounds.hi)
142- }
143- else if (! (bounds.lo <:< defn.NothingType )) {
144- builder.append('-' )
145- boxedSig(bounds.lo)
146- }
147- else builder.append('*' )
148- case PolyType (_, res) =>
149- builder.append('*' ) // scala/bug#7932
150- case _ : HKTypeLambda =>
151- fullNameInSig(tp.typeSymbol)
152- builder.append(';' )
153- case _ =>
154- boxedSig(tp)
155- }
156- def classSig : Unit = {
157- val preRebound = pre.baseType(sym.owner) // #2585
158- if (needsJavaSig(preRebound, Nil )) {
159- val i = builder.length()
160- jsig(preRebound)
161- if (builder.charAt(i) == 'L' ) {
162- builder.delete(builder.length() - 1 , builder.length())// delete ';'
163- // If the prefix is a module, drop the '$'. Classes (or modules) nested in modules
164- // are separated by a single '$' in the filename: `object o { object i }` is o$i$.
165- if (preRebound.typeSymbol.is(ModuleClass ))
166- builder.delete(builder.length() - 1 , builder.length())
167-
168- // Ensure every '.' in the generated signature immediately follows
169- // a close angle bracket '>'. Any which do not are replaced with '$'.
170- // This arises due to multiply nested classes in the face of the
171- // rewriting explained at rebindInnerClass.
172-
173- // TODO revisit this. Does it align with javac for code that can be expressed in both languages?
174- val delimiter = if (builder.charAt(builder.length() - 1 ) == '>' ) '.' else '$'
175- builder.append(delimiter).append(sanitizeName(sym.name.asSimpleName))
176- } else fullNameInSig(sym)
177- } else fullNameInSig(sym)
178-
179- if (args.nonEmpty) {
180- builder.append('<' )
181- args foreach argSig
182- builder.append('>' )
183- }
184- builder.append(';' )
185- }
186-
187190 // If args isEmpty, Array is being used as a type constructor
188191 if (sym == defn.ArrayClass && args.nonEmpty) {
189192 if (unboundedGenericArrayLevel(tp) == 1 ) jsig(defn.ObjectType )
@@ -215,14 +218,14 @@ object GenericSignatures {
215218 val unboxed = ValueClasses .valueClassUnbox(sym.asClass).info.finalResultType
216219 val unboxedSeen = tp.memberInfo(ValueClasses .valueClassUnbox(sym.asClass)).finalResultType
217220 if (unboxedSeen.isPrimitiveValueType && ! primitiveOK)
218- classSig
221+ classSig(sym, pre, args)
219222 else
220223 jsig(unboxedSeen, toplevel, primitiveOK)
221224 }
222225 else if (defn.isXXLFunctionClass(sym))
223- jsig (defn.FunctionXXLType , toplevel, primitiveOK )
226+ classSig (defn.FunctionXXLClass )
224227 else if (sym.isClass)
225- classSig
228+ classSig(sym, pre, args)
226229 else
227230 jsig(erasure(tp), toplevel, primitiveOK)
228231
0 commit comments