From 7fb5cbd1f8b75654bb3413dbb9a98950b56ada78 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 3 Jan 2024 10:39:59 +0100 Subject: [PATCH] [FIR] Implement UNNECESSARY_NOT_NULL_ASSERTION checker for java warning level types --- .../jvm/checkers/JvmExpressionCheckers.kt | 5 + .../FirJavaUnnecessaryNotNullChecker.kt | 33 ++++ .../tests/androidRecently.fir.kt | 6 +- .../nullabilityNicknames.fir.kt | 91 --------- .../nullabilityNicknames.kt | 1 + .../overridingDefaultQualifier.fir.kt | 181 ------------------ .../overridingDefaultQualifier.kt | 1 + .../springNullable.fir.kt | 2 +- .../springNullablePackage.fir.kt | 84 -------- .../springNullablePackage.kt | 1 + .../migration/globalIgnore.fir.kt | 55 ------ .../migration/globalIgnore.kt | 1 + .../globalWarningMigrationIgnore.fir.kt | 55 ------ .../migration/globalWarningMigrationIgnore.kt | 1 + .../migration/migrationWarning.fir.kt | 55 ------ .../migration/migrationWarning.kt | 1 + .../migration/stateRefinement.fir.kt | 55 ------ .../migration/stateRefinement.kt | 1 + .../tests/multiple.fir.kt | 158 --------------- .../foreignAnnotationsTests/tests/multiple.kt | 1 + .../tests/rxjava3Default.fir.kt | 42 ---- .../tests/rxjava3Default.kt | 1 + .../tests/rxjava3Warnings.fir.kt | 43 ----- .../tests/rxjava3Warnings.kt | 1 + 24 files changed, 52 insertions(+), 823 deletions(-) create mode 100644 compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessaryNotNullChecker.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/nullabilityNicknames.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.fir.kt delete mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.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 a7eb3640b5a..30dcacf2c4a 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 @@ -77,4 +77,9 @@ object JvmExpressionCheckers : ExpressionCheckers() { get() = setOf( FirJavaUnnecessarySafeCallChecker, ) + + override val checkNotNullCallCheckers: Set + get() = setOf( + FirJavaUnnecessaryNotNullChecker, + ) } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessaryNotNullChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessaryNotNullChecker.kt new file mode 100644 index 00000000000..06132293e79 --- /dev/null +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaUnnecessaryNotNullChecker.kt @@ -0,0 +1,33 @@ +/* + * 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.config.LanguageFeature +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirCheckNotNullCallChecker +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall +import org.jetbrains.kotlin.fir.expressions.arguments +import org.jetbrains.kotlin.fir.java.enhancement.EnhancedForWarningConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType +import org.jetbrains.kotlin.fir.types.canBeNull +import org.jetbrains.kotlin.fir.types.resolvedType +import org.jetbrains.kotlin.fir.types.typeContext + +object FirJavaUnnecessaryNotNullChecker: FirCheckNotNullCallChecker() { + override fun check(expression: FirCheckNotNullCall, context: CheckerContext, reporter: DiagnosticReporter) { + val argument = expression.arguments.singleOrNull() ?: return + val argumentType = EnhancedForWarningConeSubstitutor(context.session.typeContext) + .substituteOrNull(argument.resolvedType) + ?.fullyExpandedType(context.session) ?: return + + if (!argumentType.canBeNull(context.session) && context.languageVersionSettings.supportsFeature(LanguageFeature.EnableDfaWarningsInK2)) { + reporter.reportOn(expression.source, FirErrors.UNNECESSARY_NOT_NULL_ASSERTION, argumentType, context) + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt index cb17a133fae..2d3304fb147 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/androidRecently.fir.kt @@ -30,7 +30,7 @@ fun main(a: A, a1: A) { a.foo(null, "").length a.bar().length - a.bar()!!.length + a.bar()!!.length a.field?.length a.field.length @@ -44,9 +44,9 @@ fun main(a: A, a1: A) { 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/jsr305/nullabilityWarnings/nullabilityNicknames.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/nullabilityNicknames.fir.kt deleted file mode 100644 index f12127ed57d..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/nullabilityNicknames.fir.kt +++ /dev/null @@ -1,91 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -// JSR305_GLOBAL_REPORT: warn - -// FILE: MyNullable.java -import javax.annotation.*; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import javax.annotation.meta.TypeQualifierNickname; -import javax.annotation.meta.When; - -@Documented -@TypeQualifierNickname -@Nonnull(when = When.MAYBE) -@Retention(RetentionPolicy.RUNTIME) -public @interface MyNullable { - -} - -// FILE: MyCheckForNull.java -import javax.annotation.*; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import javax.annotation.meta.TypeQualifierNickname; -import javax.annotation.meta.When; - -@Documented -@TypeQualifierNickname -@CheckForNull -@Retention(RetentionPolicy.RUNTIME) -public @interface MyCheckForNull { - -} - -// FILE: MyNonnull.java -import javax.annotation.*; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import javax.annotation.meta.TypeQualifierNickname; -import javax.annotation.meta.When; - -@Documented -@TypeQualifierNickname -@Nonnull(when = When.ALWAYS) -@Retention(RetentionPolicy.RUNTIME) -public @interface MyNonnull { - -} - -// FILE: A.java -import javax.annotation.*; - -public class A { - @MyNullable public String field = null; - - @MyNullable - public String foo(@MyNonnull String x, @MyNullable CharSequence y) { - return ""; - } - - @MyNonnull - public String bar() { - return ""; - } - - @MyCheckForNull - public String baz(@MyNonnull String x, @MyCheckForNull CharSequence y) { - return ""; - } -} - -// FILE: main.kt -fun main(a: A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.baz("", null).length - a.baz(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt index f148f993611..3c390443594 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // 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 deleted file mode 100644 index 2350bdff6d2..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.fir.kt +++ /dev/null @@ -1,181 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -// JSR305_GLOBAL_REPORT: warn - -// FILE: NonNullApi.java -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import javax.annotation.Nonnull; -import javax.annotation.meta.TypeQualifierDefault; - -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Nonnull -@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) -public @interface NonNullApi { -} - -// FILE: NullableApi.java -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import javax.annotation.CheckForNull; -import javax.annotation.meta.TypeQualifierDefault; - -@Retention(RetentionPolicy.RUNTIME) -@Documented -@CheckForNull -@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) -public @interface NullableApi { -} - -// FILE: FieldsAreNullable.java -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import javax.annotation.Nonnull; -import javax.annotation.CheckForNull; -import javax.annotation.meta.TypeQualifierDefault; - -@Retention(RetentionPolicy.RUNTIME) -@Documented -@CheckForNull -@TypeQualifierDefault({ElementType.FIELD}) -public @interface FieldsAreNullable { -} - -// FILE: A.java -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import javax.annotation.Nonnull; - -@NonNullApi -public class A { - public String field = null; - - public String foo(String x, @CheckForNull CharSequence y) { - return ""; - } - - @NullableApi - public String foobar(String x, @Nonnull CharSequence y) { - return ""; - } - - public String bar() { - return ""; - } - - @Nullable - public java.util.List baz() { - return null; - } - - @NullableApi - public class B { - public String field = null; - - public String foo(String x, @Nonnull CharSequence y) { - return ""; - } - - @NonNullApi - public String foobar(String x, @Nullable CharSequence y) { - return ""; - } - - public String bar() { - return ""; - } - - @Nullable - public java.util.List baz() { - return null; - } - } - - @FieldsAreNullable - public class C { - public String field = null; - - public String foo(String x, @Nullable CharSequence y) { - return ""; - } - - @NullableApi - public String foobar(String x, @Nullable CharSequence y) { - return ""; - } - - public String bar() { - return ""; - } - - @Nullable - public java.util.List baz() { - return null; - } - } -} - -// 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.foobar(null, "").length - a.foobar("", null)?.length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz().get(0) - a.baz()!!.get(0).get(0) - a.baz()!!.get(0)?.get(0) - - // b - b.foo("", null)?.length - b.foo("", null).length - b.foo(null, "").length - - b.foobar(null, "").length - b.foobar("", null)?.length - - b.bar().length - b.bar()!!.length - - b.field?.length - b.field.length - - b.baz().get(0) - b.baz()!!.get(0).get(0) - b.baz()!!.get(0)?.get(0) - - // c - c.foo("", null)?.length - c.foo("", null).length - c.foo(null, "").length - - c.foobar(null, "").length - c.foobar("", null)?.length - - c.bar().length - c.bar()!!.length - - c.field?.length - c.field.length - - c.baz().get(0) - c.baz()!!.get(0).get(0) - c.baz()!!.get(0)?.get(0) -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt index 8a7b4a14908..751d76078fe 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // JSR305_GLOBAL_REPORT: warn 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 872e1a37abd..7ed1d705dec 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 @@ -68,7 +68,7 @@ fun main(a: A) { a.foo(null, "").length a.bar().length - a.bar()!!.length + a.bar()!!.length a.field?.length a.field.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 deleted file mode 100644 index 5896c3af32d..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.fir.kt +++ /dev/null @@ -1,84 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -// JSR305_GLOBAL_REPORT: warn - -// FILE: spr/Nullable.java -package spr; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import javax.annotation.Nonnull; -import javax.annotation.meta.TypeQualifierNickname; -import javax.annotation.meta.When; - -@Target({ElementType.METHOD, ElementType.PARAMETER}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Nonnull(when = When.MAYBE) -@TypeQualifierNickname -public @interface Nullable { -} - -// FILE: spr/NonNullApi.java -package spr; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import javax.annotation.Nonnull; -import javax.annotation.meta.TypeQualifierDefault; - -@Target(ElementType.PACKAGE) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Nonnull -@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) -public @interface NonNullApi { -} - -// FILE: test/package-info.java -@spr.NonNullApi() -package test; - -// FILE: test/A.java -package test; - -import spr.*; - -public class A { - public String field = null; - - public String foo(String x, @Nullable CharSequence y) { - return ""; - } - - public String bar() { - return ""; - } - - @Nullable - public java.util.List baz() { - return null; - } -} - -// FILE: main.kt -fun main(a: test.A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz().get(0) - a.baz()!!.get(0).get(0) - a.baz()!!.get(0)?.get(0) -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt index 3a3bb845234..a5e2db36336 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // JSR305_GLOBAL_REPORT: warn diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.fir.kt deleted file mode 100644 index c48e2e91d4e..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.fir.kt +++ /dev/null @@ -1,55 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -// JSR305_GLOBAL_REPORT: ignore -// JSR305_MIGRATION_REPORT: strict -// JSR305_SPECIAL_REPORT: MyNonnull:warn - -// FILE: A.java -import javax.annotation.*; - -public class A { - @MyMigrationNullable public String field = null; - - @MyMigrationNullable - public String foo(@MyMigrationNonnull String x, CharSequence y) { - return ""; - } - - @MyMigrationNonnull - public String bar() { - return ""; - } - - @MyNullable public String field2 = null; - @MyNullable - public String foo2(@MyNonnull String x, CharSequence y) { - return ""; - } - - @MyNonnull - public String bar2() { - return ""; - } -} - -// FILE: main.kt -fun main(a: A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.foo2("", null)?.length - a.foo2("", null).length - a.foo2(null, "").length - - a.bar2().length - a.bar2()!!.length - - a.field2?.length - a.field2.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.kt index 7a5bfc529aa..9d15c559e17 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalIgnore.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // JSR305_GLOBAL_REPORT: ignore // JSR305_MIGRATION_REPORT: strict diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.fir.kt deleted file mode 100644 index 227bac7591a..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.fir.kt +++ /dev/null @@ -1,55 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -// JSR305_GLOBAL_REPORT: warn -// JSR305_MIGRATION_REPORT: ignore -// JSR305_SPECIAL_REPORT: MyNullable:strict, MyMigrationNonnull:strict - -// FILE: A.java -import javax.annotation.*; - -public class A { - @MyMigrationNullable public String field = null; - - @MyMigrationNullable - public String foo(@MyMigrationNonnull String x, CharSequence y) { - return ""; - } - - @MyMigrationNonnull - public String bar() { - return ""; - } - - @MyNullable public String field2 = null; - @MyNullable - public String foo2(@MyNonnull String x, CharSequence y) { - return ""; - } - - @MyNonnull - public String bar2() { - return ""; - } -} - -// FILE: main.kt -fun main(a: A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.foo2("", null)?.length - a.foo2("", null).length - a.foo2(null, "").length - - a.bar2().length - a.bar2()!!.length - - a.field2?.length - a.field2.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.kt index 559dcb36e03..0e79f1e573f 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/globalWarningMigrationIgnore.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // JSR305_GLOBAL_REPORT: warn // JSR305_MIGRATION_REPORT: ignore diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.fir.kt deleted file mode 100644 index 94d01f1c05c..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.fir.kt +++ /dev/null @@ -1,55 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -// JSR305_GLOBAL_REPORT: strict -// JSR305_MIGRATION_REPORT: warn -// JSR305_SPECIAL_REPORT: MyNullable:ignore, MyMigrationNullable:strict - -// FILE: A.java -import javax.annotation.*; - -public class A { - @MyMigrationNullable public String field = null; - - @MyMigrationNullable - public String foo(@MyMigrationNonnull String x, CharSequence y) { - return ""; - } - - @MyMigrationNonnull - public String bar() { - return ""; - } - - @MyNullable public String field2 = null; - @MyNullable - public String foo2(@MyNonnull String x, CharSequence y) { - return ""; - } - - @MyNonnull - public String bar2() { - return ""; - } -} - -// FILE: main.kt -fun main(a: A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.foo2("", null)?.length - a.foo2("", null).length - a.foo2(null, "").length - - a.bar2().length - a.bar2()!!.length - - a.field2?.length - a.field2.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.kt index 7e05524275f..20ecee15c5f 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/migrationWarning.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // JSR305_GLOBAL_REPORT: strict // JSR305_MIGRATION_REPORT: warn diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.fir.kt deleted file mode 100644 index 371afcd13dd..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.fir.kt +++ /dev/null @@ -1,55 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -// JSR305_GLOBAL_REPORT: ignore -// JSR305_MIGRATION_REPORT: warn -// JSR305_SPECIAL_REPORT: MyNonnull:strict - -// FILE: A.java -import javax.annotation.*; - -public class A { - @MyMigrationNullable public String field = null; - - @MyMigrationNullable - public String foo(@MyMigrationNonnull String x, CharSequence y) { - return ""; - } - - @MyMigrationNonnull - public String bar() { - return ""; - } - - @MyNullable public String field2 = null; - @MyNullable - public String foo2(@MyNonnull String x, CharSequence y) { - return ""; - } - - @MyNonnull - public String bar2() { - return ""; - } -} - -// FILE: main.kt -fun main(a: A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.foo2("", null)?.length - a.foo2("", null).length - a.foo2(null, "").length - - a.bar2().length - a.bar2()!!.length - - a.field2?.length - a.field2.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.kt index d0786d5ed62..d342e93f1c9 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/jsr305NullabilityWarnings/migration/stateRefinement.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // JSR305_GLOBAL_REPORT: ignore // JSR305_MIGRATION_REPORT: warn diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.fir.kt deleted file mode 100644 index 146886d22f1..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.fir.kt +++ /dev/null @@ -1,158 +0,0 @@ -// NULLABILITY_ANNOTATIONS: @io.reactivex.annotations:strict, @org.eclipse.jdt.annotation:warn, @androidx.annotation:strict, @com.android.annotations:ignore - -// FILE: A1.java -import io.reactivex.annotations.*; - -public class A1 { - @Nullable public String field = null; - - @Nullable - public String foo(@NonNull String x, @Nullable CharSequence y) { - return ""; - } - - @NonNull - public String bar() { - return ""; - } - - @Nullable - public T baz(@NonNull T x) { return x; } -} - -// FILE: A2.java -import org.eclipse.jdt.annotation.*; - -public class A2 { - @Nullable public String field = null; - - @Nullable - public String foo(@NonNull String x, @Nullable CharSequence y) { - return ""; - } - - @NonNull - public String bar() { - return ""; - } - - @Nullable - public T baz(@NonNull T x) { return x; } -} - -// FILE: A3.java -import androidx.annotation.*; - -public class A3 { - @Nullable public String field = null; - - @Nullable - public String foo(@NonNull String x, @Nullable CharSequence y) { - return ""; - } - - @NonNull - public String bar() { - return ""; - } - - @Nullable - public T baz(@NonNull T x) { return x; } -} - -// FILE: A4.java -import com.android.annotations.*; - -public class A4 { - @Nullable public String field = null; - - @Nullable - public String foo(@NonNull String x, @Nullable CharSequence y) { - return ""; - } - - @NonNull - public String bar() { - return ""; - } - - @Nullable - public T baz(@NonNull T x) { return x; } -} - -// FILE: main.kt -fun main1(a: A1, a1: A1) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz("").length - a.baz("")?.length - a.baz(null).length - - a1.baz("")!!.length - a1.baz(null)!!.length -} - -fun main2(a: A2, a1: A2) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz("").length - a.baz("")?.length - a.baz(null).length - - a1.baz("")!!.length - a1.baz(null)!!.length -} - -fun main3(a: A3, a1: A3) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz("").length - a.baz("")?.length - a.baz(null).length - - a1.baz("")!!.length - a1.baz(null)!!.length -} - -fun main4(a: A4, a1: A4) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz("").length - a.baz("")?.length - a.baz(null).length - - a1.baz("")!!.length - a1.baz(null)!!.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.kt index 8fdc9db210a..fa8586d06b8 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/multiple.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // NULLABILITY_ANNOTATIONS: @io.reactivex.annotations:strict, @org.eclipse.jdt.annotation:warn, @androidx.annotation:strict, @com.android.annotations:ignore // FILE: A1.java diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.fir.kt deleted file mode 100644 index 9abb5ae91ed..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.fir.kt +++ /dev/null @@ -1,42 +0,0 @@ -// FILE: A.java - -import io.reactivex.rxjava3.annotations.*; - -public class A { - @Nullable public String field = null; - - @Nullable - public String foo(@NonNull String x, @Nullable CharSequence y) { - return ""; - } - - @NonNull - public String bar() { - return ""; - } - - @Nullable - public T baz(@NonNull T x) { return x; } -} - -// FILE: main.kt - -fun main(a: A, a1: A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - a.foo("", null)!!.length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz("").length - a.baz("")?.length - a.baz(null).length - - a1.baz("")!!.length - a1.baz(null)!!.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.kt index 8ae5fcd845d..71803e8f149 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Default.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: A.java import io.reactivex.rxjava3.annotations.*; diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.fir.kt deleted file mode 100644 index ad90c31b0a5..00000000000 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.fir.kt +++ /dev/null @@ -1,43 +0,0 @@ -// NULLABILITY_ANNOTATIONS: @io.reactivex.rxjava3.annotations:warn - -// FILE: A.java - -import io.reactivex.rxjava3.annotations.*; - -public class A { - @Nullable public String field = null; - - @Nullable - public String foo(@NonNull String x, @Nullable CharSequence y) { - return ""; - } - - @NonNull - public String bar() { - return ""; - } - - @Nullable - public T baz(@NonNull T x) { return x; } -} - -// FILE: main.kt - -fun main(a: A, a1: A) { - a.foo("", null)?.length - a.foo("", null).length - a.foo(null, "").length - - a.bar().length - a.bar()!!.length - - a.field?.length - a.field.length - - a.baz("").length - a.baz("")?.length - a.baz(null).length - - a1.baz("")!!.length - a1.baz(null)!!.length -} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.kt index 7f92dcee9f4..70045160bf3 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/rxjava3Warnings.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // NULLABILITY_ANNOTATIONS: @io.reactivex.rxjava3.annotations:warn // FILE: A.java