From 0c61ce61c3231e5ca8cbfcfe73aa90855c96fcff Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 15 Jun 2023 15:00:17 +0200 Subject: [PATCH] K2: for Java source override, don't compare return types in override checker #KT-57044 Fixed --- ...icCompilerTestFirTestdataTestGenerated.java | 12 ++++++++++++ ...nosticCompilerFirTestDataTestGenerated.java | 12 ++++++++++++ .../overriddenFunctionReturningUnit.fir.txt | 14 ++++++++++++++ .../overriddenFunctionReturningUnit.kt | 18 ++++++++++++++++++ .../overriddenFunctionReturningUnit2.fir.txt | 14 ++++++++++++++ .../overriddenFunctionReturningUnit2.kt | 16 ++++++++++++++++ .../FirLightTreeDiagnosticsTestGenerated.java | 12 ++++++++++++ .../runners/FirPsiDiagnosticTestGenerated.java | 12 ++++++++++++ .../fir/java/scopes/JavaOverrideChecker.kt | 13 ++++++++++++- 9 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit.kt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/overriddenFunctionReturningUnit2.kt 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 }