@@ -169,9 +169,9 @@ object TypeErasure {
169
169
}
170
170
}
171
171
172
- private def erasureIdx (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , wildcardOK : Boolean ) =
172
+ private def erasureIdx (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , inSigName : Boolean ) =
173
173
extension (b : Boolean ) def toInt = if b then 1 else 0
174
- wildcardOK .toInt
174
+ inSigName .toInt
175
175
+ (isSymbol.toInt << 1 )
176
176
+ (isConstructor.toInt << 2 )
177
177
+ (semiEraseVCs.toInt << 3 )
@@ -184,16 +184,16 @@ object TypeErasure {
184
184
semiEraseVCs <- List (false , true )
185
185
isConstructor <- List (false , true )
186
186
isSymbol <- List (false , true )
187
- wildcardOK <- List (false , true )
187
+ inSigName <- List (false , true )
188
188
do
189
- erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK )) =
190
- new TypeErasure (sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK )
189
+ erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName )) =
190
+ new TypeErasure (sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName )
191
191
192
192
/** Produces an erasure function. See the documentation of the class [[TypeErasure ]]
193
193
* for a description of each parameter.
194
194
*/
195
- private def erasureFn (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , wildcardOK : Boolean ): TypeErasure =
196
- erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK ))
195
+ private def erasureFn (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , inSigName : Boolean ): TypeErasure =
196
+ erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName ))
197
197
198
198
/** The current context with a phase no later than erasure */
199
199
def preErasureCtx (using Context ) =
@@ -204,19 +204,19 @@ object TypeErasure {
204
204
* @param tp The type to erase.
205
205
*/
206
206
def erasure (tp : Type )(using Context ): Type =
207
- erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = false , isConstructor = false , isSymbol = false , wildcardOK = false )(tp)(using preErasureCtx)
207
+ erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = false , isConstructor = false , isSymbol = false , inSigName = false )(tp)(using preErasureCtx)
208
208
209
209
/** The value class erasure of a Scala type, where value classes are semi-erased to
210
210
* ErasedValueType (they will be fully erased in [[ElimErasedValueType ]]).
211
211
*
212
212
* @param tp The type to erase.
213
213
*/
214
214
def valueErasure (tp : Type )(using Context ): Type =
215
- erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = true , isConstructor = false , isSymbol = false , wildcardOK = false )(tp)(using preErasureCtx)
215
+ erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = true , isConstructor = false , isSymbol = false , inSigName = false )(tp)(using preErasureCtx)
216
216
217
217
/** The erasure that Scala 2 would use for this type. */
218
218
def scala2Erasure (tp : Type )(using Context ): Type =
219
- erasureFn(sourceLanguage = SourceLanguage .Scala2 , semiEraseVCs = true , isConstructor = false , isSymbol = false , wildcardOK = false )(tp)(using preErasureCtx)
219
+ erasureFn(sourceLanguage = SourceLanguage .Scala2 , semiEraseVCs = true , isConstructor = false , isSymbol = false , inSigName = false )(tp)(using preErasureCtx)
220
220
221
221
/** Like value class erasure, but value classes erase to their underlying type erasure */
222
222
def fullErasure (tp : Type )(using Context ): Type =
@@ -226,7 +226,7 @@ object TypeErasure {
226
226
227
227
def sigName (tp : Type , sourceLanguage : SourceLanguage )(using Context ): TypeName = {
228
228
val normTp = tp.translateFromRepeated(toArray = sourceLanguage.isJava)
229
- val erase = erasureFn(sourceLanguage, semiEraseVCs = ! sourceLanguage.isJava, isConstructor = false , isSymbol = false , wildcardOK = true )
229
+ val erase = erasureFn(sourceLanguage, semiEraseVCs = ! sourceLanguage.isJava, isConstructor = false , isSymbol = false , inSigName = true )
230
230
erase.sigName(normTp)(using preErasureCtx)
231
231
}
232
232
@@ -256,7 +256,7 @@ object TypeErasure {
256
256
def transformInfo (sym : Symbol , tp : Type )(using Context ): Type = {
257
257
val sourceLanguage = SourceLanguage (sym)
258
258
val semiEraseVCs = ! sourceLanguage.isJava // Java sees our value classes as regular classes.
259
- val erase = erasureFn(sourceLanguage, semiEraseVCs, sym.isConstructor, isSymbol = true , wildcardOK = false )
259
+ val erase = erasureFn(sourceLanguage, semiEraseVCs, sym.isConstructor, isSymbol = true , inSigName = false )
260
260
261
261
def eraseParamBounds (tp : PolyType ): Type =
262
262
tp.derivedLambdaType(
@@ -582,10 +582,10 @@ import TypeErasure._
582
582
* If false, they are erased like normal classes.
583
583
* @param isConstructor Argument forms part of the type of a constructor
584
584
* @param isSymbol If true, the type being erased is the info of a symbol.
585
- * @param wildcardOK Wildcards are acceptable (true when using the erasure
586
- * for computing a signature name) .
585
+ * @param inSigName This eraser is used for `TypeErasure.sigName`,
586
+ * see `TypeErasure#apply` for more information .
587
587
*/
588
- class TypeErasure (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , wildcardOK : Boolean ) {
588
+ class TypeErasure (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , inSigName : Boolean ) {
589
589
590
590
/** The erasure |T| of a type T. This is:
591
591
*
@@ -673,7 +673,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
673
673
TypeComparer .orType(this (tp1), this (tp2), isErased = true )
674
674
case tp : MethodType =>
675
675
def paramErasure (tpToErase : Type ) =
676
- erasureFn(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK )(tpToErase)
676
+ erasureFn(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName )(tpToErase)
677
677
val (names, formals0) = if tp.hasErasedParams then
678
678
tp.paramNames
679
679
.zip(tp.paramInfos)
@@ -725,7 +725,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
725
725
}
726
726
case _ : ErrorType | JavaArrayType (_) =>
727
727
tp
728
- case tp : WildcardType if wildcardOK =>
728
+ case tp : WildcardType if inSigName =>
729
729
tp
730
730
case tp if (tp `eq` NoType ) || (tp `eq` NoPrefix ) =>
731
731
tp
@@ -760,7 +760,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
760
760
val defn .ArrayOf (elemtp) = tp : @ unchecked
761
761
if (isGenericArrayElement(elemtp, isScala2 = sourceLanguage.isScala2)) defn.ObjectType
762
762
else
763
- try JavaArrayType (erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, wildcardOK )(elemtp))
763
+ try JavaArrayType (erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, inSigName )(elemtp))
764
764
catch case ex : Throwable =>
765
765
handleRecursive(" erase array type" , tp.show, ex)
766
766
}
@@ -804,7 +804,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
804
804
val underlying = tp.select(unbox).widen.resultType
805
805
806
806
// The underlying part of an ErasedValueType cannot be an ErasedValueType itself
807
- val erase = erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, wildcardOK )
807
+ val erase = erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, inSigName )
808
808
val erasedUnderlying = erase(underlying)
809
809
810
810
// Ideally, we would just use `erasedUnderlying` as the erasure of `tp`, but to
@@ -843,7 +843,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
843
843
// correctly (see SIP-15 and [[Erasure.Boxing.adaptToType]]), so the result type of a
844
844
// constructor method should not be semi-erased.
845
845
if semiEraseVCs && isConstructor && ! tp.isInstanceOf [MethodOrPoly ] then
846
- erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, wildcardOK ).eraseResult(tp)
846
+ erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, inSigName ).eraseResult(tp)
847
847
else tp match
848
848
case tp : TypeRef =>
849
849
val sym = tp.symbol
0 commit comments