@@ -123,6 +123,60 @@ object GenericSignatures {
123
123
builder.append('L' ).append(name)
124
124
}
125
125
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
+
126
180
@ noinline
127
181
def jsig (tp0 : Type , toplevel : Boolean = false , primitiveOK : Boolean = true ): Unit = {
128
182
@@ -133,57 +187,6 @@ object GenericSignatures {
133
187
typeParamSig(ref.paramName.lastPart)
134
188
135
189
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
-
187
190
// If args isEmpty, Array is being used as a type constructor
188
191
if (sym == defn.ArrayClass && args.nonEmpty) {
189
192
if (unboundedGenericArrayLevel(tp) == 1 ) jsig(defn.ObjectType )
@@ -215,14 +218,14 @@ object GenericSignatures {
215
218
val unboxed = ValueClasses .valueClassUnbox(sym.asClass).info.finalResultType
216
219
val unboxedSeen = tp.memberInfo(ValueClasses .valueClassUnbox(sym.asClass)).finalResultType
217
220
if (unboxedSeen.isPrimitiveValueType && ! primitiveOK)
218
- classSig
221
+ classSig(sym, pre, args)
219
222
else
220
223
jsig(unboxedSeen, toplevel, primitiveOK)
221
224
}
222
225
else if (defn.isXXLFunctionClass(sym))
223
- jsig (defn.FunctionXXLType , toplevel, primitiveOK )
226
+ classSig (defn.FunctionXXLClass )
224
227
else if (sym.isClass)
225
- classSig
228
+ classSig(sym, pre, args)
226
229
else
227
230
jsig(erasure(tp), toplevel, primitiveOK)
228
231
0 commit comments