Skip to content

Commit 2a77b33

Browse files
committed
* Fix String_valueOf definition
* Fix sigName of nullable union
1 parent 4fa29eb commit 2a77b33

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,8 @@ class Definitions {
628628
@tu lazy val StringModule: Symbol = StringClass.linkedClass
629629
@tu lazy val String_+ : TermSymbol = enterMethod(StringClass, nme.raw.PLUS, methOfAny(StringType), Final)
630630
@tu lazy val String_valueOf_Object: Symbol = StringModule.info.member(nme.valueOf).suchThat(_.info.firstParamTypes match {
631-
case List(pt) => pt.isAny || pt.isAnyRef
631+
case List(pt) =>
632+
pt.isAny || (if ctx.explicitNulls then pt.stripNull else pt).isAnyRef
632633
case _ => false
633634
}).symbol
634635

compiler/src/dotty/tools/dotc/core/TypeErasure.scala

+7-3
Original file line numberDiff line numberDiff line change
@@ -518,9 +518,8 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
518518
val defn.ArrayOf(elemtp0) = tp
519519
val elemtp = if ctx.explicitNulls then elemtp0.stripNull else elemtp0
520520
if classify(elemtp).derivesFrom(defn.NullClass) then JavaArrayType(defn.ObjectType)
521-
else
522-
if isUnboundedGeneric(elemtp) && !isJava then defn.ObjectType
523-
else JavaArrayType(erasureFn(isJava, semiEraseVCs = false, isConstructor, wildcardOK)(elemtp))
521+
else if isUnboundedGeneric(elemtp) && !isJava then defn.ObjectType
522+
else JavaArrayType(erasureFn(isJava, semiEraseVCs = false, isConstructor, wildcardOK)(elemtp))
524523
}
525524

526525
private def erasePair(tp: Type)(using Context): Type = {
@@ -649,6 +648,11 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
649648
tpnme.WILDCARD
650649
case tp: WildcardType =>
651650
sigName(tp.optBounds)
651+
case OrNull(tp) =>
652+
// If explicit nulls is enabled and the type is nullable union,
653+
// we need to strip nulls before computing the signiture name.
654+
// For example, the correct name of `String | Null` is `String` instead of `Object`.
655+
sigName(tp)
652656
case _ =>
653657
val erasedTp = this(tp)
654658
assert(erasedTp ne tp, tp)

0 commit comments

Comments
 (0)