diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index edcc59922c5..d133484b580 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -18717,6 +18717,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); } + @Test + @TestMetadata("noOverrideKeyword.kt") + public void testNoOverrideKeyword() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index deaefcd4e49..76151d92cdc 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -18717,6 +18717,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); } + @Test + @TestMetadata("noOverrideKeyword.kt") + public void testNoOverrideKeyword() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 20592ff1174..223d6821c5f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -18717,6 +18717,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); } + @Test + @TestMetadata("noOverrideKeyword.kt") + public void testNoOverrideKeyword() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() throws Exception { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaOverrideWithWrongNullabilityOverrideChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaOverrideWithWrongNullabilityOverrideChecker.kt index 951a6d75f90..d6c56209fbd 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaOverrideWithWrongNullabilityOverrideChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaOverrideWithWrongNullabilityOverrideChecker.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.OverridingUtil @@ -30,6 +31,10 @@ object JavaOverrideWithWrongNullabilityOverrideChecker : DeclarationChecker { if (descriptor !is CallableMemberDescriptor) return if (descriptor.overriddenDescriptors.isEmpty()) return + val modifierList = declaration.modifierList + val hasOverrideNode = modifierList != null && modifierList.hasModifier(KtTokens.OVERRIDE_KEYWORD) + if (!hasOverrideNode) return + val containingClass = descriptor.containingDeclaration as? ClassDescriptor ?: return for (overriddenDescriptor in descriptor.overriddenDescriptors) { diff --git a/compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.fir.kt b/compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.fir.kt new file mode 100644 index 00000000000..53a3cc30755 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.fir.kt @@ -0,0 +1,14 @@ +// !SKIP_JAVAC +// SKIP_TXT +// !LANGUAGE: -ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated +// FILE: JavaInterface.java +import org.jetbrains.annotations.NotNull; + +public interface JavaInterface { + void interfaceMethod(@NotNull V value); +} + +// FILE: main.kt +interface KotlinInterface : JavaInterface { + override <T> fun interfaceMethod(x: X) +} diff --git a/compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.kt b/compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.kt new file mode 100644 index 00000000000..4123b04b5d1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.kt @@ -0,0 +1,14 @@ +// !SKIP_JAVAC +// SKIP_TXT +// !LANGUAGE: -ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated +// FILE: JavaInterface.java +import org.jetbrains.annotations.NotNull; + +public interface JavaInterface { + void interfaceMethod(@NotNull V value); +} + +// FILE: main.kt +interface KotlinInterface : JavaInterface { + override <T> fun interfaceMethod(x: X) +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 7b31d61a296..72e6d3d6b2f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -18723,6 +18723,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); } + @Test + @TestMetadata("noOverrideKeyword.kt") + public void testNoOverrideKeyword() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/noOverrideKeyword.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() throws Exception {