K2: keep FlexibleNullability on enhanced type parameter types
Types based on type parameters which have both hasEnhancedNullability and hasFlexibleNullability were incorrectly converted to IR: only `@EnhancedNullability` annotation was added to the IR type. This means that the nullability of the type started to matter, which is incorrect because the type is supposed to be flexible. This backfired in the IR fake override builder mode, where nullability of methods inherited from both Kotlin maps and Java maps clashed, which resulted in the exception from FakeOverrideRebuilder. If the type is both flexible and enhanced, we're now adding `@FlexibleNullability` to the IR type. Note that `@EnhancedNullability` is not needed because it only affects primitive types which need to be handled as wrapper types on JVM, but `@FlexibleNullability` already has that effect. IR still slightly differs from K1 for collection subclasses, which can be seen for example in the changed IR text tests. This is to be investigated later. The change in tests is needed because the `kt48495*.kt` tests are now passing on K2 in the IR fake override builder mode, while failing on the vanilla K2. This is related to KT-61370 but does not entirely fix it, although curiously it fixes all remaining tests which were muted because of it.
This commit is contained in:
committed by
Space Team
parent
fe87f41c39
commit
953f6ba6b6
@@ -128,13 +128,13 @@ class Fir2IrTypeConverter(
|
||||
?: return createErrorType()
|
||||
|
||||
when {
|
||||
hasEnhancedNullability -> {
|
||||
builtIns.enhancedNullabilityAnnotationConstructorCall()?.let {
|
||||
hasFlexibleNullability -> {
|
||||
builtIns.flexibleNullabilityAnnotationConstructorCall()?.let {
|
||||
typeAnnotations += it
|
||||
}
|
||||
}
|
||||
hasFlexibleNullability -> {
|
||||
builtIns.flexibleNullabilityAnnotationConstructorCall()?.let {
|
||||
hasEnhancedNullability -> {
|
||||
builtIns.enhancedNullabilityAnnotationConstructorCall()?.let {
|
||||
typeAnnotations += it
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// !JVM_DEFAULT_MODE: all
|
||||
// SKIP_JDK6
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_STDLIB
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
// IGNORE_BACKEND_K2: JVM_IR, JS_IR
|
||||
// FIR status: in progress (M.G.), different structure of f/o
|
||||
// FIR status: different structure of fake overrides. Fixed in the IR fake override builder.
|
||||
// IGNORE_BACKEND: ANDROID
|
||||
// ^ NSME: java.util.AbstractMap.remove
|
||||
// FULL_JDK
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
// IGNORE_BACKEND_K2: JVM_IR, JS_IR
|
||||
// FIR status: in progress (M.G.), different structure of f/o
|
||||
// FIR status: different structure of fake overrides. Fixed in the IR fake override builder.
|
||||
// IGNORE_BACKEND: ANDROID
|
||||
// ^ NSME: java.util.AbstractMap.remove
|
||||
// FULL_JDK
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
// IGNORE_BACKEND_K2: JVM_IR, JS_IR
|
||||
// FIR status: in progress (M.G.), different structure of f/o
|
||||
// FIR status: different structure of fake overrides. Fixed in the IR fake override builder.
|
||||
// IGNORE_BACKEND: ANDROID
|
||||
// ^ NSME: java.util.AbstractMap.remove
|
||||
// FULL_JDK
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
// IGNORE_BACKEND_K2: JVM_IR, JS_IR
|
||||
// FIR status: in progress (M.G.), different structure of f/o
|
||||
// FIR status: different structure of fake overrides. Fixed in the IR fake override builder.
|
||||
// IGNORE_BACKEND: ANDROID
|
||||
// ^ NSME: java.util.AbstractMap.remove
|
||||
// FULL_JDK
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// SKIP_JDK6
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
|
||||
// FULL_JDK
|
||||
// WITH_STDLIB
|
||||
|
||||
|
||||
@@ -175,13 +175,13 @@ FILE fqName:<root> fileName:/ArrayListOverrides.kt
|
||||
overridden:
|
||||
public open fun toString (): @[EnhancedNullability] kotlin.String declared in java.util.ArrayList
|
||||
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>
|
||||
FUN FAKE_OVERRIDE name:stream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] kotlin.String?> [fake_override]
|
||||
FUN FAKE_OVERRIDE name:stream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] kotlin.String?> [fake_override]
|
||||
overridden:
|
||||
public open fun stream (): @[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
public open fun stream (): @[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.Collection<kotlin.String>
|
||||
FUN FAKE_OVERRIDE name:parallelStream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] kotlin.String?> [fake_override]
|
||||
FUN FAKE_OVERRIDE name:parallelStream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] kotlin.String?> [fake_override]
|
||||
overridden:
|
||||
public open fun parallelStream (): @[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
public open fun parallelStream (): @[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.Collection<kotlin.String>
|
||||
FUN FAKE_OVERRIDE name:removeAt visibility:public modality:OPEN <> ($this:java.util.ArrayList<kotlin.String>, p0:kotlin.Int) returnType:@[EnhancedNullability] kotlin.String [fake_override,operator]
|
||||
overridden:
|
||||
@@ -367,13 +367,13 @@ FILE fqName:<root> fileName:/ArrayListOverrides.kt
|
||||
overridden:
|
||||
public open fun toString (): @[EnhancedNullability] kotlin.String declared in java.util.ArrayList
|
||||
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>
|
||||
FUN FAKE_OVERRIDE name:stream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] kotlin.String?> [fake_override]
|
||||
FUN FAKE_OVERRIDE name:stream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] kotlin.String?> [fake_override]
|
||||
overridden:
|
||||
public open fun stream (): @[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
public open fun stream (): @[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.Collection<kotlin.String>
|
||||
FUN FAKE_OVERRIDE name:parallelStream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] kotlin.String?> [fake_override]
|
||||
FUN FAKE_OVERRIDE name:parallelStream visibility:public modality:OPEN <> ($this:kotlin.collections.Collection<kotlin.String>) returnType:@[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] kotlin.String?> [fake_override]
|
||||
overridden:
|
||||
public open fun parallelStream (): @[EnhancedNullability] java.util.stream.Stream<@[EnhancedNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
public open fun parallelStream (): @[EnhancedNullability] java.util.stream.Stream<@[FlexibleNullability] E of java.util.ArrayList?> declared in java.util.ArrayList
|
||||
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.Collection<kotlin.String>
|
||||
FUN FAKE_OVERRIDE name:removeAt visibility:public modality:OPEN <> ($this:java.util.ArrayList<kotlin.String>, p0:kotlin.Int) returnType:@[EnhancedNullability] kotlin.String [fake_override,operator]
|
||||
overridden:
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ FILE fqName:<root> fileName:/builtinMap.kt
|
||||
$receiver: VALUE_PARAMETER name:$this$apply type:java.util.LinkedHashMap<@[FlexibleNullability] K1 of <root>.plus?, @[FlexibleNullability] V1 of <root>.plus?>
|
||||
BLOCK_BODY
|
||||
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
CALL 'public open fun put (p0: @[EnhancedNullability] K of java.util.LinkedHashMap?, p1: @[EnhancedNullability] V of java.util.LinkedHashMap?): V of java.util.LinkedHashMap? declared in java.util.LinkedHashMap' type=V1 of <root>.plus? origin=null
|
||||
CALL 'public open fun put (p0: @[FlexibleNullability] K of java.util.LinkedHashMap?, p1: @[FlexibleNullability] V of java.util.LinkedHashMap?): V of java.util.LinkedHashMap? declared in java.util.LinkedHashMap' type=V1 of <root>.plus? origin=null
|
||||
$this: GET_VAR '$this$apply: java.util.LinkedHashMap<@[FlexibleNullability] K1 of <root>.plus?, @[FlexibleNullability] V1 of <root>.plus?> declared in <root>.plus.<anonymous>' type=java.util.LinkedHashMap<@[FlexibleNullability] K1 of <root>.plus?, @[FlexibleNullability] V1 of <root>.plus?> origin=null
|
||||
p0: CALL 'public final fun <get-first> (): A of kotlin.Pair declared in kotlin.Pair' type=K1 of <root>.plus origin=GET_PROPERTY
|
||||
$this: GET_VAR 'pair: kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> declared in <root>.plus' type=kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> origin=null
|
||||
|
||||
+5
@@ -6,10 +6,12 @@
|
||||
package org.jetbrains.kotlin.test.backend.ir
|
||||
|
||||
import org.jetbrains.kotlin.test.WrappedException
|
||||
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives
|
||||
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.ENABLE_IR_FAKE_OVERRIDE_GENERATION
|
||||
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION
|
||||
import org.jetbrains.kotlin.test.model.AfterAnalysisChecker
|
||||
import org.jetbrains.kotlin.test.services.TestServices
|
||||
import org.jetbrains.kotlin.test.services.defaultsProvider
|
||||
import org.jetbrains.kotlin.test.services.moduleStructure
|
||||
|
||||
class CodegenWithIrFakeOverrideGeneratorSuppressor(testServices: TestServices) : AfterAnalysisChecker(testServices) {
|
||||
@@ -22,6 +24,9 @@ class CodegenWithIrFakeOverrideGeneratorSuppressor(testServices: TestServices) :
|
||||
AssertionError("Looks like this test can be unmuted. Remove $IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION directive.").wrap()
|
||||
)
|
||||
else emptyList()
|
||||
testServices.defaultsProvider.defaultTargetBackend
|
||||
in testServices.moduleStructure.allDirectives[CodegenTestDirectives.IGNORE_BACKEND_K2] ->
|
||||
emptyList()
|
||||
else -> failedAssertions
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user