Skip to content

Commit 7d2c322

Browse files
authored
Revert flexible types tasty to fix CI (#22992)
Revert #22473 to fix CI. Fix #22988.
2 parents e5f9cfb + 644de7e commit 7d2c322

File tree

8 files changed

+14
-53
lines changed

8 files changed

+14
-53
lines changed

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

+10-10
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 ImplicitNullInterop {
38+
object JavaNullInterop {
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,11 +55,11 @@ object ImplicitNullInterop {
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")
5859

5960
// Some special cases when nullifying the type
60-
if isEnumValueDef || sym.name == nme.TYPE_ // Don't nullify the `TYPE` field in every class and Java enum instances
61-
|| sym.is(Flags.ModuleVal) // Don't nullify Modules
62-
then
61+
if isEnumValueDef || sym.name == nme.TYPE_ then
62+
// Don't nullify the `TYPE` field in every class and Java enum instances
6363
tp
6464
else if sym.name == nme.toString_ || sym.isConstructor || hasNotNullAnnot(sym) then
6565
// Don't nullify the return type of the `toString` method.
@@ -80,14 +80,14 @@ object ImplicitNullInterop {
8080
* but the result type is not nullable.
8181
*/
8282
private def nullifyExceptReturnType(tp: Type)(using Context): Type =
83-
new ImplicitNullMap(outermostLevelAlreadyNullable = true)(tp)
83+
new JavaNullMap(outermostLevelAlreadyNullable = true)(tp)
8484

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

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.
89+
/** A type map that implements the nullification function on types. Given a Java-sourced type, this adds `| Null`
90+
* in the right places to make the nulls explicit in Scala.
9191
*
9292
* @param outermostLevelAlreadyNullable whether this type is already nullable at the outermost level.
9393
* For example, `Array[String] | Null` is already nullable at the
@@ -97,7 +97,7 @@ object ImplicitNullInterop {
9797
* This is useful for e.g. constructors, and also so that `A & B` is nullified
9898
* to `(A & B) | Null`, instead of `(A | Null & B | Null) | Null`.
9999
*/
100-
private class ImplicitNullMap(var outermostLevelAlreadyNullable: Boolean)(using Context) extends TypeMap {
100+
private class JavaNullMap(var outermostLevelAlreadyNullable: Boolean)(using Context) extends TypeMap {
101101
def nullify(tp: Type): Type = if ctx.flexibleTypes then FlexibleType(tp) else OrNull(tp)
102102

103103
/** 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
@@ -3432,7 +3432,6 @@ object Types extends TypeUtils {
34323432
// flexible type is always a subtype of the original type and the Object type.
34333433
// It is not necessary according to the use cases, so we choose to use a simpler
34343434
// rule.
3435-
assert(!tp.isInstanceOf[LazyType])
34363435
FlexibleType(OrNull(tp), tp)
34373436
}
34383437
}

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 = ImplicitNullInterop.nullifyMember(denot.symbol, denot.info, isEnum)
528+
if (ctx.explicitNulls) denot.info = JavaNullInterop.nullifyMember(denot.symbol, denot.info, isEnum)
529529

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

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

-6
Original file line numberDiff line numberDiff line change
@@ -981,12 +981,6 @@ class TreeUnpickler(reader: TastyReader,
981981
sym.info = tpt.tpe
982982
ValDef(tpt)
983983
}
984-
985-
// If explicit nulls is enabled, and the source file did not have explicit
986-
// nulls enabled, nullify the member to allow for compatibility.
987-
if (ctx.explicitNulls && !explicitNulls) then
988-
sym.info = ImplicitNullInterop.nullifyMember(sym, sym.info, sym.is(Enum))
989-
990984
goto(end)
991985
setSpan(start, tree)
992986

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

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

19031903
val mbrTpe = paramFn(checkSimpleKinded(typedAheadType(mdef.tpt, tptProto)).tpe)
19041904
if (ctx.explicitNulls && mdef.mods.is(JavaDefined))
1905-
ImplicitNullInterop.nullifyMember(sym, mbrTpe, mdef.mods.isAllOf(JavaEnumValue))
1905+
JavaNullInterop.nullifyMember(sym, mbrTpe, mdef.mods.isAllOf(JavaEnumValue))
19061906
else mbrTpe
19071907
}
19081908

compiler/test/dotty/tools/dotc/CompilationTests.scala

+2-12
Original file line numberDiff line numberDiff line change
@@ -217,18 +217,8 @@ class CompilationTests {
217217
compileFilesInDir("tests/explicit-nulls/pos", explicitNullsOptions),
218218
compileFilesInDir("tests/explicit-nulls/flexible-types-common", explicitNullsOptions),
219219
compileFilesInDir("tests/explicit-nulls/unsafe-common", explicitNullsOptions and "-language:unsafeNulls" and "-Yno-flexible-types"),
220-
).checkCompile()
221-
222-
locally {
223-
val tests = List(
224-
compileFile("tests/explicit-nulls/flexible-unpickle/Unsafe_1.scala", explicitNullsOptions without "-Yexplicit-nulls"),
225-
compileFile("tests/explicit-nulls/flexible-unpickle/Flexible_2.scala", explicitNullsOptions.withClasspath(
226-
defaultOutputDir + testGroup + "/Unsafe_1/flexible-unpickle/Unsafe_1")),
227-
).map(_.keepOutput.checkCompile())
228-
229-
tests.foreach(_.delete())
230-
}
231-
}
220+
)
221+
}.checkCompile()
232222

233223
@Test def explicitNullsWarn: Unit = {
234224
implicit val testGroup: TestGroup = TestGroup("explicitNullsWarn")

tests/explicit-nulls/flexible-unpickle/Flexible_2.scala

-10
This file was deleted.

tests/explicit-nulls/flexible-unpickle/Unsafe_1.scala

-12
This file was deleted.

0 commit comments

Comments
 (0)