From 071149e0fb499b61c6dccb48bf54fab225079992 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 20 Feb 2020 13:06:41 +0300 Subject: [PATCH] Fix exception when Java class has different methods with same erasure ^KT-36856 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 ++++ .../diagnostics/tests/j+k/kt36856.fir.kt | 19 +++++++++++++ .../testData/diagnostics/tests/j+k/kt36856.kt | 20 +++++++++++++ .../diagnostics/tests/j+k/kt36856.txt | 19 +++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 ++++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++++ .../java/lazy/descriptors/LazyJavaScope.kt | 2 +- .../kotlin/resolve/overridingUtils.kt | 28 ++++--------------- 8 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/kt36856.fir.kt create mode 100644 compiler/testData/diagnostics/tests/j+k/kt36856.kt create mode 100644 compiler/testData/diagnostics/tests/j+k/kt36856.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index 6b61f0c0339..5936be1f315 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -12761,6 +12761,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/j+k/kt3311.kt"); } + @TestMetadata("kt36856.kt") + public void testKt36856() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kt36856.kt"); + } + @TestMetadata("kt6720_abstractProperty.kt") public void testKt6720_abstractProperty() throws Exception { runTest("compiler/testData/diagnostics/tests/j+k/kt6720_abstractProperty.kt"); diff --git a/compiler/testData/diagnostics/tests/j+k/kt36856.fir.kt b/compiler/testData/diagnostics/tests/j+k/kt36856.fir.kt new file mode 100644 index 00000000000..7bd185c421e --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/kt36856.fir.kt @@ -0,0 +1,19 @@ +// !CHECK_TYPE +// FILE: Test.java +public class Test { + public T with(Foo matcher) { + return null; + } + public boolean with(Foo matcher) { + return false; + } +} + +// FILE: main.kt +class Foo +fun main(foo1: Foo, foo2: Foo) { + val x = object : Test() {} // FE exception is thrown here + + x.with(foo1) checkType { _() } + x.with(foo2) checkType { _() } +} diff --git a/compiler/testData/diagnostics/tests/j+k/kt36856.kt b/compiler/testData/diagnostics/tests/j+k/kt36856.kt new file mode 100644 index 00000000000..45a424773a3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/kt36856.kt @@ -0,0 +1,20 @@ +// !CHECK_TYPE +// FILE: Test.java +public class Test { + public T with(Foo matcher) { + return null; + } + public boolean with(Foo matcher) { + return false; + } +} + +// FILE: main.kt +class Foo +fun main(foo1: Foo, foo2: Foo) { + val x = object : Test() {} // FE exception is thrown here + + x.with(foo1) checkType { _() } + x.with(foo2) checkType { _() } +} + diff --git a/compiler/testData/diagnostics/tests/j+k/kt36856.txt b/compiler/testData/diagnostics/tests/j+k/kt36856.txt new file mode 100644 index 00000000000..dddb454f7af --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/kt36856.txt @@ -0,0 +1,19 @@ +package + +public fun main(/*0*/ foo1: Foo, /*1*/ foo2: Foo): kotlin.Unit + +public final class Foo { + public constructor Foo() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class Test { + public constructor Test() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public open fun with(/*0*/ matcher: Foo!): T! + public open fun with(/*0*/ matcher: Foo!): kotlin.Boolean +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 783dd0e9ce6..674adaa1dce 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -12768,6 +12768,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/j+k/kt3311.kt"); } + @TestMetadata("kt36856.kt") + public void testKt36856() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kt36856.kt"); + } + @TestMetadata("kt6720_abstractProperty.kt") public void testKt6720_abstractProperty() throws Exception { runTest("compiler/testData/diagnostics/tests/j+k/kt6720_abstractProperty.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index f1df77aa662..b6f8b7b4e98 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -12763,6 +12763,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/j+k/kt3311.kt"); } + @TestMetadata("kt36856.kt") + public void testKt36856() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kt36856.kt"); + } + @TestMetadata("kt6720_abstractProperty.kt") public void testKt6720_abstractProperty() throws Exception { runTest("compiler/testData/diagnostics/tests/j+k/kt6720_abstractProperty.kt"); diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt index 722ffa47c0b..4f4daa35dd4 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt @@ -126,7 +126,7 @@ abstract class LazyJavaScope( val groups = groupBy { it.computeJvmDescriptor(withReturnType = false) }.values for (group in groups) { if (group.size == 1) continue - val mostSpecificMethods = group.selectMostSpecificFromOverridableGroup() + val mostSpecificMethods = group.selectMostSpecificInEachOverridableGroup { this } removeAll(group) addAll(mostSpecificMethods) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/overridingUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/overridingUtils.kt index d3e26ce1e50..5707dfaa2d6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/overridingUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/overridingUtils.kt @@ -66,7 +66,12 @@ fun Collection.selectMostSpecificInEachOverridableGroup( continue } - val mostSpecific = mostSpecific(overridableGroup, conflictedHandles, descriptorByHandle) + val mostSpecific = OverridingUtil.selectMostSpecificMember(overridableGroup, descriptorByHandle) + val mostSpecificDescriptor = mostSpecific.descriptorByHandle() + + overridableGroup.filterNotTo(conflictedHandles) { + OverridingUtil.isMoreSpecific(mostSpecificDescriptor, it.descriptorByHandle()) + } if (conflictedHandles.isNotEmpty()) { result.addAll(conflictedHandles) @@ -76,24 +81,3 @@ fun Collection.selectMostSpecificInEachOverridableGroup( } return result } - -private fun mostSpecific( - overridableGroup: Collection, - conflictedHandles: MutableSet, - descriptorByHandle: H.() -> CallableDescriptor -): H { - val mostSpecific = OverridingUtil.selectMostSpecificMember(overridableGroup, descriptorByHandle) - val mostSpecificDescriptor = mostSpecific.descriptorByHandle() - - overridableGroup.filterNotTo(conflictedHandles) { - OverridingUtil.isMoreSpecific(mostSpecificDescriptor, it.descriptorByHandle()) - } - return mostSpecific -} - -// Return multiple elements in case of conflicts -fun Collection.selectMostSpecificFromOverridableGroup(): Collection { - val result = mutableSetOf() - result.add(mostSpecific(this, conflictedHandles = result) { this }) - return result -}