@@ -172,9 +172,9 @@ object TypeErasure {
172
172
}
173
173
}
174
174
175
- private def erasureIdx (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , wildcardOK : Boolean ) =
175
+ private def erasureIdx (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , inSigName : Boolean ) =
176
176
extension (b : Boolean ) def toInt = if b then 1 else 0
177
- wildcardOK .toInt
177
+ inSigName .toInt
178
178
+ (isSymbol.toInt << 1 )
179
179
+ (isConstructor.toInt << 2 )
180
180
+ (semiEraseVCs.toInt << 3 )
@@ -187,16 +187,16 @@ object TypeErasure {
187
187
semiEraseVCs <- List (false , true )
188
188
isConstructor <- List (false , true )
189
189
isSymbol <- List (false , true )
190
- wildcardOK <- List (false , true )
190
+ inSigName <- List (false , true )
191
191
do
192
- erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK )) =
193
- new TypeErasure (sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK )
192
+ erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName )) =
193
+ new TypeErasure (sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName )
194
194
195
195
/** Produces an erasure function. See the documentation of the class [[TypeErasure ]]
196
196
* for a description of each parameter.
197
197
*/
198
- private def erasureFn (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , wildcardOK : Boolean ): TypeErasure =
199
- erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK ))
198
+ private def erasureFn (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , inSigName : Boolean ): TypeErasure =
199
+ erasures(erasureIdx(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName ))
200
200
201
201
/** The current context with a phase no later than erasure */
202
202
def preErasureCtx (using Context ) =
@@ -207,19 +207,19 @@ object TypeErasure {
207
207
* @param tp The type to erase.
208
208
*/
209
209
def erasure (tp : Type )(using Context ): Type =
210
- erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = false , isConstructor = false , isSymbol = false , wildcardOK = false )(tp)(using preErasureCtx).nn
210
+ erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = false , isConstructor = false , isSymbol = false , inSigName = false )(tp)(using preErasureCtx).nn
211
211
212
212
/** The value class erasure of a Scala type, where value classes are semi-erased to
213
213
* ErasedValueType (they will be fully erased in [[ElimErasedValueType ]]).
214
214
*
215
215
* @param tp The type to erase.
216
216
*/
217
217
def valueErasure (tp : Type )(using Context ): Type =
218
- erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = true , isConstructor = false , isSymbol = false , wildcardOK = false )(tp)(using preErasureCtx).nn
218
+ erasureFn(sourceLanguage = SourceLanguage .Scala3 , semiEraseVCs = true , isConstructor = false , isSymbol = false , inSigName = false )(tp)(using preErasureCtx).nn
219
219
220
220
/** The erasure that Scala 2 would use for this type. */
221
221
def scala2Erasure (tp : Type )(using Context ): Type =
222
- erasureFn(sourceLanguage = SourceLanguage .Scala2 , semiEraseVCs = true , isConstructor = false , isSymbol = false , wildcardOK = false )(tp)(using preErasureCtx).nn
222
+ erasureFn(sourceLanguage = SourceLanguage .Scala2 , semiEraseVCs = true , isConstructor = false , isSymbol = false , inSigName = false )(tp)(using preErasureCtx).nn
223
223
224
224
/** Like value class erasure, but value classes erase to their underlying type erasure */
225
225
def fullErasure (tp : Type )(using Context ): Type =
@@ -229,7 +229,7 @@ object TypeErasure {
229
229
230
230
def sigName (tp : Type , sourceLanguage : SourceLanguage )(using Context ): TypeName = {
231
231
val normTp = tp.translateFromRepeated(toArray = sourceLanguage.isJava)
232
- val erase = erasureFn(sourceLanguage, semiEraseVCs = ! sourceLanguage.isJava, isConstructor = false , isSymbol = false , wildcardOK = true )
232
+ val erase = erasureFn(sourceLanguage, semiEraseVCs = ! sourceLanguage.isJava, isConstructor = false , isSymbol = false , inSigName = true )
233
233
erase.sigName(normTp)(using preErasureCtx)
234
234
}
235
235
@@ -259,7 +259,7 @@ object TypeErasure {
259
259
def transformInfo (sym : Symbol , tp : Type )(using Context ): Type = {
260
260
val sourceLanguage = SourceLanguage (sym)
261
261
val semiEraseVCs = ! sourceLanguage.isJava // Java sees our value classes as regular classes.
262
- val erase = erasureFn(sourceLanguage, semiEraseVCs, sym.isConstructor, isSymbol = true , wildcardOK = false )
262
+ val erase = erasureFn(sourceLanguage, semiEraseVCs, sym.isConstructor, isSymbol = true , inSigName = false )
263
263
264
264
def eraseParamBounds (tp : PolyType ): Type =
265
265
tp.derivedLambdaType(
@@ -585,10 +585,10 @@ import TypeErasure._
585
585
* If false, they are erased like normal classes.
586
586
* @param isConstructor Argument forms part of the type of a constructor
587
587
* @param isSymbol If true, the type being erased is the info of a symbol.
588
- * @param wildcardOK Wildcards and uninstantiated type variables are valid input
589
- * (only set to true by `TypeErasure.sigName`)
588
+ * @param inSigName This eraser is used for `TypeErasure.sigName`,
589
+ * see `TypeErasure#apply` for more information.
590
590
*/
591
- class TypeErasure (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , wildcardOK : Boolean ) {
591
+ class TypeErasure (sourceLanguage : SourceLanguage , semiEraseVCs : Boolean , isConstructor : Boolean , isSymbol : Boolean , inSigName : Boolean ) {
592
592
593
593
/** The erasure |T| of a type T.
594
594
*
@@ -661,7 +661,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
661
661
case RefinedType (parent, nme.apply, refinedInfo : MethodType ) if defn.isErasedFunctionType(parent) =>
662
662
eraseErasedFunctionApply(refinedInfo)
663
663
case tp : TypeVar if ! tp.inst.exists =>
664
- assert(wildcardOK , i " Cannot erase non-permanently instantiated type variable $tp" )
664
+ assert(inSigName , i " Cannot erase non-permanently instantiated type variable $tp" )
665
665
null
666
666
case tp : TypeProxy =>
667
667
this (tp.underlying)
@@ -694,7 +694,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
694
694
else TypeComparer .orType(e1, e2, isErased = true )
695
695
case tp : MethodType =>
696
696
def paramErasure (tpToErase : Type ) =
697
- erasureFn(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, wildcardOK = false )(tpToErase).nn
697
+ erasureFn(sourceLanguage, semiEraseVCs, isConstructor, isSymbol, inSigName = false )(tpToErase).nn
698
698
val (names, formals0) = if tp.hasErasedParams then
699
699
tp.paramNames
700
700
.zip(tp.paramInfos)
@@ -747,11 +747,11 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
747
747
case _ : ErrorType | JavaArrayType (_) =>
748
748
tp
749
749
case tp : WildcardType =>
750
- assert(wildcardOK , i " Cannot erase wildcard type $tp" )
750
+ assert(inSigName , i " Cannot erase wildcard type $tp" )
751
751
null
752
752
case tp if (tp `eq` NoType ) || (tp `eq` NoPrefix ) => // Why is this check different?
753
753
tp
754
- ).ensuring(etp => etp != null || wildcardOK )
754
+ ).ensuring(etp => etp != null || inSigName )
755
755
756
756
/** Like translucentSuperType, but issue a fatal error if it does not exist. */
757
757
private def checkedSuperType (tp : TypeProxy )(using Context ): Type =
@@ -783,7 +783,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
783
783
if (isGenericArrayElement(elemtp, isScala2 = sourceLanguage.isScala2)) defn.ObjectType
784
784
else
785
785
try
786
- val eElem = erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, wildcardOK )(elemtp)
786
+ val eElem = erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, inSigName )(elemtp)
787
787
if eElem == null then null
788
788
else JavaArrayType (eElem)
789
789
catch case ex : Throwable =>
@@ -805,7 +805,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
805
805
* to the underlying type.
806
806
*/
807
807
def eraseInfo (tp : Type , sym : Symbol )(using Context ): Type =
808
- assert(! wildcardOK ) // therefore apply(...).nn won't fail
808
+ assert(! inSigName ) // therefore apply(...).nn won't fail
809
809
val tp1 = tp match
810
810
case tp : MethodicType => integrateContextResults(tp, contextResultCount(sym))
811
811
case _ => tp
@@ -833,7 +833,7 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
833
833
val underlying = tp.select(unbox).widen.resultType
834
834
835
835
// The underlying part of an ErasedValueType cannot be an ErasedValueType itself
836
- val erase = erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, wildcardOK )
836
+ val erase = erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, inSigName )
837
837
val erasedUnderlying = erase(underlying)
838
838
if erasedUnderlying == null then return null
839
839
@@ -869,12 +869,12 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
869
869
870
870
/** The erasure of a function result type. */
871
871
def eraseResult (tp : Type )(using Context ): Type =
872
- assert(! wildcardOK ) // therefore apply(...).nn won't fail
872
+ assert(! inSigName ) // therefore apply(...).nn won't fail
873
873
// For a value class V, "new V(x)" should have type V for type adaptation to work
874
874
// correctly (see SIP-15 and [[Erasure.Boxing.adaptToType]]), so the result type of a
875
875
// constructor method should not be semi-erased.
876
876
if semiEraseVCs && isConstructor && ! tp.isInstanceOf [MethodOrPoly ] then
877
- erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, wildcardOK ).eraseResult(tp)
877
+ erasureFn(sourceLanguage, semiEraseVCs = false , isConstructor, isSymbol, inSigName ).eraseResult(tp)
878
878
else tp match
879
879
case tp : TypeRef =>
880
880
val sym = tp.symbol
0 commit comments