From 46cc01602e9afc70bca0d94e9780e34f0f344120 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Sun, 18 Oct 2020 23:36:47 -0700 Subject: [PATCH] FIR2IR: add implicit NOT_NULL cast if needed --- .../j+k/BasicWithAnnotatedJava.txt | 4 +- .../fir/types/CompilerConeAttributes.kt | 16 +++++ .../kotlin/fir/backend/Fir2IrTypeConverter.kt | 3 +- .../kotlin/fir/backend/Fir2IrVisitor.kt | 18 +++++ .../jetbrains/kotlin/fir/java/JavaUtils.kt | 70 +++++++++++++------ .../enhancement/EnhancementSignatureParts.kt | 11 ++- .../fir/java/enhancement/javaTypeUtils.kt | 11 ++- .../fir/java/enhancement/nullabilityUtils.kt | 2 +- .../kotlin/fir/types/FirTypeUtils.kt | 7 +- .../kotlin/fir/types/TypeConstructionUtils.kt | 6 +- .../inFunctionWithExpressionBody.kt | 1 - .../inLambdaReturnWithExpectedType.kt | 1 + .../inLocalFunctionWithExpressionBody.kt | 1 - .../inLocalVariableInitializer.kt | 1 - .../inMemberPropertyInitializer.kt | 1 - .../inPropertyGetterWithExpressionBody.kt | 1 - .../inTopLevelPropertyInitializer.kt | 1 - .../nnStringVsT.kt | 1 + .../nnStringVsTAny.kt | 1 + .../nnStringVsTConstrained.kt | 1 - .../nnStringVsTXArray.kt | 1 - .../nnStringVsTXString.kt | 1 - .../javaNullCheckThrowsIse_1_3.kt | 1 - .../javaNullCheckThrowsNpe.kt | 1 - .../deterministicNotNullChecks.kt | 3 + .../nullCheckOnGenericLambdaReturn.fir.txt | 32 +++++---- .../nullCheckOnLambdaReturn.fir.txt | 3 +- .../typeParametersInImplicitCast.fir.txt | 7 +- .../nullChecks/enhancedNullability.fir.txt | 24 ++++--- ...llabilityInDestructuringAssignment.fir.txt | 3 +- .../nnStringVsT.fir.txt | 3 +- .../nnStringVsTAny.fir.txt | 3 +- .../nnStringVsTConstrained.fir.txt | 3 +- .../nnStringVsTXArray.fir.txt | 3 +- .../nnStringVsTXString.fir.txt | 3 +- .../modality/ModalityOfFakeOverrides.fir.txt | 2 +- .../LoadIterableWithNullability.fir.txt | 4 +- .../ReadOnlyExtendsWildcard.fir.txt | 2 +- .../compiledJava/notNull/NotNullField.fir.txt | 2 +- .../notNull/NotNullIntArray.fir.txt | 2 +- .../notNull/NotNullMethod.fir.txt | 2 +- .../notNull/NotNullObjectArray.fir.txt | 2 +- .../notNull/NotNullParameter.fir.txt | 2 +- .../ConstructorWithAnnotations.fir.txt | 2 +- 44 files changed, 181 insertions(+), 88 deletions(-) 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 8eac1f59fba..ffdcc724784 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|kotlin/String| = this@R|/User|.R|/Annotated.foo|(String(123)) - lval y: R|kotlin/String| = this@R|/User|.R|/Annotated.foo|(Null(null)) + 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)) } } diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/CompilerConeAttributes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/CompilerConeAttributes.kt index fe651b30902..d0dfaaaccd5 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/CompilerConeAttributes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/CompilerConeAttributes.kt @@ -35,6 +35,18 @@ object CompilerConeAttributes { override fun toString(): String = "@NoInfer" } + object EnhancedNullability : ConeAttribute() { + val ANNOTATION_CLASS_ID = ClassId(FqName("kotlin.jvm.internal"), Name.identifier("EnhancedNullability")) + + override fun union(other: EnhancedNullability?): EnhancedNullability? = other + override fun intersect(other: EnhancedNullability?): EnhancedNullability? = this + override fun isSubtypeOf(other: EnhancedNullability?): Boolean = true + + override val key: KClass = EnhancedNullability::class + + override fun toString(): String = "@EnhancedNullability" + } + object ExtensionFunctionType : ConeAttribute() { val ANNOTATION_CLASS_ID = ClassId(FqName("kotlin"), Name.identifier("ExtensionFunctionType")) @@ -62,8 +74,12 @@ object CompilerConeAttributes { val ConeAttributes.exact: CompilerConeAttributes.Exact? by ConeAttributes.attributeAccessor() val ConeAttributes.noInfer: CompilerConeAttributes.NoInfer? by ConeAttributes.attributeAccessor() +val ConeAttributes.enhancedNullability: CompilerConeAttributes.EnhancedNullability? by ConeAttributes.attributeAccessor() val ConeAttributes.extensionFunctionType: CompilerConeAttributes.ExtensionFunctionType? by ConeAttributes.attributeAccessor() val ConeAttributes.unsafeVarianceType: CompilerConeAttributes.UnsafeVariance? by ConeAttributes.attributeAccessor() +val ConeKotlinType.hasEnhancedNullability: Boolean + get() = attributes.enhancedNullability != null + val ConeKotlinType.isExtensionFunctionType: Boolean get() = attributes.extensionFunctionType != null diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt index a904717d734..198fb7dc051 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt @@ -87,8 +87,9 @@ class Fir2IrTypeConverter( firSymbol.toSymbol(session, classifierStorage, typeContext) } val typeAnnotations: MutableList = - if (attributes.extensionFunctionType == null) mutableListOf() + if (!isExtensionFunctionType) mutableListOf() else mutableListOf(builtIns.extensionFunctionTypeAnnotationConstructorCall()) + // TODO: Need to convert @EnhancedNullability ? typeAnnotations += with(annotationGenerator) { annotations.toIrAnnotations() } IrSimpleTypeImpl( irSymbol, !typeContext.definitelyNotNull && this.isMarkedNullable, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 93c850632e3..29b0844f3f0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -542,7 +542,25 @@ class Fir2IrVisitor( expression.accept(this, null) as IrExpression } } + }.insertImplicitNotNullCastIfNeeded(expression) + } + + private fun IrExpression.insertImplicitNotNullCastIfNeeded(expression: FirExpression): IrExpression { + if (this is IrTypeOperatorCall && this.operator == IrTypeOperator.IMPLICIT_NOTNULL) { + return this } + // TODO: Other conditions to check? + if (expression.typeRef.coneTypeSafe()?.hasEnhancedNullability != true) { + return this + } + return IrTypeOperatorCallImpl( + this.startOffset, + this.endOffset, + this.type, + IrTypeOperator.IMPLICIT_NOTNULL, + this.type, + this + ) } private fun convertToIrReceiverExpression( diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 54bb1411839..6b25f9326f6 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -61,10 +61,11 @@ internal val JavaClass.classKind: ClassKind internal fun ClassId.toConeKotlinType( typeArguments: Array, - isNullable: Boolean + isNullable: Boolean, + attributes: ConeAttributes = ConeAttributes.Empty ): ConeLookupTagBasedType { val lookupTag = ConeClassLikeLookupTagImpl(this) - return ConeClassLikeTypeImpl(lookupTag, typeArguments, isNullable) + return ConeClassLikeTypeImpl(lookupTag, typeArguments, isNullable, attributes) } internal fun FirTypeRef.toConeKotlinTypeProbablyFlexible( @@ -110,11 +111,17 @@ internal fun JavaType?.toConeKotlinTypeWithoutEnhancement( session: FirSession, javaTypeParameterStack: JavaTypeParameterStack, forAnnotationValueParameter: Boolean = false, - isForSupertypes: Boolean = false + isForSupertypes: Boolean = false, + attributes: ConeAttributes = ConeAttributes.Empty ): ConeKotlinType { return when (this) { is JavaClassifierType -> { - toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack, forAnnotationValueParameter = forAnnotationValueParameter) + toConeKotlinTypeWithoutEnhancement( + session, + javaTypeParameterStack, + forAnnotationValueParameter = forAnnotationValueParameter, + attributes = attributes + ) } is JavaPrimitiveType -> { val primitiveType = type @@ -124,14 +131,26 @@ internal fun JavaType?.toConeKotlinTypeWithoutEnhancement( } val classId = StandardClassIds.byName(kotlinPrimitiveName) - classId.toConeKotlinType(emptyArray(), isNullable = false) + classId.toConeKotlinType(emptyArray(), isNullable = false, attributes) } is JavaArrayType -> { - toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack, forAnnotationValueParameter, isForSupertypes) - } - is JavaWildcardType -> bound?.toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack, isForSupertypes = isForSupertypes) ?: run { - StandardClassIds.Any.toConeFlexibleType(emptyArray()) + toConeKotlinTypeWithoutEnhancement( + session, + javaTypeParameterStack, + forAnnotationValueParameter, + isForSupertypes, + attributes = attributes + ) } + is JavaWildcardType -> + bound?.toConeKotlinTypeWithoutEnhancement( + session, + javaTypeParameterStack, + isForSupertypes = isForSupertypes, + attributes = attributes + ) ?: run { + StandardClassIds.Any.toConeFlexibleType(emptyArray()) + } null -> { StandardClassIds.Any.toConeFlexibleType(emptyArray()) } @@ -143,7 +162,8 @@ private fun JavaArrayType.toConeKotlinTypeWithoutEnhancement( session: FirSession, javaTypeParameterStack: JavaTypeParameterStack, forAnnotationValueParameter: Boolean = false, - isForSupertypes: Boolean + isForSupertypes: Boolean, + attributes: ConeAttributes = ConeAttributes.Empty ): ConeKotlinType { val componentType = componentType return if (componentType !is JavaPrimitiveType) { @@ -152,11 +172,12 @@ private fun JavaArrayType.toConeKotlinTypeWithoutEnhancement( session, javaTypeParameterStack, forAnnotationValueParameter, isForSupertypes ) if (forAnnotationValueParameter) { - classId.constructClassLikeType(arrayOf(argumentType), isNullable = false) + classId.constructClassLikeType(arrayOf(argumentType), isNullable = false, attributes = attributes) } else { classId.toConeFlexibleType( arrayOf(argumentType), - typeArgumentsForUpper = arrayOf(ConeKotlinTypeProjectionOut(argumentType)) + typeArgumentsForUpper = arrayOf(ConeKotlinTypeProjectionOut(argumentType)), + attributes = attributes ) } } else { @@ -164,19 +185,20 @@ private fun JavaArrayType.toConeKotlinTypeWithoutEnhancement( val classId = StandardClassIds.byName(javaComponentName + "Array") if (forAnnotationValueParameter) { - classId.constructClassLikeType(emptyArray(), isNullable = false) + classId.constructClassLikeType(emptyArray(), isNullable = false, attributes = attributes) } else { - classId.toConeFlexibleType(emptyArray()) + classId.toConeFlexibleType(emptyArray(), attributes = attributes) } } } private fun ClassId.toConeFlexibleType( typeArguments: Array, - typeArgumentsForUpper: Array = typeArguments + typeArgumentsForUpper: Array = typeArguments, + attributes: ConeAttributes = ConeAttributes.Empty ) = ConeFlexibleType( - toConeKotlinType(typeArguments, isNullable = false), - toConeKotlinType(typeArgumentsForUpper, isNullable = true) + toConeKotlinType(typeArguments, isNullable = false, attributes), + toConeKotlinType(typeArgumentsForUpper, isNullable = true, attributes) ) private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( @@ -184,7 +206,8 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( javaTypeParameterStack: JavaTypeParameterStack, forTypeParameterBounds: Boolean = false, isForSupertypes: Boolean = false, - forAnnotationValueParameter: Boolean = false + forAnnotationValueParameter: Boolean = false, + attributes: ConeAttributes = ConeAttributes.Empty ): ConeKotlinType { val lowerBound = toConeKotlinTypeForFlexibleBound( session, @@ -192,7 +215,8 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( isLowerBound = true, forTypeParameterBounds, isForSupertypes, - forAnnotationValueParameter = forAnnotationValueParameter + forAnnotationValueParameter = forAnnotationValueParameter, + attributes = attributes ) if (forAnnotationValueParameter) { return lowerBound @@ -205,7 +229,8 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( forTypeParameterBounds, isForSupertypes, lowerBound, - forAnnotationValueParameter = forAnnotationValueParameter + forAnnotationValueParameter = forAnnotationValueParameter, + attributes = attributes ) return if (isRaw) ConeRawType(lowerBound, upperBound) else ConeFlexibleType(lowerBound, upperBound) @@ -308,7 +333,8 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound( forTypeParameterBounds: Boolean, isForSupertypes: Boolean, lowerBound: ConeLookupTagBasedType? = null, - forAnnotationValueParameter: Boolean = false + forAnnotationValueParameter: Boolean = false, + attributes: ConeAttributes = ConeAttributes.Empty ): ConeLookupTagBasedType { return when (val classifier = classifier) { is JavaClass -> { @@ -357,7 +383,7 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound( } lookupTag.constructClassType( - mappedTypeArguments.toTypedArray(), isNullable = !isLowerBound + mappedTypeArguments.toTypedArray(), isNullable = !isLowerBound, attributes ) } is JavaTypeParameter -> { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt index 86cdbc8d4e3..cf0c7b726aa 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt @@ -42,6 +42,8 @@ internal class EnhancementSignatureParts( ) { private val isForVarargParameter get() = typeContainer.safeAs()?.isVararg == true + private val attributesCache = mutableMapOf().withDefault { ConeAttributes.Empty } + private fun ConeKotlinType.toFqNameUnsafe(): FqNameUnsafe? = ((this as? ConeLookupTagBasedType)?.lookupTag as? ConeClassLikeLookupTag)?.classId?.asSingleFqName()?.toUnsafe() @@ -62,7 +64,8 @@ internal class EnhancementSignatureParts( val typeWithoutEnhancement = current.type.toConeKotlinTypeWithoutEnhancement( session, javaTypeParameterStack, - forAnnotationValueParameter + forAnnotationValueParameter, + attributes = attributesCache.getValue(current) ) val containsFunctionN = typeWithoutEnhancement.contains { if (it is ConeClassErrorType) false @@ -204,7 +207,11 @@ internal class EnhancementSignatureParts( else defaultQualifiersForType - val nullabilityInfo = composedAnnotation.extractNullability(typeQualifierResolver, javaTypeEnhancementState) + val nullabilityInfo = composedAnnotation.extractNullability(typeQualifierResolver, javaTypeEnhancementState).also { + if (it?.qualifier == NullabilityQualifier.NOT_NULL) { + attributesCache[this] = composedAnnotation.computeTypeAttributesForJavaType() + } + } ?: defaultTypeQualifier?.nullabilityQualifier?.let { nullability -> NullabilityQualifierWithMigrationStatus( nullability.qualifier, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt index 10a980e944e..535431ee6ff 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt @@ -13,14 +13,11 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression -import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.java.declarations.FirJavaField import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference @@ -327,3 +324,11 @@ internal fun FirValueParameter.getDefaultValueFromAnnotation(): AnnotationDefaul private val DEFAULT_VALUE_ID = ClassId.topLevel(DEFAULT_VALUE_FQ_NAME) private val DEFAULT_NULL_ID = ClassId.topLevel(DEFAULT_NULL_FQ_NAME) +internal fun List.computeTypeAttributesForJavaType(): ConeAttributes = + computeTypeAttributes { classId -> + when (classId) { + CompilerConeAttributes.EnhancedNullability.ANNOTATION_CLASS_ID -> add(CompilerConeAttributes.EnhancedNullability) + // TODO: Need to handle others too? E.g., COMPATQUAL_NONNULL_ANNOTATION_ID + in NOT_NULL_ANNOTATION_IDS -> add(CompilerConeAttributes.EnhancedNullability) + } + } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt index c70e1bf9f70..4f42a617130 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt @@ -82,7 +82,7 @@ private fun FirAnnotationCall.extractNullabilityTypeFromArgument(): NullabilityQ } private val NULLABLE_ANNOTATION_IDS = NULLABLE_ANNOTATIONS.map { ClassId.topLevel(it) } -private val NOT_NULL_ANNOTATION_IDS = NOT_NULL_ANNOTATIONS.map { ClassId.topLevel(it) } +val NOT_NULL_ANNOTATION_IDS = NOT_NULL_ANNOTATIONS.map { ClassId.topLevel(it) } private val JAVAX_NONNULL_ANNOTATION_ID = ClassId.topLevel(JAVAX_NONNULL_ANNOTATION) private val COMPATQUAL_NULLABLE_ANNOTATION_ID = ClassId.topLevel(COMPATQUAL_NULLABLE_ANNOTATION) private val COMPATQUAL_NONNULL_ANNOTATION_ID = ClassId.topLevel(COMPATQUAL_NONNULL_ANNOTATION) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirTypeUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirTypeUtils.kt index ad124b8b506..28022b87cdd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirTypeUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirTypeUtils.kt @@ -87,16 +87,19 @@ fun ConeClassLikeType.toConstKind(): FirConstKind<*>? = when (lookupTag.classId) else -> null } -fun List.computeTypeAttributes(): ConeAttributes { +fun List.computeTypeAttributes( + additionalProcessor: MutableList>.(ClassId) -> Unit = {} +): ConeAttributes { if (this.isEmpty()) return ConeAttributes.Empty val attributes = mutableListOf>() for (annotation in this) { val type = annotation.annotationTypeRef.coneTypeSafe() ?: continue - when (type.lookupTag.classId) { + when (val classId = type.lookupTag.classId) { CompilerConeAttributes.Exact.ANNOTATION_CLASS_ID -> attributes += CompilerConeAttributes.Exact CompilerConeAttributes.NoInfer.ANNOTATION_CLASS_ID -> attributes += CompilerConeAttributes.NoInfer CompilerConeAttributes.ExtensionFunctionType.ANNOTATION_CLASS_ID -> attributes += CompilerConeAttributes.ExtensionFunctionType CompilerConeAttributes.UnsafeVariance.ANNOTATION_CLASS_ID -> attributes += CompilerConeAttributes.UnsafeVariance + else -> additionalProcessor.invoke(attributes, classId) } } return ConeAttributes.create(attributes) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/TypeConstructionUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/TypeConstructionUtils.kt index 167a0c9cfe1..5f4469e30dd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/TypeConstructionUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/TypeConstructionUtils.kt @@ -27,14 +27,16 @@ fun ConeClassifierLookupTag.constructType( fun ConeClassLikeLookupTag.constructClassType( typeArguments: Array, isNullable: Boolean, + attributes: ConeAttributes = ConeAttributes.Empty ): ConeClassLikeType { - return ConeClassLikeTypeImpl(this, typeArguments, isNullable) + return ConeClassLikeTypeImpl(this, typeArguments, isNullable, attributes) } fun ClassId.constructClassLikeType( typeArguments: Array, isNullable: Boolean, + attributes: ConeAttributes = ConeAttributes.Empty ): ConeClassLikeType { - return ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(this), typeArguments, isNullable) + return ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(this), typeArguments, isNullable, attributes) } diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inFunctionWithExpressionBody.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inFunctionWithExpressionBody.kt index 6ce7005fa31..46bc59870f2 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inFunctionWithExpressionBody.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inFunctionWithExpressionBody.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: box.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt index 1961949d271..2ca7b63cdc6 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLambdaReturnWithExpectedType.kt @@ -1,4 +1,5 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions +// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: inLambdaReturnWithExpectedType.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalFunctionWithExpressionBody.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalFunctionWithExpressionBody.kt index 5e2b952fb2b..6143a62967a 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalFunctionWithExpressionBody.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalFunctionWithExpressionBody.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: box.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalVariableInitializer.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalVariableInitializer.kt index 40b293375f9..f325af45e5b 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalVariableInitializer.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inLocalVariableInitializer.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: box.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inMemberPropertyInitializer.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inMemberPropertyInitializer.kt index 6e5c110bfd2..9dbd3a9f590 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inMemberPropertyInitializer.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inMemberPropertyInitializer.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: box.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inPropertyGetterWithExpressionBody.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inPropertyGetterWithExpressionBody.kt index 4be77896f86..ac1d75a44af 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inPropertyGetterWithExpressionBody.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inPropertyGetterWithExpressionBody.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: box.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inTopLevelPropertyInitializer.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inTopLevelPropertyInitializer.kt index 0bd6bcdfd60..4066f0bbdc1 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inTopLevelPropertyInitializer.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/enhancedNullability/inTopLevelPropertyInitializer.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +StrictJavaNullabilityAssertions -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: box.kt diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt index 996466da788..04b0eb2de71 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsT.kt @@ -1,4 +1,5 @@ // 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 15e6fc82292..dc9b2752e44 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTAny.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTAny.kt @@ -1,4 +1,5 @@ // TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR // FILE: nnStringVsTAny.kt fun useTAny(fn: () -> T) = fn() diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTConstrained.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTConstrained.kt index 718185bd78d..8d400947f9c 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTConstrained.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTConstrained.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_FIR: JVM_IR // FILE: nnStringVsTConstrained.kt fun useTConstrained(xs: Array, fn: () -> T) = fn() diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXArray.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXArray.kt index 58d95137149..95cfaf1b300 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXArray.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXArray.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_FIR: JVM_IR // FILE: nnStringVsTXArray.kt fun useTX(x: T, fn: () -> T) = fn() diff --git a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXString.kt b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXString.kt index 3787269c4bd..084e9c53e8b 100644 --- a/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXString.kt +++ b/compiler/testData/codegen/box/javaInterop/notNullAssertions/nullCheckOnLambdaReturnValue/nnStringVsTXString.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_FIR: JVM_IR // FILE: nnStringVsTXString.kt fun useTX(x: T, fn: () -> T) = fn() diff --git a/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsIse_1_3.kt b/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsIse_1_3.kt index d84c87adc7e..72131e10f67 100644 --- a/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsIse_1_3.kt +++ b/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsIse_1_3.kt @@ -1,5 +1,4 @@ // KOTLIN_CONFIGURATION_FLAGS: +JVM.NO_UNIFIED_NULL_CHECKS -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: A.java diff --git a/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsNpe.kt b/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsNpe.kt index 5617fcf88c9..62f4667370c 100644 --- a/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsNpe.kt +++ b/compiler/testData/codegen/box/nullCheckOptimization/javaNullCheckThrowsNpe.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: A.java diff --git a/compiler/testData/codegen/bytecodeText/nullCheckOptimization/deterministicNotNullChecks.kt b/compiler/testData/codegen/bytecodeText/nullCheckOptimization/deterministicNotNullChecks.kt index 3d470da336a..f180d292a36 100644 --- a/compiler/testData/codegen/bytecodeText/nullCheckOptimization/deterministicNotNullChecks.kt +++ b/compiler/testData/codegen/bytecodeText/nullCheckOptimization/deterministicNotNullChecks.kt @@ -1,4 +1,7 @@ // FILE: test/CallableDescriptor.java +// IGNORE_BACKEND_FIR: JVM_IR +// Here FIR adds implicit NOT_NULL cast for `origin`, resulting in an assertion being added, +// which is the correct (yet mismatching) behavior, according to https://youtrack.jetbrains.com/issue/KT-35656 // JVM_IR: // Here in 'original in emptySet()' T = '@EnhancedNullability CallableDescriptor' is inferred for 'Iterable.contains(T)'. diff --git a/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt b/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt index f5ad2364e7d..bdd3226308e 100644 --- a/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt +++ b/compiler/testData/ir/irText/expressions/nullCheckOnGenericLambdaReturn.fir.txt @@ -44,13 +44,15 @@ FILE fqName: fileName:/nullCheckOnGenericLambdaReturn.kt FUN name:test2 visibility:public modality:FINAL <> () returnType:kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun test2 (): kotlin.String declared in ' - CALL 'public final fun checkT (fn: kotlin.Function0.checkT>): T of .checkT declared in ' type=kotlin.String origin=null - : kotlin.String - 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 .test2' - CALL 'public open fun nnFoo (): kotlin.String declared in .J' type=kotlin.String origin=null + 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=kotlin.String origin=null + : kotlin.String + 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 .test2' + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun nnFoo (): kotlin.String declared in .J' type=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 ' @@ -64,10 +66,12 @@ FILE fqName: fileName:/nullCheckOnGenericLambdaReturn.kt FUN name:test4 visibility:public modality:FINAL <> () returnType:kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun test4 (): kotlin.String declared in ' - CALL 'public final fun checkTAny (fn: kotlin.Function0.checkTAny>): T of .checkTAny declared in ' type=kotlin.String origin=null - : kotlin.String - 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 .test4' - CALL 'public open fun nnFoo (): kotlin.String declared in .J' type=kotlin.String origin=null + 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=kotlin.String origin=null + : kotlin.String + 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 .test4' + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun nnFoo (): kotlin.String declared in .J' type=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 1365a4ed250..f0fffa4360e 100644 --- a/compiler/testData/ir/irText/expressions/nullCheckOnLambdaReturn.fir.txt +++ b/compiler/testData/ir/irText/expressions/nullCheckOnLambdaReturn.fir.txt @@ -85,4 +85,5 @@ 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' - CALL 'public open fun nnFoo (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun nnFoo (): kotlin.String declared in .J' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.txt b/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.txt index 5112ea50299..70025eb96c8 100644 --- a/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.txt +++ b/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.txt @@ -9,6 +9,7 @@ FILE fqName: fileName:/typeParametersInImplicitCast.kt FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> () returnType:kotlin.collections.List BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): kotlin.collections.List declared in .problematic' - CALL 'public/*package*/ open fun id (v: kotlin.collections.List.ListId.id?>?): kotlin.collections.List.ListId.id?> declared in .ListId' type=kotlin.collections.List origin=null - : kotlin.Any? - v: ERROR_CALL 'Unresolved reference: #' type=IrErrorType + TYPE_OP type=kotlin.collections.List origin=IMPLICIT_NOTNULL typeOperand=kotlin.collections.List + CALL 'public/*package*/ open fun id (v: kotlin.collections.List.ListId.id?>?): kotlin.collections.List.ListId.id?> declared in .ListId' type=kotlin.collections.List origin=null + : kotlin.Any? + v: ERROR_CALL 'Unresolved reference: #' type=IrErrorType diff --git a/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt b/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt index f67c6a94465..47f8abe6f03 100644 --- a/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/enhancedNullability.fir.txt @@ -5,19 +5,23 @@ 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: CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + s: TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null FUN name:testLocalVal visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY VAR name:local type:kotlin.String [val] - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null FUN name:testReturnValue visibility:public modality:FINAL <> () returnType:kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun testReturnValue (): kotlin.String declared in ' - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null PROPERTY name:testGlobalVal visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:testGlobalVal type:kotlin.String visibility:private [final,static] EXPRESSION_BODY - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String correspondingProperty: PROPERTY name:testGlobalVal visibility:public modality:FINAL [val] BLOCK_BODY @@ -28,13 +32,15 @@ FILE fqName: fileName:/enhancedNullability.kt correspondingProperty: PROPERTY name:testGlobalValGetter visibility:public modality:FINAL [val] BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null FUN name:testJUse visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY CALL 'public open fun use (s: 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: kotlin.String): kotlin.Unit declared in .J' type=kotlin.Unit origin=null - s: CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + s: TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null FUN name:testLocalVarUse visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY VAR name:ns type:kotlin.String? [val] @@ -42,6 +48,8 @@ FILE fqName: fileName:/enhancedNullability.kt CALL 'public open fun use (s: 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:kotlin.String [val] - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null CALL 'public open fun use (s: kotlin.String): kotlin.Unit declared in .J' type=kotlin.Unit origin=null - s: GET_VAR 'val nns: kotlin.String [val] declared in .testLocalVarUse' type=kotlin.String origin=null + s: TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + 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 c7e1e45c9d7..dfa77283efe 100644 --- a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.txt @@ -118,7 +118,8 @@ FILE fqName: fileName:/enhancedNullabilityInDestructuringAssignment.kt FUN name:test1 visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:.P [val] - CALL 'public open fun notNullP (): .P declared in .J' type=.P origin=null + TYPE_OP type=.P origin=IMPLICIT_NOTNULL typeOperand=.P + CALL 'public open fun notNullP (): .P declared in .J' type=.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: .P [val] declared in .test1' type=.P 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 index 1e80292868e..27e2274e6af 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsT.fir.txt @@ -15,4 +15,5 @@ FILE fqName: fileName:/nnStringVsT.kt 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 .testNoNullCheck' - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt index dff53ccbe3a..f3b5c206b9b 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTAny.fir.txt @@ -15,4 +15,5 @@ FILE fqName: fileName:/nnStringVsTAny.kt 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 .testNoNullCheck' - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt index cd95c1fb676..85c41a3b06b 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTConstrained.fir.txt @@ -18,4 +18,5 @@ FILE fqName: fileName:/nnStringVsTConstrained.kt 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' - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt index ef5d8dfee55..51a43cd122d 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXArray.fir.txt @@ -18,4 +18,5 @@ FILE fqName: fileName:/nnStringVsTXArray.kt 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' - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt index 05444d3a953..cf8a95857f9 100644 --- a/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/nullCheckOnLambdaResult/nnStringVsTXString.fir.txt @@ -17,4 +17,5 @@ FILE fqName: fileName:/nnStringVsTXString.kt 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' - CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null + TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String + CALL 'public open fun notNullString (): kotlin.String declared in .J' type=kotlin.String origin=null diff --git a/compiler/testData/loadJava/compiledJava/modality/ModalityOfFakeOverrides.fir.txt b/compiler/testData/loadJava/compiledJava/modality/ModalityOfFakeOverrides.fir.txt index 109c4a8262b..80cdabb2880 100644 --- a/compiler/testData/loadJava/compiledJava/modality/ModalityOfFakeOverrides.fir.txt +++ b/compiler/testData/loadJava/compiledJava/modality/ModalityOfFakeOverrides.fir.txt @@ -1,5 +1,5 @@ public open class ModalityOfFakeOverrides : R|java/util/AbstractList!>| { - @R|java/lang/Override|() @R|org/jetbrains/annotations/NotNull|() public open operator fun get(index: R|kotlin/Int|): R|kotlin/String| + @R|java/lang/Override|() @R|org/jetbrains/annotations/NotNull|() public open operator fun get(index: R|kotlin/Int|): R|@EnhancedNullability kotlin/String| @R|java/lang/Override|() public open fun size(): R|kotlin/Int| diff --git a/compiler/testData/loadJava/compiledJava/mutability/LoadIterableWithNullability.fir.txt b/compiler/testData/loadJava/compiledJava/mutability/LoadIterableWithNullability.fir.txt index 71b6103f0c8..a5adf624ba8 100644 --- a/compiler/testData/loadJava/compiledJava/mutability/LoadIterableWithNullability.fir.txt +++ b/compiler/testData/loadJava/compiledJava/mutability/LoadIterableWithNullability.fir.txt @@ -1,7 +1,7 @@ public abstract interface LoadIterableWithNullability!|> : R|kotlin/Any| { - @R|org/jetbrains/annotations/NotNull|() @R|kotlin/annotations/jvm/Mutable|() public abstract fun getIterable(): R|kotlin/collections/MutableIterable!>| + @R|org/jetbrains/annotations/NotNull|() @R|kotlin/annotations/jvm/Mutable|() public abstract fun getIterable(): R|@EnhancedNullability kotlin/collections/MutableIterable!>| - public abstract fun setIterable(@R|kotlin/annotations/jvm/Mutable|() @R|org/jetbrains/annotations/NotNull|() Iterable: R|kotlin/collections/MutableIterable!>|): R|kotlin/Unit| + public abstract fun setIterable(@R|kotlin/annotations/jvm/Mutable|() @R|org/jetbrains/annotations/NotNull|() Iterable: R|@EnhancedNullability kotlin/collections/MutableIterable!>|): R|kotlin/Unit| @R|org/jetbrains/annotations/NotNull|() @R|kotlin/annotations/jvm/ReadOnly|() public abstract fun getReadOnlyIterable(): R|kotlin/collections/Iterable!>| diff --git a/compiler/testData/loadJava/compiledJava/mutability/ReadOnlyExtendsWildcard.fir.txt b/compiler/testData/loadJava/compiledJava/mutability/ReadOnlyExtendsWildcard.fir.txt index 7832455a929..bb96f9b059e 100644 --- a/compiler/testData/loadJava/compiledJava/mutability/ReadOnlyExtendsWildcard.fir.txt +++ b/compiler/testData/loadJava/compiledJava/mutability/ReadOnlyExtendsWildcard.fir.txt @@ -1,6 +1,6 @@ public abstract interface ReadOnlyExtendsWildcard : R|kotlin/Any| { public abstract fun bar(): R|kotlin/Unit| - public abstract fun foo(@R|kotlin/annotations/jvm/ReadOnly|() x: R|ft!>, kotlin/collections/List!>?>!|, @R|org/jetbrains/annotations/NotNull|() y: R|kotlin/Comparable!>|): R|kotlin/Unit| + public abstract fun foo(@R|kotlin/annotations/jvm/ReadOnly|() x: R|ft!>, kotlin/collections/List!>?>!|, @R|org/jetbrains/annotations/NotNull|() y: R|@EnhancedNullability kotlin/Comparable!>|): R|kotlin/Unit| } diff --git a/compiler/testData/loadJava/compiledJava/notNull/NotNullField.fir.txt b/compiler/testData/loadJava/compiledJava/notNull/NotNullField.fir.txt index cba89196f88..c44ac71cd1e 100644 --- a/compiler/testData/loadJava/compiledJava/notNull/NotNullField.fir.txt +++ b/compiler/testData/loadJava/compiledJava/notNull/NotNullField.fir.txt @@ -1,5 +1,5 @@ public open class NotNullField : R|kotlin/Any| { - @R|org/jetbrains/annotations/NotNull|() public open field hi: R|kotlin/String| + @R|org/jetbrains/annotations/NotNull|() public open field hi: R|@EnhancedNullability kotlin/String| public constructor(): R|test/NotNullField| diff --git a/compiler/testData/loadJava/compiledJava/notNull/NotNullIntArray.fir.txt b/compiler/testData/loadJava/compiledJava/notNull/NotNullIntArray.fir.txt index a9a0ce59f06..59bfd25bd89 100644 --- a/compiler/testData/loadJava/compiledJava/notNull/NotNullIntArray.fir.txt +++ b/compiler/testData/loadJava/compiledJava/notNull/NotNullIntArray.fir.txt @@ -1,5 +1,5 @@ public open class NotNullIntArray : R|kotlin/Any| { - @R|org/jetbrains/annotations/NotNull|() public open fun hi(): R|kotlin/IntArray| + @R|org/jetbrains/annotations/NotNull|() public open fun hi(): R|@EnhancedNullability kotlin/IntArray| public constructor(): R|test/NotNullIntArray| diff --git a/compiler/testData/loadJava/compiledJava/notNull/NotNullMethod.fir.txt b/compiler/testData/loadJava/compiledJava/notNull/NotNullMethod.fir.txt index 7bae887cea3..dfc0571ff4a 100644 --- a/compiler/testData/loadJava/compiledJava/notNull/NotNullMethod.fir.txt +++ b/compiler/testData/loadJava/compiledJava/notNull/NotNullMethod.fir.txt @@ -1,5 +1,5 @@ public open class NotNullMethod : R|kotlin/Any| { - @R|org/jetbrains/annotations/NotNull|() public open fun hi(): R|kotlin/String| + @R|org/jetbrains/annotations/NotNull|() public open fun hi(): R|@EnhancedNullability kotlin/String| public constructor(): R|test/NotNullMethod| diff --git a/compiler/testData/loadJava/compiledJava/notNull/NotNullObjectArray.fir.txt b/compiler/testData/loadJava/compiledJava/notNull/NotNullObjectArray.fir.txt index 75ef24f2374..3a260301db7 100644 --- a/compiler/testData/loadJava/compiledJava/notNull/NotNullObjectArray.fir.txt +++ b/compiler/testData/loadJava/compiledJava/notNull/NotNullObjectArray.fir.txt @@ -1,5 +1,5 @@ public open class NotNullObjectArray : R|kotlin/Any| { - @R|org/jetbrains/annotations/NotNull|() public open fun hi(): R|ft!>, kotlin/Array!>>| + @R|org/jetbrains/annotations/NotNull|() public open fun hi(): R|ft<@EnhancedNullability kotlin/Array!>, kotlin/Array!>>| public constructor(): R|test/NotNullObjectArray| diff --git a/compiler/testData/loadJava/compiledJava/notNull/NotNullParameter.fir.txt b/compiler/testData/loadJava/compiledJava/notNull/NotNullParameter.fir.txt index 6e47f648cc7..306be380fb9 100644 --- a/compiler/testData/loadJava/compiledJava/notNull/NotNullParameter.fir.txt +++ b/compiler/testData/loadJava/compiledJava/notNull/NotNullParameter.fir.txt @@ -1,5 +1,5 @@ public open class NotNullParameter : R|kotlin/Any| { - public open fun hi(@R|org/jetbrains/annotations/NotNull|() param: R|kotlin/String|): R|kotlin/Unit| + public open fun hi(@R|org/jetbrains/annotations/NotNull|() param: R|@EnhancedNullability kotlin/String|): R|kotlin/Unit| public constructor(): R|test/NotNullParameter| diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt index a2c9c83e939..04537918725 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.fir.txt @@ -1,4 +1,4 @@ public open class ConstructorWithAnnotations : R|kotlin/Any| { - public constructor(r: R|ft!|, @R|org/jetbrains/annotations/NotNull|() s: R|kotlin/String|): R|test/ConstructorWithAnnotations| + public constructor(r: R|ft!|, @R|org/jetbrains/annotations/NotNull|() s: R|@EnhancedNullability kotlin/String|): R|test/ConstructorWithAnnotations| }