From e0782827673920fb9a58906efe457e9d935423be Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 23 Dec 2019 10:06:27 +0300 Subject: [PATCH] Fix ambiguity between Java and Kotlin SAM candidates Because of incorrect flag we generated synthetic SAM candidates and got ambiguity when feature `SamConversionPerArgument` was enabled (Gradle case) because candidates for Java were duplicated #KT-35579 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 +++ .../kotlin/synthetic/JavaSyntheticScopes.kt | 3 +- ...ndidatesFromKotlinAndJavaInOneScope.fir.kt | 26 +++++++++++++++ ...meCandidatesFromKotlinAndJavaInOneScope.kt | 26 +++++++++++++++ ...eCandidatesFromKotlinAndJavaInOneScope.txt | 32 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 +++ .../DiagnosticsUsingJavacTestGenerated.java | 5 +++ 7 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.fir.kt create mode 100644 compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.kt create mode 100644 compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.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 60cf693cf65..c343843580d 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -18718,6 +18718,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/samConversions/SAMAfterSubstitutionKT.kt"); } + @TestMetadata("sameCandidatesFromKotlinAndJavaInOneScope.kt") + public void testSameCandidatesFromKotlinAndJavaInOneScope() throws Exception { + runTest("compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.kt"); + } + @TestMetadata("SimpleCorrect.kt") public void testSimpleCorrect() throws Exception { runTest("compiler/testData/diagnostics/tests/samConversions/SimpleCorrect.kt"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt index 96b595b2cd8..32ab322e5c2 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticScopes.kt @@ -46,8 +46,7 @@ class JavaSyntheticScopes( init { val samConversionPerArgumentIsEnabled = - languageVersionSettings.supportsFeature(LanguageFeature.SamConversionPerArgument) && - languageVersionSettings.supportsFeature(LanguageFeature.ProhibitVarargAsArrayAfterSamArgument) + languageVersionSettings.supportsFeature(LanguageFeature.SamConversionPerArgument) val javaSyntheticPropertiesScope = JavaSyntheticPropertiesScope(storageManager, lookupTracker) val scopesFromExtensions = SyntheticScopeProviderExtension diff --git a/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.fir.kt b/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.fir.kt new file mode 100644 index 00000000000..367a6f5ad58 --- /dev/null +++ b/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.fir.kt @@ -0,0 +1,26 @@ +// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument +// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE + +// FILE: Action.java +public interface Action { + void execute(T t); +} + +// FILE: Other.java + +// It's important that this is Java +public interface Other { + void pluginManagement(Action pluginManagementSpec); +} + +// FILE: test.kt +interface B { + fun pluginManagement(block: Number.() -> Unit): Unit {} +} + +interface C : B, Other + +fun test(c: C) { + c.pluginManagement { + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.kt b/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.kt new file mode 100644 index 00000000000..8f59ee27653 --- /dev/null +++ b/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.kt @@ -0,0 +1,26 @@ +// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument +// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE + +// FILE: Action.java +public interface Action { + void execute(T t); +} + +// FILE: Other.java + +// It's important that this is Java +public interface Other { + void pluginManagement(Action pluginManagementSpec); +} + +// FILE: test.kt +interface B { + fun pluginManagement(block: Number.() -> Unit): Unit {} +} + +interface C : B, Other + +fun test(c: C) { + c.pluginManagement { + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.txt b/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.txt new file mode 100644 index 00000000000..21fbd2294e5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.txt @@ -0,0 +1,32 @@ +package + +public fun test(/*0*/ c: C): kotlin.Unit + +public interface Action { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun execute(/*0*/ t: T!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface B { + 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 fun pluginManagement(/*0*/ block: kotlin.Number.() -> kotlin.Unit): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface C : B, Other { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun pluginManagement(/*0*/ pluginManagementSpec: Action!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun pluginManagement(/*0*/ block: kotlin.Number.() -> kotlin.Unit): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Other { + 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 abstract fun pluginManagement(/*0*/ pluginManagementSpec: Action!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index ecd1b909114..c0f35b27b0c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -18730,6 +18730,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/samConversions/SAMAfterSubstitutionKT.kt"); } + @TestMetadata("sameCandidatesFromKotlinAndJavaInOneScope.kt") + public void testSameCandidatesFromKotlinAndJavaInOneScope() throws Exception { + runTest("compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.kt"); + } + @TestMetadata("SimpleCorrect.kt") public void testSimpleCorrect() throws Exception { runTest("compiler/testData/diagnostics/tests/samConversions/SimpleCorrect.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 8430a0e9b9c..a23066903ef 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -18720,6 +18720,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/samConversions/SAMAfterSubstitutionKT.kt"); } + @TestMetadata("sameCandidatesFromKotlinAndJavaInOneScope.kt") + public void testSameCandidatesFromKotlinAndJavaInOneScope() throws Exception { + runTest("compiler/testData/diagnostics/tests/samConversions/sameCandidatesFromKotlinAndJavaInOneScope.kt"); + } + @TestMetadata("SimpleCorrect.kt") public void testSimpleCorrect() throws Exception { runTest("compiler/testData/diagnostics/tests/samConversions/SimpleCorrect.kt");