From bc47a30dd38ff9312c473005db71b7285a3fbc4c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 9 Nov 2020 18:51:09 +0300 Subject: [PATCH] [FIR] Handle 'EnhancedNullability' more properly This commit includes three changes: 1. 'EnhancedNullability' is no more set for declaration types 2. It is no more used for conversion types in translator 3. Translator inserts implicit not-null cast only when enhanced type is cast to not-null type. --- .../j+k/BasicWithAnnotatedJava.txt | 4 +- .../fir/backend/Fir2IrImplicitCastInserter.kt | 16 ++++++-- .../jetbrains/kotlin/fir/types/TypeUtils.kt | 18 ++++++++- .../org/jetbrains/kotlin/ir/types/irTypes.kt | 12 ++++++ .../inLambdaReturnWithExpectedType.kt | 1 - .../nnStringVsT.kt | 1 - .../nnStringVsTAny.kt | 1 - .../nullCheckOnGenericLambdaReturn.fir.txt | 18 ++++----- .../nullCheckOnLambdaReturn.fir.txt | 3 +- .../nullChecks/enhancedNullability.fir.txt | 38 +++++++++---------- ...llabilityInDestructuringAssignment.fir.txt | 8 ++-- .../nnStringVsT.fir.txt | 19 ---------- .../nullCheckOnLambdaResult/nnStringVsT.kt | 1 + .../nnStringVsTAny.fir.txt | 19 ---------- .../nullCheckOnLambdaResult/nnStringVsTAny.kt | 1 + .../nnStringVsTConstrained.fir.txt | 22 ----------- .../nnStringVsTConstrained.kt | 1 + .../nnStringVsTXArray.fir.txt | 22 ----------- .../nnStringVsTXArray.kt | 1 + .../nnStringVsTXString.fir.txt | 21 ---------- .../nnStringVsTXString.kt | 1 + 21 files changed, 79 insertions(+), 149 deletions(-) delete mode 100644 compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.fir.txt delete mode 100644 compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt delete mode 100644 compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt delete mode 100644 compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt delete mode 100644 compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/BasicWithAnnotatedJava.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/BasicWithAnnotatedJava.txt index ffdcc724784..8eac1f59fba 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/BasicWithAnnotatedJava.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/BasicWithAnnotatedJava.txt @@ -5,8 +5,8 @@ FILE: jvm.kt } public final fun test(): R|kotlin/Unit| { - lval x: R|@EnhancedNullability kotlin/String| = this@R|/User|.R|/Annotated.foo|(String(123)) - lval y: R|@EnhancedNullability kotlin/String| = this@R|/User|.R|/Annotated.foo|(Null(null)) + lval x: R|kotlin/String| = this@R|/User|.R|/Annotated.foo|(String(123)) + lval y: R|kotlin/String| = this@R|/User|.R|/Annotated.foo|(Null(null)) } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt index 7e4409189e8..70a811c31d7 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt @@ -29,7 +29,10 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.removeAnnotations +import org.jetbrains.kotlin.ir.util.classId import org.jetbrains.kotlin.ir.util.coerceToUnitIfNeeded +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.name.Name class Fir2IrImplicitCastInserter( @@ -206,8 +209,7 @@ class Fir2IrImplicitCastInserter( expectedType.isUnit -> { coerceToUnitIfNeeded(type, irBuiltIns) } - // TODO: Not exactly matched with psi2ir yet... - valueType.hasEnhancedNullability() -> { + valueType.hasEnhancedNullability() && !expectedType.acceptsNullValues() -> { insertImplicitNotNullCastIfNeeded(expression) } // TODO: coerceIntToAnotherIntegerType @@ -216,18 +218,24 @@ class Fir2IrImplicitCastInserter( } } + private fun FirTypeRef.acceptsNullValues(): Boolean = + isMarkedNullable == true || hasEnhancedNullability() + private fun IrExpression.insertImplicitNotNullCastIfNeeded(expression: FirExpression): IrExpression { // [TypeOperatorLowering] will retrieve the source (from start offset to end offset) as an assertion message. // Avoid type casting if we can't determine the source for some reasons, e.g., implicit `this` receiver. if (expression.source == null) { return this } + val castType = type.removeAnnotations { + it.symbol.owner.parentAsClass.classId == CompilerConeAttributes.EnhancedNullability.ANNOTATION_CLASS_ID + } return IrTypeOperatorCallImpl( this.startOffset, this.endOffset, - this.type, + castType, IrTypeOperator.IMPLICIT_NOTNULL, - this.type, + castType, this ) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index 1cb4a74e206..6812f529e10 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.classId import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic +import org.jetbrains.kotlin.fir.expressions.classId import org.jetbrains.kotlin.fir.fakeElement import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.fullyExpandedType @@ -83,6 +84,7 @@ fun T.withAttributes(attributes: ConeAttributes): T { is ConeClassLikeTypeImpl -> ConeClassLikeTypeImpl(lookupTag, typeArguments, nullability.isNullable, attributes) is ConeDefinitelyNotNullType -> ConeDefinitelyNotNullType.create(original.withAttributes(attributes))!! is ConeTypeParameterTypeImpl -> ConeTypeParameterTypeImpl(lookupTag, nullability.isNullable, attributes) + is ConeFlexibleType -> ConeFlexibleType(lowerBound.withAttributes(attributes), upperBound.withAttributes(attributes)) else -> error("Not supported: $this: ${this.render()}") } as T } @@ -186,6 +188,20 @@ fun FirTypeRef.isUnsafeVarianceType(session: FirSession): Boolean { fun FirTypeRef.hasEnhancedNullability(): Boolean = coneTypeSafe()?.hasEnhancedNullability == true +fun FirTypeRef.withoutEnhancedNullability(): FirTypeRef { + require(this is FirResolvedTypeRef) + if (!hasEnhancedNullability()) return this + return buildResolvedTypeRef { + source = this@withoutEnhancedNullability.source + type = this@withoutEnhancedNullability.type.withAttributes( + ConeAttributes.create( + this@withoutEnhancedNullability.type.attributes.filter { it != CompilerConeAttributes.EnhancedNullability } + ) + ) + annotations += this@withoutEnhancedNullability.annotations + } +} + // Unlike other cases, return types may be implicit, i.e. unresolved // But in that cases newType should also be `null` fun FirTypeRef.withReplacedReturnType(newType: ConeKotlinType?): FirTypeRef { @@ -240,7 +256,7 @@ fun FirTypeRef.approximatedIfNeededOrSelf( } else { this } - return approximatedType.hideLocalTypeIfNeeded(containingCallableVisibility, isInlineFunction) + return approximatedType.hideLocalTypeIfNeeded(containingCallableVisibility, isInlineFunction).withoutEnhancedNullability() } private fun ConeKotlinType.requiresApproximationInPublicPosition(): Boolean { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt index c9a4c157a3f..6bfe07779c8 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt @@ -50,6 +50,18 @@ fun IrType.addAnnotations(newAnnotations: List): IrType = this } +fun IrType.removeAnnotations(predicate: (IrConstructorCall) -> Boolean): IrType = + when (this) { + is IrSimpleType -> + toBuilder().apply { + annotations = annotations.filterNot(predicate) + }.buildSimpleType() + is IrDynamicType -> + IrDynamicTypeImpl(null, annotations.filterNot(predicate), Variance.INVARIANT) + else -> + this + } + val IrType.classifierOrFail: IrClassifierSymbol get() = cast().classifier diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt index 2ca7b63cdc6..1961949d271 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: inLambdaReturnWithExpectedType.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt index 04b0eb2de71..996466da788 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_FIR: JVM_IR // FILE: nnStringVsT.kt fun useT(fn: () -> T) = fn() diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTAny.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTAny.kt index dc9b2752e44..15e6fc82292 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTAny.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTAny.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_FIR: JVM_IR // FILE: nnStringVsTAny.kt fun useTAny(fn: () -> T) = fn() diff --git a/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt b/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt index f02163b61dc..e3d4542de79 100644 --- a/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt +++ b/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt @@ -41,18 +41,17 @@ FILE fqName: fileName:/nullCheckOnGenericLambdaReturn.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.String? declared in .test1' CALL 'public open fun foo (): kotlin.String? declared in .J' type=kotlin.String? origin=null - FUN name:test2 visibility:public modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String + FUN name:test2 visibility:public modality:FINAL <> () returnType:kotlin.String BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun test2 (): @[EnhancedNullability] kotlin.String declared in ' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + RETURN type=kotlin.Nothing from='public final fun test2 (): kotlin.String declared in ' + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public final fun checkT (fn: kotlin.Function0.checkT>): T of .checkT declared in ' type=@[EnhancedNullability] kotlin.String origin=null : @[EnhancedNullability] kotlin.String fn: FUN_EXPR type=kotlin.Function0<@[EnhancedNullability] kotlin.String> origin=LAMBDA FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): @[EnhancedNullability] kotlin.String declared in .test2' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun nnFoo (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null + CALL 'public open fun nnFoo (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null FUN name:test3 visibility:public modality:FINAL <> () returnType:kotlin.String? BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun test3 (): kotlin.String? declared in ' @@ -63,15 +62,14 @@ FILE fqName: fileName:/nullCheckOnGenericLambdaReturn.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.String? declared in .test3' CALL 'public open fun foo (): kotlin.String? declared in .J' type=kotlin.String? origin=null - FUN name:test4 visibility:public modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String + FUN name:test4 visibility:public modality:FINAL <> () returnType:kotlin.String BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun test4 (): @[EnhancedNullability] kotlin.String declared in ' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + RETURN type=kotlin.Nothing from='public final fun test4 (): kotlin.String declared in ' + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public final fun checkTAny (fn: kotlin.Function0.checkTAny>): T of .checkTAny declared in ' type=@[EnhancedNullability] kotlin.String origin=null : @[EnhancedNullability] kotlin.String fn: FUN_EXPR type=kotlin.Function0<@[EnhancedNullability] kotlin.String> origin=LAMBDA FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): @[EnhancedNullability] kotlin.String declared in .test4' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun nnFoo (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null + CALL 'public open fun nnFoo (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null diff --git a/compiler/testData/ir/irText/expressions/nullCheckOnLambdaReturn.fir.txt b/compiler/testData/ir/irText/expressions/nullCheckOnLambdaReturn.fir.txt index aec0567ec79..5119c9fe99e 100644 --- a/compiler/testData/ir/irText/expressions/nullCheckOnLambdaReturn.fir.txt +++ b/compiler/testData/ir/irText/expressions/nullCheckOnLambdaReturn.fir.txt @@ -85,5 +85,4 @@ FILE fqName: fileName:/nullCheckOnLambdaReturn.kt FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.Any? BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.Any? declared in .test6' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun nnFoo (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null + CALL 'public open fun nnFoo (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt b/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt index 2ce0a6f5add..be18c790bcc 100644 --- a/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt @@ -5,51 +5,49 @@ FILE fqName: fileName:/enhancedNullability.kt FUN name:testUse visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY CALL 'public final fun use (s: kotlin.String): kotlin.Unit declared in ' type=kotlin.Unit origin=null - s: TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + s: TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null FUN name:testLocalVal visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY - VAR name:local type:@[EnhancedNullability] kotlin.String [val] - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + VAR name:local type:kotlin.String [val] + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null - FUN name:testReturnValue visibility:public modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String + FUN name:testReturnValue visibility:public modality:FINAL <> () returnType:kotlin.String BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun testReturnValue (): @[EnhancedNullability] kotlin.String declared in ' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + RETURN type=kotlin.Nothing from='public final fun testReturnValue (): kotlin.String declared in ' + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null PROPERTY name:testGlobalVal visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:testGlobalVal type:@[EnhancedNullability] kotlin.String visibility:private [final,static] + FIELD PROPERTY_BACKING_FIELD name:testGlobalVal type:kotlin.String visibility:private [final,static] EXPRESSION_BODY - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String correspondingProperty: PROPERTY name:testGlobalVal visibility:public modality:FINAL [val] BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): @[EnhancedNullability] kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:testGlobalVal type:@[EnhancedNullability] kotlin.String visibility:private [final,static]' type=@[EnhancedNullability] kotlin.String origin=null + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:testGlobalVal type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null PROPERTY name:testGlobalValGetter visibility:public modality:FINAL [val] - FUN name: visibility:public modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String + FUN name: visibility:public modality:FINAL <> () returnType:kotlin.String correspondingProperty: PROPERTY name:testGlobalValGetter visibility:public modality:FINAL [val] BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): @[EnhancedNullability] kotlin.String declared in ' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null FUN name:testJUse visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY CALL 'public open fun use (s: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in .J' type=kotlin.Unit origin=null s: CALL 'public open fun nullString (): kotlin.String? declared in .J' type=kotlin.String? origin=null CALL 'public open fun use (s: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in .J' type=kotlin.Unit origin=null - s: TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null + s: CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null FUN name:testLocalVarUse visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY VAR name:ns type:kotlin.String? [val] CALL 'public open fun nullString (): kotlin.String? declared in .J' type=kotlin.String? origin=null CALL 'public open fun use (s: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in .J' type=kotlin.Unit origin=null s: GET_VAR 'val ns: kotlin.String? [val] declared in .testLocalVarUse' type=kotlin.String? origin=null - VAR name:nns type:@[EnhancedNullability] kotlin.String [val] - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String + VAR name:nns type:kotlin.String [val] + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null CALL 'public open fun use (s: @[EnhancedNullability] kotlin.String): kotlin.Unit declared in .J' type=kotlin.Unit origin=null - s: TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - GET_VAR 'val nns: @[EnhancedNullability] kotlin.String [val] declared in .testLocalVarUse' type=@[EnhancedNullability] kotlin.String origin=null + s: GET_VAR 'val nns: kotlin.String [val] declared in .testLocalVarUse' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.txt b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.txt index d1148c6f48f..dddbf8dfcb7 100644 --- a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.txt @@ -117,15 +117,15 @@ FILE fqName: fileName:/enhancedNullabilityInDestructuringAssignment.kt $this: VALUE_PARAMETER name: type:kotlin.Any FUN name:test1 visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY - VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:@[EnhancedNullability] .P [val] - TYPE_OP type=@[EnhancedNullability] .P origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] .P + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:.P [val] + TYPE_OP type=.P origin=IMPLICIT_NOTNULL typeOperand=.P CALL 'public open fun notNullP (): @[EnhancedNullability] .P declared in .J' type=@[EnhancedNullability] .P origin=null VAR name:x type:kotlin.Int [val] CALL 'public final fun component1 (): kotlin.Int [operator] declared in .P' type=kotlin.Int origin=null - $this: GET_VAR 'val tmp_0: @[EnhancedNullability] .P [val] declared in .test1' type=@[EnhancedNullability] .P origin=null + $this: GET_VAR 'val tmp_0: .P [val] declared in .test1' type=.P origin=null VAR name:y type:kotlin.Int [val] CALL 'public final fun component2 (): kotlin.Int [operator] declared in .P' type=kotlin.Int origin=null - $this: GET_VAR 'val tmp_0: @[EnhancedNullability] .P [val] declared in .test1' type=@[EnhancedNullability] .P origin=null + $this: GET_VAR 'val tmp_0: .P [val] declared in .test1' type=.P origin=null CALL 'public final fun use (x: kotlin.Any, y: kotlin.Any): kotlin.Unit declared in ' type=kotlin.Unit origin=null x: GET_VAR 'val x: kotlin.Int [val] declared in .test1' type=kotlin.Int origin=null y: GET_VAR 'val y: kotlin.Int [val] declared in .test1' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.fir.txt deleted file mode 100644 index 7132149f574..00000000000 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.fir.txt +++ /dev/null @@ -1,19 +0,0 @@ -FILE fqName: fileName:/nnStringVsT.kt - FUN name:useT visibility:public modality:FINAL (fn:kotlin.Function0.useT>) returnType:T of .useT - TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] - VALUE_PARAMETER name:fn index:0 type:kotlin.Function0.useT> - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun useT (fn: kotlin.Function0.useT>): T of .useT declared in ' - CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of .useT origin=INVOKE - $this: GET_VAR 'fn: kotlin.Function0.useT> declared in .useT' type=kotlin.Function0.useT> origin=VARIABLE_AS_FUNCTION - FUN name:testNoNullCheck visibility:public modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit - CALL 'public final fun useT (fn: kotlin.Function0.useT>): T of .useT declared in ' type=@[EnhancedNullability] kotlin.String origin=null - : @[EnhancedNullability] kotlin.String - fn: FUN_EXPR type=kotlin.Function0<@[EnhancedNullability] kotlin.String> origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String - BLOCK_BODY - RETURN type=kotlin.Nothing from='local final fun (): @[EnhancedNullability] kotlin.String declared in .testNoNullCheck' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.kt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.kt index 1ef154d4831..80d46a0c9fb 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.kt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: nnStringVsT.kt fun useT(fn: () -> T) = fn() diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt deleted file mode 100644 index 0b23a275c83..00000000000 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt +++ /dev/null @@ -1,19 +0,0 @@ -FILE fqName: fileName:/nnStringVsTAny.kt - FUN name:useTAny visibility:public modality:FINAL (fn:kotlin.Function0.useTAny>) returnType:T of .useTAny - TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any] - VALUE_PARAMETER name:fn index:0 type:kotlin.Function0.useTAny> - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun useTAny (fn: kotlin.Function0.useTAny>): T of .useTAny declared in ' - CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of .useTAny origin=INVOKE - $this: GET_VAR 'fn: kotlin.Function0.useTAny> declared in .useTAny' type=kotlin.Function0.useTAny> origin=VARIABLE_AS_FUNCTION - FUN name:testNoNullCheck visibility:public modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit - CALL 'public final fun useTAny (fn: kotlin.Function0.useTAny>): T of .useTAny declared in ' type=@[EnhancedNullability] kotlin.String origin=null - : @[EnhancedNullability] kotlin.String - fn: FUN_EXPR type=kotlin.Function0<@[EnhancedNullability] kotlin.String> origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:@[EnhancedNullability] kotlin.String - BLOCK_BODY - RETURN type=kotlin.Nothing from='local final fun (): @[EnhancedNullability] kotlin.String declared in .testNoNullCheck' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.kt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.kt index 6e63d7863f3..7b050e5553f 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.kt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: nnStringVsTAny.kt fun useTAny(fn: () -> T) = fn() diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt deleted file mode 100644 index 234116f4d99..00000000000 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt +++ /dev/null @@ -1,22 +0,0 @@ -FILE fqName: fileName:/nnStringVsTConstrained.kt - FUN name:useTConstrained visibility:public modality:FINAL (xs:kotlin.Array.useTConstrained>, fn:kotlin.Function0.useTConstrained>) returnType:T of .useTConstrained - TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] - VALUE_PARAMETER name:xs index:0 type:kotlin.Array.useTConstrained> - VALUE_PARAMETER name:fn index:1 type:kotlin.Function0.useTConstrained> - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun useTConstrained (xs: kotlin.Array.useTConstrained>, fn: kotlin.Function0.useTConstrained>): T of .useTConstrained declared in ' - CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of .useTConstrained origin=INVOKE - $this: GET_VAR 'fn: kotlin.Function0.useTConstrained> declared in .useTConstrained' type=kotlin.Function0.useTConstrained> origin=VARIABLE_AS_FUNCTION - FUN name:testWithNullCheck visibility:public modality:FINAL <> (xs:kotlin.Array) returnType:kotlin.Unit - VALUE_PARAMETER name:xs index:0 type:kotlin.Array - BLOCK_BODY - TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit - CALL 'public final fun useTConstrained (xs: kotlin.Array.useTConstrained>, fn: kotlin.Function0.useTConstrained>): T of .useTConstrained declared in ' type=kotlin.String origin=null - : kotlin.String - xs: GET_VAR 'xs: kotlin.Array declared in .testWithNullCheck' type=kotlin.Array origin=null - fn: FUN_EXPR type=kotlin.Function0 origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.String - BLOCK_BODY - RETURN type=kotlin.Nothing from='local final fun (): kotlin.String declared in .testWithNullCheck' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.kt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.kt index 3a57193e5b8..67135c9a3a3 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.kt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: nnStringVsTConstrained.kt fun useTConstrained(xs: Array, fn: () -> T) = fn() diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt deleted file mode 100644 index 8f4c8a65cc3..00000000000 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt +++ /dev/null @@ -1,22 +0,0 @@ -FILE fqName: fileName:/nnStringVsTXArray.kt - FUN name:useTX visibility:public modality:FINAL (x:T of .useTX, fn:kotlin.Function0.useTX>) returnType:T of .useTX - TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] - VALUE_PARAMETER name:x index:0 type:T of .useTX - VALUE_PARAMETER name:fn index:1 type:kotlin.Function0.useTX> - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun useTX (x: T of .useTX, fn: kotlin.Function0.useTX>): T of .useTX declared in ' - CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of .useTX origin=INVOKE - $this: GET_VAR 'fn: kotlin.Function0.useTX> declared in .useTX' type=kotlin.Function0.useTX> origin=VARIABLE_AS_FUNCTION - FUN name:testWithNullCheck visibility:public modality:FINAL <> (xs:kotlin.Array) returnType:kotlin.Unit - VALUE_PARAMETER name:xs index:0 type:kotlin.Array - BLOCK_BODY - TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit - CALL 'public final fun useTX (x: T of .useTX, fn: kotlin.Function0.useTX>): T of .useTX declared in ' type=java.io.Serializable origin=null - : java.io.Serializable - x: GET_VAR 'xs: kotlin.Array declared in .testWithNullCheck' type=kotlin.Array origin=null - fn: FUN_EXPR type=kotlin.Function0 origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:java.io.Serializable - BLOCK_BODY - RETURN type=kotlin.Nothing from='local final fun (): java.io.Serializable declared in .testWithNullCheck' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.kt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.kt index 43bcbfe5210..b7422ecf6bb 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.kt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: nnStringVsTXArray.kt fun useTX(x: T, fn: () -> T) = fn() diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt deleted file mode 100644 index 836c4198532..00000000000 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt +++ /dev/null @@ -1,21 +0,0 @@ -FILE fqName: fileName:/nnStringVsTXString.kt - FUN name:useTX visibility:public modality:FINAL (x:T of .useTX, fn:kotlin.Function0.useTX>) returnType:T of .useTX - TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] - VALUE_PARAMETER name:x index:0 type:T of .useTX - VALUE_PARAMETER name:fn index:1 type:kotlin.Function0.useTX> - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun useTX (x: T of .useTX, fn: kotlin.Function0.useTX>): T of .useTX declared in ' - CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of .useTX origin=INVOKE - $this: GET_VAR 'fn: kotlin.Function0.useTX> declared in .useTX' type=kotlin.Function0.useTX> origin=VARIABLE_AS_FUNCTION - FUN name:testWithNullCheck visibility:public modality:FINAL <> () returnType:kotlin.Unit - BLOCK_BODY - TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit - CALL 'public final fun useTX (x: T of .useTX, fn: kotlin.Function0.useTX>): T of .useTX declared in ' type=kotlin.String origin=null - : kotlin.String - x: CONST String type=kotlin.String value="" - fn: FUN_EXPR type=kotlin.Function0 origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.String - BLOCK_BODY - RETURN type=kotlin.Nothing from='local final fun (): kotlin.String declared in .testWithNullCheck' - TYPE_OP type=@[EnhancedNullability] kotlin.String origin=IMPLICIT_NOTNULL typeOperand=@[EnhancedNullability] kotlin.String - CALL 'public open fun notNullString (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.kt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.kt index c1879f227ba..12dee7899cf 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.kt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: nnStringVsTXString.kt fun useTX(x: T, fn: () -> T) = fn()