Skip to content

Commit 5a87908

Browse files
committed
Refactor JavaNullInterop to reflect new usage
1 parent d254401 commit 5a87908

File tree

5 files changed

+11
-11
lines changed

5 files changed

+11
-11
lines changed

compiler/src/dotty/tools/dotc/core/JavaNullInterop.scala renamed to compiler/src/dotty/tools/dotc/core/ImplicitNullInterop.scala

+7-8
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import dotty.tools.dotc.core.Decorators.i
3535
* to handle the full spectrum of Scala types. Additionally, some kinds of symbols like constructors and
3636
* enum instances get special treatment.
3737
*/
38-
object JavaNullInterop {
38+
object ImplicitNullInterop {
3939

4040
/** Transforms the type `tp` of Java member `sym` to be explicitly nullable.
4141
* `tp` is needed because the type inside `sym` might not be set when this method is called.
@@ -55,7 +55,6 @@ object JavaNullInterop {
5555
*/
5656
def nullifyMember(sym: Symbol, tp: Type, isEnumValueDef: Boolean)(using Context): Type = trace(i"nullifyMember ${sym}, ${tp}"){
5757
assert(ctx.explicitNulls)
58-
// assert(sym.is(JavaDefined), "can only nullify java-defined members")
5958

6059
// Some special cases when nullifying the type
6160
if isEnumValueDef || sym.name == nme.TYPE_ // Don't nullify the `TYPE` field in every class and Java enum instances
@@ -81,14 +80,14 @@ object JavaNullInterop {
8180
* but the result type is not nullable.
8281
*/
8382
private def nullifyExceptReturnType(tp: Type)(using Context): Type =
84-
new JavaNullMap(outermostLevelAlreadyNullable = true)(tp)
83+
new ImplicitNullMap(outermostLevelAlreadyNullable = true)(tp)
8584

86-
/** Nullifies a Java type by adding `| Null` in the relevant places. */
85+
/** Nullifies a type by adding `| Null` in the relevant places. */
8786
private def nullifyType(tp: Type)(using Context): Type =
88-
new JavaNullMap(outermostLevelAlreadyNullable = false)(tp)
87+
new ImplicitNullMap(outermostLevelAlreadyNullable = false)(tp)
8988

90-
/** A type map that implements the nullification function on types. Given a Java-sourced type, this adds `| Null`
91-
* in the right places to make the nulls explicit in Scala.
89+
/** A type map that implements the nullification function on types. Given a Java-sourced type or an
90+
* implicitly null type, this adds `| Null` in the right places to make the nulls explicit.
9291
*
9392
* @param outermostLevelAlreadyNullable whether this type is already nullable at the outermost level.
9493
* For example, `Array[String] | Null` is already nullable at the
@@ -98,7 +97,7 @@ object JavaNullInterop {
9897
* This is useful for e.g. constructors, and also so that `A & B` is nullified
9998
* to `(A & B) | Null`, instead of `(A | Null & B | Null) | Null`.
10099
*/
101-
private class JavaNullMap(var outermostLevelAlreadyNullable: Boolean)(using Context) extends TypeMap {
100+
private class ImplicitNullMap(var outermostLevelAlreadyNullable: Boolean)(using Context) extends TypeMap {
102101
def nullify(tp: Type): Type = if ctx.flexibleTypes then FlexibleType(tp) else OrNull(tp)
103102

104103
/** Should we nullify `tp` at the outermost level? */

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

+1
Original file line numberDiff line numberDiff line change
@@ -3427,6 +3427,7 @@ object Types extends TypeUtils {
34273427
// flexible type is always a subtype of the original type and the Object type.
34283428
// It is not necessary according to the use cases, so we choose to use a simpler
34293429
// rule.
3430+
assert(!tp.isInstanceOf[LazyType])
34303431
FlexibleType(OrNull(tp), tp)
34313432
}
34323433
}

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ class ClassfileParser(
525525
denot.info = translateTempPoly(attrCompleter.complete(denot.info, isVarargs))
526526
if (isConstructor) normalizeConstructorInfo()
527527

528-
if (ctx.explicitNulls) denot.info = JavaNullInterop.nullifyMember(denot.symbol, denot.info, isEnum)
528+
if (ctx.explicitNulls) denot.info = ImplicitNullInterop.nullifyMember(denot.symbol, denot.info, isEnum)
529529

530530
// seal java enums
531531
if (isEnum) {

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -985,7 +985,7 @@ class TreeUnpickler(reader: TastyReader,
985985
// If explicit nulls is enabled, and the source file did not have explicit
986986
// nulls enabled, nullify the member to allow for compatibility.
987987
if (ctx.explicitNulls && !explicitNulls) then
988-
sym.info = JavaNullInterop.nullifyMember(sym, sym.info, sym.is(Enum))
988+
sym.info = ImplicitNullInterop.nullifyMember(sym, sym.info, sym.is(Enum))
989989

990990
goto(end)
991991
setSpan(start, tree)

compiler/src/dotty/tools/dotc/typer/Namer.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1879,7 +1879,7 @@ class Namer { typer: Typer =>
18791879

18801880
val mbrTpe = paramFn(checkSimpleKinded(typedAheadType(mdef.tpt, tptProto)).tpe)
18811881
if (ctx.explicitNulls && mdef.mods.is(JavaDefined))
1882-
JavaNullInterop.nullifyMember(sym, mbrTpe, mdef.mods.isAllOf(JavaEnumValue))
1882+
ImplicitNullInterop.nullifyMember(sym, mbrTpe, mdef.mods.isAllOf(JavaEnumValue))
18831883
else mbrTpe
18841884
}
18851885

0 commit comments

Comments
 (0)