diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java index c77aa11a23e..427adda503c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java @@ -6969,6 +6969,18 @@ public class DiagnosticCompilerTestFirTestdataTestGenerated extends AbstractDiag runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/NamedParameterInConcurrentMap.kt"); } + @Test + @TestMetadata("overriddenFunctionReturningUnit.kt") + public void testOverriddenFunctionReturningUnit() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt"); + } + + @Test + @TestMetadata("overriddenFunctionReturningUnit2.kt") + public void testOverriddenFunctionReturningUnit2() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt"); + } + @Test @TestMetadata("qualifierPriority.kt") public void testQualifierPriority() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java index 3b931ad7dc3..77c2701006c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java @@ -6969,6 +6969,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/NamedParameterInConcurrentMap.kt"); } + @Test + @TestMetadata("overriddenFunctionReturningUnit.kt") + public void testOverriddenFunctionReturningUnit() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt"); + } + + @Test + @TestMetadata("overriddenFunctionReturningUnit2.kt") + public void testOverriddenFunctionReturningUnit2() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt"); + } + @Test @TestMetadata("qualifierPriority.kt") public void testQualifierPriority() throws Exception { diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.fir.txt new file mode 100644 index 00000000000..ad855731bdb --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.fir.txt @@ -0,0 +1,14 @@ +FILE: K.kt + public open class K : R|kotlin/Any| { + public constructor(): R|K| { + super() + } + + public open fun test(): R|kotlin/Unit| { + ^test Q|kotlin/Unit| + } + + } + public final fun jk(): R|kotlin/Unit| { + R|/JK.JK|().R|/JK.test|() + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt new file mode 100644 index 00000000000..8c96b39fffa --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt @@ -0,0 +1,18 @@ +// FILE: JK.java + +public class JK extends K { + @Override + public void test() { + + } +} + +// FILE: K.kt + +open class K { + open fun test() = Unit +} + +fun jk() { + JK().test() +} diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.fir.txt new file mode 100644 index 00000000000..2b658cdf215 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.fir.txt @@ -0,0 +1,14 @@ +FILE: K.kt + public final fun jk(): R|kotlin/Unit| { + ^jk R|/JK.JK|().R|/JK.test|() + } + public open class K : R|kotlin/Any| { + public constructor(): R|K| { + super() + } + + public open fun test(): R|kotlin/Unit| { + ^test Q|kotlin/Unit| + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt new file mode 100644 index 00000000000..9aaaac6c27d --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt @@ -0,0 +1,16 @@ +// FILE: JK.java + +public class JK extends K { + @Override + public void test() { + + } +} + +// FILE: K.kt + +fun jk() = JK().test() + +open class K { + open fun test() = Unit +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java index c01e8492280..b10497fbfec 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java @@ -6969,6 +6969,18 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/NamedParameterInConcurrentMap.kt"); } + @Test + @TestMetadata("overriddenFunctionReturningUnit.kt") + public void testOverriddenFunctionReturningUnit() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt"); + } + + @Test + @TestMetadata("overriddenFunctionReturningUnit2.kt") + public void testOverriddenFunctionReturningUnit2() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt"); + } + @Test @TestMetadata("qualifierPriority.kt") public void testQualifierPriority() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java index 95567d45270..d711a5b3ffc 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java @@ -6969,6 +6969,18 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/NamedParameterInConcurrentMap.kt"); } + @Test + @TestMetadata("overriddenFunctionReturningUnit.kt") + public void testOverriddenFunctionReturningUnit() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt"); + } + + @Test + @TestMetadata("overriddenFunctionReturningUnit2.kt") + public void testOverriddenFunctionReturningUnit2() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt"); + } + @Test @TestMetadata("qualifierPriority.kt") public void testQualifierPriority() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt index cdbb3cd4c27..3d4a2934e0f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt @@ -250,7 +250,18 @@ class JavaOverrideChecker internal constructor( return false } - if (considerReturnTypeKinds && !doesReturnTypesHaveSameKind(overrideCandidate, baseDeclaration)) return false + if (overrideCandidate.origin == FirDeclarationOrigin.Java.Source && baseDeclaration.origin == FirDeclarationOrigin.Source) { + // For override from Java source against the Kotlin base the following check of return type kinds is not important + // From the other side, it can provoke problems in case baseDeclaration is from source and has an implicit return type + // which is not yet resolved (see KT-57044) + return true + } + + // See test compiler/testData/compileKotlinAgainstCustomBinaries/incorrectJavaSignature + // and relevant commit message (360d6741) + if (considerReturnTypeKinds && !doesReturnTypesHaveSameKind(overrideCandidate, baseDeclaration)) { + return false + } return true }