From d6bd31b313da18b9a46dd9c07b5dead7354c571a Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Tue, 2 Jan 2024 17:22:55 +0100 Subject: [PATCH] [FIR] Implement UNNECESSARY_SAFE_CALL checker for java warning level types #KT-63528 Fixed --- .../jvm/checkers/JvmExpressionCheckers.kt | 5 ++ .../FirJavaUnnecessarySafeCallChecker.kt | 26 +++++++ .../FirUnnecessarySafeCallChecker.kt | 31 +++++--- .../tests/androidRecently.fir.kt | 4 +- .../externalAnnotations/fieldNotNull.fir.kt | 38 ---------- .../tests/externalAnnotations/fieldNotNull.kt | 1 + .../fieldNotNullAnnotationWithPackage.fir.kt | 44 ------------ .../fieldNotNullAnnotationWithPackage.kt | 1 + .../externalAnnotations/methodNotNull.fir.kt | 46 ------------ .../externalAnnotations/methodNotNull.kt | 1 + .../methodNotNullFromAnotherModule.fir.kt | 71 ------------------ .../methodNotNullFromAnotherModule.kt | 1 + .../nullabilityWarnings/safeCalls.fir.kt | 72 ------------------- .../jsr305/nullabilityWarnings/safeCalls.kt | 1 + .../overridingDefaultQualifier.fir.kt | 8 +-- .../springNullable.fir.kt | 2 +- .../springNullablePackage.fir.kt | 2 +- 17 files changed, 66 insertions(+), 288 deletions(-) create mode 100644 compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessarySafeCallChecker.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.fir.kt diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt index a515ce800e6..a7eb3640b5a 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt @@ -72,4 +72,9 @@ object JvmExpressionCheckers : ExpressionCheckers() { get() = setOf( FirAssignmentJavaNullabilityWarningChecker, ) + + override val safeCallExpressionCheckers: Set + get() = setOf( + FirJavaUnnecessarySafeCallChecker, + ) } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessarySafeCallChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessarySafeCallChecker.kt new file mode 100644 index 00000000000..87846a10116 --- /dev/null +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessarySafeCallChecker.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.expression.AbstractFirUnnecessarySafeCallChecker +import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression +import org.jetbrains.kotlin.fir.java.enhancement.EnhancedForWarningConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType +import org.jetbrains.kotlin.fir.types.resolvedType +import org.jetbrains.kotlin.fir.types.typeContext + +object FirJavaUnnecessarySafeCallChecker : AbstractFirUnnecessarySafeCallChecker() { + override fun check(expression: FirSafeCallExpression, context: CheckerContext, reporter: DiagnosticReporter) { + val receiverType = EnhancedForWarningConeSubstitutor(context.session.typeContext) + .substituteOrNull(expression.receiver.resolvedType) + ?.fullyExpandedType(context.session) ?: return + + checkSafeCallReceiverType(receiverType, expression.source, context, reporter) + } +} + diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt index e1ef3791f91..20da0f1fa3c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn @@ -14,23 +15,35 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.resolve.fullyExpandedType +import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.canBeNull import org.jetbrains.kotlin.fir.types.resolvedType -object FirUnnecessarySafeCallChecker : FirSafeCallExpressionChecker() { +abstract class AbstractFirUnnecessarySafeCallChecker : FirSafeCallExpressionChecker() { + protected fun checkSafeCallReceiverType( + receiverType: ConeKotlinType, + source: KtSourceElement?, + context: CheckerContext, + reporter: DiagnosticReporter, + ) { + if (!receiverType.canBeNull(context.session)) { + if (context.languageVersionSettings.supportsFeature(LanguageFeature.EnableDfaWarningsInK2)) { + reporter.reportOn(source, FirErrors.UNNECESSARY_SAFE_CALL, receiverType, context) + } + if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.SafeCallsAreAlwaysNullable)) { + reporter.reportOn(source, FirErrors.SAFE_CALL_WILL_CHANGE_NULLABILITY, context) + } + } + } +} + +object FirUnnecessarySafeCallChecker : AbstractFirUnnecessarySafeCallChecker() { override fun check(expression: FirSafeCallExpression, context: CheckerContext, reporter: DiagnosticReporter) { val receiverType = expression.receiver.resolvedType.fullyExpandedType(context.session) if (expression.receiver.source?.elementType == KtNodeTypes.SUPER_EXPRESSION) { reporter.reportOn(expression.source, FirErrors.UNEXPECTED_SAFE_CALL, context) return } - if (!receiverType.canBeNull(context.session)) { - if (context.languageVersionSettings.supportsFeature(LanguageFeature.EnableDfaWarningsInK2)) { - reporter.reportOn(expression.source, FirErrors.UNNECESSARY_SAFE_CALL, receiverType, context) - } - if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.SafeCallsAreAlwaysNullable)) { - reporter.reportOn(expression.source, FirErrors.SAFE_CALL_WILL_CHANGE_NULLABILITY, context) - } - } + checkSafeCallReceiverType(receiverType, expression.source, context, reporter) } } diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt index 14b1e5390fc..cb17a133fae 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt @@ -43,10 +43,10 @@ fun main(a: A, a1: A) { a1.baz(null)!!.length a.baz2("").length - a.baz2("")?.length + a.baz2("")?.length a.baz2("")!!.length a.baz2(null).length - a.baz2(null)?.length + a.baz2(null)?.length a.baz2(null)!!.length } diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.fir.kt deleted file mode 100644 index e837223e44b..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.fir.kt +++ /dev/null @@ -1,38 +0,0 @@ -// FILE: ClassWithExternalAnnotatedMembers.java -import org.jetbrains.annotations.NotNull; - -public class ClassWithExternalAnnotatedMembers { - public String externalNotNullField; - - @NotNull - public String explicitNotNullField; - - public static String staticExternalNotNullField; - - @NotNull - public static String staticExplicitNotNullField; -} - -// FILE: usage.kt -fun test() { - val x = ClassWithExternalAnnotatedMembers() - x.externalNotNullField?.foo() - x.explicitNotNullField?.foo() - - ClassWithExternalAnnotatedMembers.staticExternalNotNullField?.foo() - ClassWithExternalAnnotatedMembers.staticExplicitNotNullField?.foo() -} - -fun String.foo() { - -} - -// FILE: annotations.xml - - - - - - - - \ No newline at end of file diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.kt index 07336889ff9..db88ade1ed0 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNull.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: ClassWithExternalAnnotatedMembers.java import org.jetbrains.annotations.NotNull; diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.fir.kt deleted file mode 100644 index 825a2bb79b3..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.fir.kt +++ /dev/null @@ -1,44 +0,0 @@ -// FILE: one/two/ClassWithExternalAnnotatedMembers.java -package one.two; - -import org.jetbrains.annotations.NotNull; - -public class ClassWithExternalAnnotatedMembers { - public String externalNotNullField; - - @NotNull - public String explicitNotNullField; - - public static String staticExternalNotNullField; - - @NotNull - public static String staticExplicitNotNullField; -} - -// FILE: one/usage.kt -package one - -import one.two.ClassWithExternalAnnotatedMembers - -fun test() { - val x = ClassWithExternalAnnotatedMembers() - x.externalNotNullField?.foo() - x.explicitNotNullField?.foo() - - ClassWithExternalAnnotatedMembers.staticExternalNotNullField?.foo() - ClassWithExternalAnnotatedMembers.staticExplicitNotNullField?.foo() -} - -fun String.foo() { - -} - -// FILE: one/two/annotations.xml - - - - - - - - \ No newline at end of file diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.kt index e905adacae8..f84806de4aa 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/fieldNotNullAnnotationWithPackage.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: one/two/ClassWithExternalAnnotatedMembers.java package one.two; diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.fir.kt deleted file mode 100644 index 390aaea1fc0..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.fir.kt +++ /dev/null @@ -1,46 +0,0 @@ -// FILE: ClassWithExternalAnnotatedMembers.java -import org.jetbrains.annotations.NotNull; - -public class ClassWithExternalAnnotatedMembers { - public String externalNotNullMethod() { - return ""; - } - - @NotNull - public String explicitNotNullMethod() { - return ""; - } - - public static String staticExternalNotNullMethod() { - return ""; - } - - @NotNull - public static String staticExplicitNotNullMethod() { - return ""; - } -} - -// FILE: usage.kt -fun test() { - val x = ClassWithExternalAnnotatedMembers() - x.externalNotNullMethod()?.foo() - x.explicitNotNullMethod()?.foo() - - ClassWithExternalAnnotatedMembers.staticExternalNotNullMethod()?.foo() - ClassWithExternalAnnotatedMembers.staticExplicitNotNullMethod()?.foo() -} - -fun String.foo() { - -} - -// FILE: annotations.xml - - - - - - - - \ No newline at end of file diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.kt index 595e950c5d2..b00974b2bb4 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNull.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: ClassWithExternalAnnotatedMembers.java import org.jetbrains.annotations.NotNull; diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.fir.kt deleted file mode 100644 index 6bb0935f97d..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.fir.kt +++ /dev/null @@ -1,71 +0,0 @@ -// MODULE: javaModule -// FILE: one/two/FirstModuleClass.java -package one.two; - -import org.jetbrains.annotations.NotNull; - -public class FirstModuleClass { - public String externalNotNullMethod() { - return ""; - } - - @NotNull - public String explicitNotNullMethod() { - return ""; - } -} -// FILE: one/two/annotations.xml - - - - - -// FILE: usage.kt -package usage1 - -import one.two.FirstModuleClass - -fun test() { - val x = FirstModuleClass() - x.externalNotNullMethod()?.foo() - x.explicitNotNullMethod()?.foo() -} - -fun String.foo() { - -} -// MODULE: javaModule2 -// FILE: three/SecondModuleClass.java -package three; - -import org.jetbrains.annotations.NotNull; - -public class SecondModuleClass { - public static String staticExternalNotNullMethod() { - return ""; - } - - @NotNull - public static String staticExplicitNotNullMethod() { - return ""; - } -} -// FILE: three/annotations.xml - - - - - -// FILE: my/pack/usage.kt -package my.pack - -import three.SecondModuleClass - -fun test() { - SecondModuleClass.staticExternalNotNullMethod()?.foo() - SecondModuleClass.staticExplicitNotNullMethod()?.foo() -} - -fun String.foo() { - -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.kt index 6fda90c9bf0..7a8cfc87b0e 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/externalAnnotations/methodNotNullFromAnotherModule.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // MODULE: javaModule // FILE: one/two/FirstModuleClass.java package one.two; diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.fir.kt deleted file mode 100644 index 26fe5ebf78e..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.fir.kt +++ /dev/null @@ -1,72 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -// JSR305_GLOBAL_REPORT: warn - -// FILE: MyNotNull.java -import javax.annotation.Nonnull; -import javax.annotation.meta.TypeQualifierNickname; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ElementType.METHOD, ElementType.PARAMETER}) -@Nonnull -@TypeQualifierNickname -@Retention(RetentionPolicy.RUNTIME) -public @interface MyNotNull {} - - -// FILE: AnnotatedWithJsr.java -public class AnnotatedWithJsr { - @MyNotNull - public String getString() { - return null; - } - - public void consumeString(@MyNotNull String s) { } -} - - - -// FILE: AnnotatedWithJB.java -import org.jetbrains.annotations.NotNull; - -public class AnnotatedWithJB { - public @NotNull String getString() { - return "hello"; - } - - public void consumeString(@NotNull String s) { } -} - - -// FILE: PlainJava.java -public class PlainJava { - public String getString() { - return null; - } - - public void consumeString(String s) { } -} - - -// FILE: main.kt -val jsr: AnnotatedWithJsr = AnnotatedWithJsr() -val jsrNullable: AnnotatedWithJsr? = null - -val jb: AnnotatedWithJB = AnnotatedWithJB() -val jbNullable: AnnotatedWithJB? = null - -val platform: PlainJava = PlainJava() -val platformNullable: PlainJava? = null - -fun safeCalls() { - val a = jsr.string?.length - val b = jsrNullable?.string?.length - - val c = jb.string?.length - val d = jbNullable?.string?.length - - val e = platform.string?.length - val f = platformNullable?.string?.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.kt index 39c0347a208..1c734073b4f 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/safeCalls.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE // JSR305_GLOBAL_REPORT: warn diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.fir.kt index 121185203ee..2350bdff6d2 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.fir.kt @@ -126,7 +126,7 @@ public class A { // FILE: main.kt fun main(a: A, b: A.B, c: A.C) { - a.foo("", null)?.length + a.foo("", null)?.length a.foo("", null).length a.foo(null, "").length @@ -136,7 +136,7 @@ fun main(a: A, b: A.B, c: A.C) { a.bar().length a.bar()!!.length - a.field?.length + a.field?.length a.field.length a.baz().get(0) @@ -149,7 +149,7 @@ fun main(a: A, b: A.B, c: A.C) { b.foo(null, "").length b.foobar(null, "").length - b.foobar("", null)?.length + b.foobar("", null)?.length b.bar().length b.bar()!!.length @@ -162,7 +162,7 @@ fun main(a: A, b: A.B, c: A.C) { b.baz()!!.get(0)?.get(0) // c - c.foo("", null)?.length + c.foo("", null)?.length c.foo("", null).length c.foo(null, "").length diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.fir.kt index 7738f6fc4db..872e1a37abd 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.fir.kt @@ -63,7 +63,7 @@ public class A { // FILE: main.kt fun main(a: A) { - a.foo("", null)?.length + a.foo("", null)?.length a.foo("", null).length a.foo(null, "").length diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.fir.kt index 00433082151..5896c3af32d 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.fir.kt @@ -68,7 +68,7 @@ public class A { // FILE: main.kt fun main(a: test.A) { - a.foo("", null)?.length + a.foo("", null)?.length a.foo("", null).length a.foo(null, "").length