diff --git a/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties b/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties index 3744cdb9b573..3e285565b5a8 100644 --- a/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties +++ b/plugins/kotlin/base/resources/resources-en/messages/KotlinBundle.properties @@ -2837,3 +2837,5 @@ java.collection.is.parameterized.with.nullable.type=Java collection ''{0}'' is p inspection.nullable.type.argument.in.java.collection.display.name=Nullable type argument in Java collection that doesn't support nulls replace.nullable.type.with.non.nullable.family.name=Replace nullable type with non-nullable java.collections.to.process=Java collections to process: +inspection.ambiguous.actuals.display.name=Ambiguous actuals +ambiguous.actuals.for.0={0} has several compatible actual declarations in modules {1} diff --git a/plugins/kotlin/code-insight/descriptions/resources-en/inspectionDescriptions/KotlinAmbiguousActuals.html b/plugins/kotlin/code-insight/descriptions/resources-en/inspectionDescriptions/KotlinAmbiguousActuals.html new file mode 100644 index 000000000000..dcea2f8847d1 --- /dev/null +++ b/plugins/kotlin/code-insight/descriptions/resources-en/inspectionDescriptions/KotlinAmbiguousActuals.html @@ -0,0 +1,17 @@ + + +Reports expect declarations that have ambiguous +actual declarations in implementing multi-platform modules. +

+ For example: +

+

+// common.kt
+expect class Foo
+// middle.kt
+actual class Foo
+// bottom.kt
+actual class Foo
+
+ + \ No newline at end of file diff --git a/plugins/kotlin/code-insight/inspections-k2/resources/kotlin.code-insight.inspections.k2.xml b/plugins/kotlin/code-insight/inspections-k2/resources/kotlin.code-insight.inspections.k2.xml index 08a9c6934aa6..4cd7cb9b18c2 100644 --- a/plugins/kotlin/code-insight/inspections-k2/resources/kotlin.code-insight.inspections.k2.xml +++ b/plugins/kotlin/code-insight/inspections-k2/resources/kotlin.code-insight.inspections.k2.xml @@ -397,6 +397,13 @@ level="ERROR" language="kotlin" key="inspection.no.actual.for.expect.display.name" bundle="messages.KotlinBundle"/> + + + val declaredModules = act.implementedModules.filter { it in foundActuals } + if (declaredModules.isEmpty()) emptyList() else buildList { + add(act) + addAll(declaredModules) + } + } + if (ambiguous.isNotEmpty()) { + holder.registerProblem(nameIdentifier, KotlinBundle.message("ambiguous.actuals.for.0", declaration.name.toString(), ambiguous.joinToString(", ") { it.name })) + } + } + } + } +} \ No newline at end of file diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/AbstractK2AmbiguousActualsTest.kt b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/AbstractK2AmbiguousActualsTest.kt new file mode 100644 index 000000000000..643eb1cde259 --- /dev/null +++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/AbstractK2AmbiguousActualsTest.kt @@ -0,0 +1,66 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.k2.inspections.tests + +import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.idea.base.test.IgnoreTests +import org.jetbrains.kotlin.idea.base.test.InTextDirectivesUtils +import org.jetbrains.kotlin.idea.inspections.runInspection +import org.jetbrains.kotlin.idea.k2.codeinsight.inspections.KotlinAmbiguousActualsInspection +import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure +import org.jetbrains.kotlin.idea.test.* +import org.jetbrains.kotlin.psi.KtFile +import java.io.File + +abstract class AbstractK2AmbiguousActualsTest : AbstractMultiModuleTest() { + protected fun dataFile(fileName: String): File = File(testDataPath, fileName) + + protected fun dataFile(): File = dataFile(fileName()) + + protected open fun fileName(): String = KotlinTestUtils.getTestDataFileName(this::class.java, this.name) ?: (getTestName(false) + ".kt") + + override fun getTestDataDirectory(): File { + return File(TestMetadataUtil.getTestDataPath(this::class.java)) + } + + + fun doTest(unused: String) { + setupMppProjectFromDirStructure(dataFile()) + val actionFile = project.allKotlinFiles().single { + it.name == "top.kt" || it.name == "common-1.kt" + } + val virtualFilePath = actionFile.virtualFile!!.toNioPath() + + val ignoreDirective = IgnoreTests.DIRECTIVES.of(pluginMode) + + IgnoreTests.runTestIfNotDisabledByFileDirective(virtualFilePath, ignoreDirective) { + val directiveFileText = actionFile.text + withCustomCompilerOptions(directiveFileText, project, module) { + val fileText = actionFile.text + val ambiguousActualDirective = InTextDirectivesUtils.findLineWithPrefixRemoved(fileText, "// AMBIGUOUS_ACTUALS:") + assertNotNull("Missing AMBIGUOUS_ACTUALS declaration in config file", ambiguousActualDirective) + val expectedAmbiguousActualModules = ambiguousActualDirective!!.substringAfter(":").trim() + .takeIf { !it.isEmpty() }?.split(",")?.map { it.trim() } ?: emptyList() + val problemDescriptors = runInspection( + KotlinAmbiguousActualsInspection::class.java, + project, + settings = null + ).problemElements.values.map { it.descriptionTemplate } + + + val ambiguousActuals = if (problemDescriptors.isEmpty()) { + emptyList() + } else { + val differentErrors = + problemDescriptors.map { it.substringAfter("in modules", "").trim().split(",").map { it.trim() }.filter { !it.isBlank() } } + .distinct() + assertTrue("Found more than one problemDescriptor", differentErrors.size <= 1) + differentErrors.firstOrNull() ?: emptyList() + } + assertSameElements(ambiguousActuals, expectedAmbiguousActualModules) + } + } + } + + protected open fun findAfterFile(editedFile: KtFile): PsiFile? = editedFile.containingDirectory?.findFile(editedFile.name + ".after") + +} diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2AmbiguousActualsTestGenerated.java b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2AmbiguousActualsTestGenerated.java new file mode 100644 index 000000000000..1610e5120028 --- /dev/null +++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2AmbiguousActualsTestGenerated.java @@ -0,0 +1,82 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. + +package org.jetbrains.kotlin.idea.k2.inspections.tests; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginMode; +import org.jetbrains.kotlin.idea.base.test.TestRoot; +import org.jetbrains.kotlin.idea.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.idea.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +/** + * This class is generated by {@link org.jetbrains.kotlin.testGenerator.generator.TestGenerator}. + * DO NOT MODIFY MANUALLY. + */ +@SuppressWarnings("all") +@TestRoot("code-insight/inspections-k2/tests") +@TestDataPath("$CONTENT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +@TestMetadata("../../../idea/tests/testData/multiplatform/ambiguousActuals") +public class K2AmbiguousActualsTestGenerated extends AbstractK2AmbiguousActualsTest { + @java.lang.Override + @org.jetbrains.annotations.NotNull + public final KotlinPluginMode getPluginMode() { + return KotlinPluginMode.K2; + } + + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("diamondActualInBottom") + public void testDiamondActualInBottom() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/"); + } + + @TestMetadata("diamondActualOnOnePath") + public void testDiamondActualOnOnePath() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/"); + } + + @TestMetadata("diamondDuplicateActuals") + public void testDiamondDuplicateActuals() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/"); + } + + @TestMetadata("diamondModuleDependency1") + public void testDiamondModuleDependency1() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/"); + } + + @TestMetadata("diamondModuleDependency2") + public void testDiamondModuleDependency2() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/"); + } + + @TestMetadata("diamondSeesTwoActuals") + public void testDiamondSeesTwoActuals() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/"); + } + + @TestMetadata("duplicateActualsExplicit") + public void testDuplicateActualsExplicit() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/"); + } + + @TestMetadata("duplicateActualsImplicit") + public void testDuplicateActualsImplicit() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/"); + } + + @TestMetadata("duplicateActualsOneWeaklyIncompatible") + public void testDuplicateActualsOneWeaklyIncompatible() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/"); + } + + @TestMetadata("duplicateActualsOneWithStrongIncompatibility") + public void testDuplicateActualsOneWithStrongIncompatibility() throws Exception { + runTest("../../../idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/"); + } +} diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java index 1319b119bfdb..2f1d152177f4 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java @@ -18,325 +18,342 @@ import org.junit.runner.RunWith; @TestRoot("idea/tests") @TestDataPath("$CONTENT_ROOT") @RunWith(JUnit3RunnerWithInners.class) -@TestMetadata("testData/multiplatform") -public class MultiplatformAnalysisTestGenerated extends AbstractMultiplatformAnalysisTest { - @java.lang.Override - @org.jetbrains.annotations.NotNull - public final KotlinPluginMode getPluginMode() { - return KotlinPluginMode.K1; +public abstract class MultiplatformAnalysisTestGenerated extends AbstractMultiplatformAnalysisTest { + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("testData/multiplatform") + public static class Multiplatform extends AbstractMultiplatformAnalysisTest { + @java.lang.Override + @org.jetbrains.annotations.NotNull + public final KotlinPluginMode getPluginMode() { + return KotlinPluginMode.K1; + } + + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("aliasesTypeMismatch") + public void testAliasesTypeMismatch() throws Exception { + runTest("testData/multiplatform/aliasesTypeMismatch/"); + } + + @TestMetadata("builtinsAndStdlib") + public void testBuiltinsAndStdlib() throws Exception { + runTest("testData/multiplatform/builtinsAndStdlib/"); + } + + @TestMetadata("callableReferences") + public void testCallableReferences() throws Exception { + runTest("testData/multiplatform/callableReferences/"); + } + + @TestMetadata("chainedTypeAliasRefinement") + public void testChainedTypeAliasRefinement() throws Exception { + runTest("testData/multiplatform/chainedTypeAliasRefinement/"); + } + + @TestMetadata("commonSealedWithPlatformInheritor") + public void testCommonSealedWithPlatformInheritor() throws Exception { + runTest("testData/multiplatform/commonSealedWithPlatformInheritor/"); + } + + @TestMetadata("constructorsOfExpect") + public void testConstructorsOfExpect() throws Exception { + runTest("testData/multiplatform/constructorsOfExpect/"); + } + + @TestMetadata("correctOverloadResolutionAmbiguity") + public void testCorrectOverloadResolutionAmbiguity() throws Exception { + runTest("testData/multiplatform/correctOverloadResolutionAmbiguity/"); + } + + @TestMetadata("defaultArguments") + public void testDefaultArguments() throws Exception { + runTest("testData/multiplatform/defaultArguments/"); + } + + @TestMetadata("differentKindsOfDependencies") + public void testDifferentKindsOfDependencies() throws Exception { + runTest("testData/multiplatform/differentKindsOfDependencies/"); + } + + @TestMetadata("duplicateExpectsExplicit") + public void testDuplicateExpectsExplicit() throws Exception { + runTest("testData/multiplatform/duplicateExpectsExplicit/"); + } + + @TestMetadata("duplicateExpectsImplicit") + public void testDuplicateExpectsImplicit() throws Exception { + runTest("testData/multiplatform/duplicateExpectsImplicit/"); + } + + @TestMetadata("duplicateExpectsWithStrongIncompatibility") + public void testDuplicateExpectsWithStrongIncompatibility() throws Exception { + runTest("testData/multiplatform/duplicateExpectsWithStrongIncompatibility/"); + } + + @TestMetadata("enumFromCommonSerlializableSupertype") + public void testEnumFromCommonSerlializableSupertype() throws Exception { + runTest("testData/multiplatform/enumFromCommonSerlializableSupertype/"); + } + + @TestMetadata("expectActualLineMarkers") + public void testExpectActualLineMarkers() throws Exception { + runTest("testData/multiplatform/expectActualLineMarkers/"); + } + + @TestMetadata("extensionOnExpect") + public void testExtensionOnExpect() throws Exception { + runTest("testData/multiplatform/extensionOnExpect/"); + } + + @TestMetadata("hierarcicalActualization") + public void testHierarcicalActualization() throws Exception { + runTest("testData/multiplatform/hierarcicalActualization/"); + } + + @TestMetadata("incompleteActualization") + public void testIncompleteActualization() throws Exception { + runTest("testData/multiplatform/incompleteActualization/"); + } + + @TestMetadata("internalFromDependsOn") + public void testInternalFromDependsOn() throws Exception { + runTest("testData/multiplatform/internalFromDependsOn/"); + } + + @TestMetadata("internalFromDependsOnOfProduction") + public void testInternalFromDependsOnOfProduction() throws Exception { + runTest("testData/multiplatform/internalFromDependsOnOfProduction/"); + } + + @TestMetadata("internalFromProduction") + public void testInternalFromProduction() throws Exception { + runTest("testData/multiplatform/internalFromProduction/"); + } + + @TestMetadata("jsNameClash") + public void testJsNameClash() throws Exception { + runTest("testData/multiplatform/jsNameClash/"); + } + + @TestMetadata("jvmInlineValueClass") + public void testJvmInlineValueClass() throws Exception { + runTest("testData/multiplatform/jvmInlineValueClass/"); + } + + @TestMetadata("kt41218") + public void testKt41218() throws Exception { + runTest("testData/multiplatform/kt41218/"); + } + + @TestMetadata("kt44898") + public void testKt44898() throws Exception { + runTest("testData/multiplatform/kt44898/"); + } + + @TestMetadata("kt48291") + public void testKt48291() throws Exception { + runTest("testData/multiplatform/kt48291/"); + } + + @TestMetadata("ktij22295") + public void testKtij22295() throws Exception { + runTest("testData/multiplatform/ktij22295/"); + } + + @TestMetadata("ktij27523") + public void testKtij27523() throws Exception { + runTest("testData/multiplatform/ktij27523/"); + } + + @TestMetadata("lambdas") + public void testLambdas() throws Exception { + runTest("testData/multiplatform/lambdas/"); + } + + @TestMetadata("languageConstructions") + public void testLanguageConstructions() throws Exception { + runTest("testData/multiplatform/languageConstructions/"); + } + + @TestMetadata("multilevelParents") + public void testMultilevelParents() throws Exception { + runTest("testData/multiplatform/multilevelParents/"); + } + + @TestMetadata("multiplatformLibrary") + public void testMultiplatformLibrary() throws Exception { + runTest("testData/multiplatform/multiplatformLibrary/"); + } + + @TestMetadata("nativeStdlib") + public void testNativeStdlib() throws Exception { + runTest("testData/multiplatform/nativeStdlib/"); + } + + @TestMetadata("nativeTestLineMarker") + public void testNativeTestLineMarker() throws Exception { + runTest("testData/multiplatform/nativeTestLineMarker/"); + } + + @TestMetadata("overrideExpect") + public void testOverrideExpect() throws Exception { + runTest("testData/multiplatform/overrideExpect/"); + } + + @TestMetadata("overrideExpectWithCompositeType") + public void testOverrideExpectWithCompositeType() throws Exception { + runTest("testData/multiplatform/overrideExpectWithCompositeType/"); + } + + @TestMetadata("platformDependencyInCommon") + public void testPlatformDependencyInCommon() throws Exception { + runTest("testData/multiplatform/platformDependencyInCommon/"); + } + + @TestMetadata("platformSpecificChecksInCommon") + public void testPlatformSpecificChecksInCommon() throws Exception { + runTest("testData/multiplatform/platformSpecificChecksInCommon/"); + } + + @TestMetadata("qualifiedReceiver") + public void testQualifiedReceiver() throws Exception { + runTest("testData/multiplatform/qualifiedReceiver/"); + } + + @TestMetadata("recursiveTypes") + public void testRecursiveTypes() throws Exception { + runTest("testData/multiplatform/recursiveTypes/"); + } + + @TestMetadata("sealedInheritorsInComplexModuleStructure1") + public void testSealedInheritorsInComplexModuleStructure1() throws Exception { + runTest("testData/multiplatform/sealedInheritorsInComplexModuleStructure1/"); + } + + @TestMetadata("sealedInheritorsInComplexModuleStructure2") + public void testSealedInheritorsInComplexModuleStructure2() throws Exception { + runTest("testData/multiplatform/sealedInheritorsInComplexModuleStructure2/"); + } + + @TestMetadata("simple") + public void testSimple() throws Exception { + runTest("testData/multiplatform/simple/"); + } + + @TestMetadata("smartCastOnPropertyFromDependentModule") + public void testSmartCastOnPropertyFromDependentModule() throws Exception { + runTest("testData/multiplatform/smartCastOnPropertyFromDependentModule/"); + } + + @TestMetadata("supertypes") + public void testSupertypes() throws Exception { + runTest("testData/multiplatform/supertypes/"); + } + + @TestMetadata("transitiveDependencyOnCommonSourceSets") + public void testTransitiveDependencyOnCommonSourceSets() throws Exception { + runTest("testData/multiplatform/transitiveDependencyOnCommonSourceSets/"); + } + + @TestMetadata("typeAliasToExpectClassExplicitReference") + public void testTypeAliasToExpectClassExplicitReference() throws Exception { + runTest("testData/multiplatform/typeAliasToExpectClassExplicitReference/"); + } + + @TestMetadata("typeAliases") + public void testTypeAliases() throws Exception { + runTest("testData/multiplatform/typeAliases/"); + } + + @TestMetadata("typeParameters") + public void testTypeParameters() throws Exception { + runTest("testData/multiplatform/typeParameters/"); + } + + @TestMetadata("unresolvedInMultiplatformLibrary") + public void testUnresolvedInMultiplatformLibrary() throws Exception { + runTest("testData/multiplatform/unresolvedInMultiplatformLibrary/"); + } + + @TestMetadata("useCorrectBuiltIns") + public void testUseCorrectBuiltIns() throws Exception { + runTest("testData/multiplatform/useCorrectBuiltIns/"); + } + + @TestMetadata("weaklyIncompatibleActualInIntermediateModule") + public void testWeaklyIncompatibleActualInIntermediateModule() throws Exception { + runTest("testData/multiplatform/weaklyIncompatibleActualInIntermediateModule/"); + } + + @TestMetadata("whenExhaustivenessForSealed") + public void testWhenExhaustivenessForSealed() throws Exception { + runTest("testData/multiplatform/whenExhaustivenessForSealed/"); + } } - private void runTest(String testDataFilePath) throws Exception { - KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); - } + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("testData/multiplatform/ambiguousActuals") + public static class AmbiguousActuals extends AbstractMultiplatformAnalysisTest { + @java.lang.Override + @org.jetbrains.annotations.NotNull + public final KotlinPluginMode getPluginMode() { + return KotlinPluginMode.K1; + } - @TestMetadata("aliasesTypeMismatch") - public void testAliasesTypeMismatch() throws Exception { - runTest("testData/multiplatform/aliasesTypeMismatch/"); - } + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } - @TestMetadata("builtinsAndStdlib") - public void testBuiltinsAndStdlib() throws Exception { - runTest("testData/multiplatform/builtinsAndStdlib/"); - } + @TestMetadata("diamondActualInBottom") + public void testDiamondActualInBottom() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/diamondActualInBottom/"); + } - @TestMetadata("callableReferences") - public void testCallableReferences() throws Exception { - runTest("testData/multiplatform/callableReferences/"); - } + @TestMetadata("diamondActualOnOnePath") + public void testDiamondActualOnOnePath() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/"); + } - @TestMetadata("chainedTypeAliasRefinement") - public void testChainedTypeAliasRefinement() throws Exception { - runTest("testData/multiplatform/chainedTypeAliasRefinement/"); - } + @TestMetadata("diamondDuplicateActuals") + public void testDiamondDuplicateActuals() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/"); + } - @TestMetadata("commonSealedWithPlatformInheritor") - public void testCommonSealedWithPlatformInheritor() throws Exception { - runTest("testData/multiplatform/commonSealedWithPlatformInheritor/"); - } + @TestMetadata("diamondModuleDependency1") + public void testDiamondModuleDependency1() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/diamondModuleDependency1/"); + } - @TestMetadata("constructorsOfExpect") - public void testConstructorsOfExpect() throws Exception { - runTest("testData/multiplatform/constructorsOfExpect/"); - } + @TestMetadata("diamondModuleDependency2") + public void testDiamondModuleDependency2() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/diamondModuleDependency2/"); + } - @TestMetadata("correctOverloadResolutionAmbiguity") - public void testCorrectOverloadResolutionAmbiguity() throws Exception { - runTest("testData/multiplatform/correctOverloadResolutionAmbiguity/"); - } + @TestMetadata("diamondSeesTwoActuals") + public void testDiamondSeesTwoActuals() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/"); + } - @TestMetadata("defaultArguments") - public void testDefaultArguments() throws Exception { - runTest("testData/multiplatform/defaultArguments/"); - } + @TestMetadata("duplicateActualsExplicit") + public void testDuplicateActualsExplicit() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/"); + } - @TestMetadata("diamondActualInBottom") - public void testDiamondActualInBottom() throws Exception { - runTest("testData/multiplatform/diamondActualInBottom/"); - } + @TestMetadata("duplicateActualsImplicit") + public void testDuplicateActualsImplicit() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/"); + } - @TestMetadata("diamondActualOnOnePath") - public void testDiamondActualOnOnePath() throws Exception { - runTest("testData/multiplatform/diamondActualOnOnePath/"); - } + @TestMetadata("duplicateActualsOneWeaklyIncompatible") + public void testDuplicateActualsOneWeaklyIncompatible() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/"); + } - @TestMetadata("diamondDuplicateActuals") - public void testDiamondDuplicateActuals() throws Exception { - runTest("testData/multiplatform/diamondDuplicateActuals/"); - } - - @TestMetadata("diamondModuleDependency1") - public void testDiamondModuleDependency1() throws Exception { - runTest("testData/multiplatform/diamondModuleDependency1/"); - } - - @TestMetadata("diamondModuleDependency2") - public void testDiamondModuleDependency2() throws Exception { - runTest("testData/multiplatform/diamondModuleDependency2/"); - } - - @TestMetadata("diamondSeesTwoActuals") - public void testDiamondSeesTwoActuals() throws Exception { - runTest("testData/multiplatform/diamondSeesTwoActuals/"); - } - - @TestMetadata("differentKindsOfDependencies") - public void testDifferentKindsOfDependencies() throws Exception { - runTest("testData/multiplatform/differentKindsOfDependencies/"); - } - - @TestMetadata("duplicateActualsExplicit") - public void testDuplicateActualsExplicit() throws Exception { - runTest("testData/multiplatform/duplicateActualsExplicit/"); - } - - @TestMetadata("duplicateActualsImplicit") - public void testDuplicateActualsImplicit() throws Exception { - runTest("testData/multiplatform/duplicateActualsImplicit/"); - } - - @TestMetadata("duplicateActualsOneWeaklyIncompatible") - public void testDuplicateActualsOneWeaklyIncompatible() throws Exception { - runTest("testData/multiplatform/duplicateActualsOneWeaklyIncompatible/"); - } - - @TestMetadata("duplicateActualsOneWithStrongIncompatibility") - public void testDuplicateActualsOneWithStrongIncompatibility() throws Exception { - runTest("testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/"); - } - - @TestMetadata("duplicateExpectsExplicit") - public void testDuplicateExpectsExplicit() throws Exception { - runTest("testData/multiplatform/duplicateExpectsExplicit/"); - } - - @TestMetadata("duplicateExpectsImplicit") - public void testDuplicateExpectsImplicit() throws Exception { - runTest("testData/multiplatform/duplicateExpectsImplicit/"); - } - - @TestMetadata("duplicateExpectsWithStrongIncompatibility") - public void testDuplicateExpectsWithStrongIncompatibility() throws Exception { - runTest("testData/multiplatform/duplicateExpectsWithStrongIncompatibility/"); - } - - @TestMetadata("enumFromCommonSerlializableSupertype") - public void testEnumFromCommonSerlializableSupertype() throws Exception { - runTest("testData/multiplatform/enumFromCommonSerlializableSupertype/"); - } - - @TestMetadata("expectActualLineMarkers") - public void testExpectActualLineMarkers() throws Exception { - runTest("testData/multiplatform/expectActualLineMarkers/"); - } - - @TestMetadata("extensionOnExpect") - public void testExtensionOnExpect() throws Exception { - runTest("testData/multiplatform/extensionOnExpect/"); - } - - @TestMetadata("hierarcicalActualization") - public void testHierarcicalActualization() throws Exception { - runTest("testData/multiplatform/hierarcicalActualization/"); - } - - @TestMetadata("incompleteActualization") - public void testIncompleteActualization() throws Exception { - runTest("testData/multiplatform/incompleteActualization/"); - } - - @TestMetadata("internalFromDependsOn") - public void testInternalFromDependsOn() throws Exception { - runTest("testData/multiplatform/internalFromDependsOn/"); - } - - @TestMetadata("internalFromDependsOnOfProduction") - public void testInternalFromDependsOnOfProduction() throws Exception { - runTest("testData/multiplatform/internalFromDependsOnOfProduction/"); - } - - @TestMetadata("internalFromProduction") - public void testInternalFromProduction() throws Exception { - runTest("testData/multiplatform/internalFromProduction/"); - } - - @TestMetadata("jsNameClash") - public void testJsNameClash() throws Exception { - runTest("testData/multiplatform/jsNameClash/"); - } - - @TestMetadata("jvmInlineValueClass") - public void testJvmInlineValueClass() throws Exception { - runTest("testData/multiplatform/jvmInlineValueClass/"); - } - - @TestMetadata("kt41218") - public void testKt41218() throws Exception { - runTest("testData/multiplatform/kt41218/"); - } - - @TestMetadata("kt44898") - public void testKt44898() throws Exception { - runTest("testData/multiplatform/kt44898/"); - } - - @TestMetadata("kt48291") - public void testKt48291() throws Exception { - runTest("testData/multiplatform/kt48291/"); - } - - @TestMetadata("ktij22295") - public void testKtij22295() throws Exception { - runTest("testData/multiplatform/ktij22295/"); - } - - @TestMetadata("ktij27523") - public void testKtij27523() throws Exception { - runTest("testData/multiplatform/ktij27523/"); - } - - @TestMetadata("lambdas") - public void testLambdas() throws Exception { - runTest("testData/multiplatform/lambdas/"); - } - - @TestMetadata("languageConstructions") - public void testLanguageConstructions() throws Exception { - runTest("testData/multiplatform/languageConstructions/"); - } - - @TestMetadata("multilevelParents") - public void testMultilevelParents() throws Exception { - runTest("testData/multiplatform/multilevelParents/"); - } - - @TestMetadata("multiplatformLibrary") - public void testMultiplatformLibrary() throws Exception { - runTest("testData/multiplatform/multiplatformLibrary/"); - } - - @TestMetadata("nativeStdlib") - public void testNativeStdlib() throws Exception { - runTest("testData/multiplatform/nativeStdlib/"); - } - - @TestMetadata("nativeTestLineMarker") - public void testNativeTestLineMarker() throws Exception { - runTest("testData/multiplatform/nativeTestLineMarker/"); - } - - @TestMetadata("overrideExpect") - public void testOverrideExpect() throws Exception { - runTest("testData/multiplatform/overrideExpect/"); - } - - @TestMetadata("overrideExpectWithCompositeType") - public void testOverrideExpectWithCompositeType() throws Exception { - runTest("testData/multiplatform/overrideExpectWithCompositeType/"); - } - - @TestMetadata("platformDependencyInCommon") - public void testPlatformDependencyInCommon() throws Exception { - runTest("testData/multiplatform/platformDependencyInCommon/"); - } - - @TestMetadata("platformSpecificChecksInCommon") - public void testPlatformSpecificChecksInCommon() throws Exception { - runTest("testData/multiplatform/platformSpecificChecksInCommon/"); - } - - @TestMetadata("qualifiedReceiver") - public void testQualifiedReceiver() throws Exception { - runTest("testData/multiplatform/qualifiedReceiver/"); - } - - @TestMetadata("recursiveTypes") - public void testRecursiveTypes() throws Exception { - runTest("testData/multiplatform/recursiveTypes/"); - } - - @TestMetadata("sealedInheritorsInComplexModuleStructure1") - public void testSealedInheritorsInComplexModuleStructure1() throws Exception { - runTest("testData/multiplatform/sealedInheritorsInComplexModuleStructure1/"); - } - - @TestMetadata("sealedInheritorsInComplexModuleStructure2") - public void testSealedInheritorsInComplexModuleStructure2() throws Exception { - runTest("testData/multiplatform/sealedInheritorsInComplexModuleStructure2/"); - } - - @TestMetadata("simple") - public void testSimple() throws Exception { - runTest("testData/multiplatform/simple/"); - } - - @TestMetadata("smartCastOnPropertyFromDependentModule") - public void testSmartCastOnPropertyFromDependentModule() throws Exception { - runTest("testData/multiplatform/smartCastOnPropertyFromDependentModule/"); - } - - @TestMetadata("supertypes") - public void testSupertypes() throws Exception { - runTest("testData/multiplatform/supertypes/"); - } - - @TestMetadata("transitiveDependencyOnCommonSourceSets") - public void testTransitiveDependencyOnCommonSourceSets() throws Exception { - runTest("testData/multiplatform/transitiveDependencyOnCommonSourceSets/"); - } - - @TestMetadata("typeAliasToExpectClassExplicitReference") - public void testTypeAliasToExpectClassExplicitReference() throws Exception { - runTest("testData/multiplatform/typeAliasToExpectClassExplicitReference/"); - } - - @TestMetadata("typeAliases") - public void testTypeAliases() throws Exception { - runTest("testData/multiplatform/typeAliases/"); - } - - @TestMetadata("typeParameters") - public void testTypeParameters() throws Exception { - runTest("testData/multiplatform/typeParameters/"); - } - - @TestMetadata("unresolvedInMultiplatformLibrary") - public void testUnresolvedInMultiplatformLibrary() throws Exception { - runTest("testData/multiplatform/unresolvedInMultiplatformLibrary/"); - } - - @TestMetadata("useCorrectBuiltIns") - public void testUseCorrectBuiltIns() throws Exception { - runTest("testData/multiplatform/useCorrectBuiltIns/"); - } - - @TestMetadata("weaklyIncompatibleActualInIntermediateModule") - public void testWeaklyIncompatibleActualInIntermediateModule() throws Exception { - runTest("testData/multiplatform/weaklyIncompatibleActualInIntermediateModule/"); - } - - @TestMetadata("whenExhaustivenessForSealed") - public void testWhenExhaustivenessForSealed() throws Exception { - runTest("testData/multiplatform/whenExhaustivenessForSealed/"); + @TestMetadata("duplicateActualsOneWithStrongIncompatibility") + public void testDuplicateActualsOneWithStrongIncompatibility() throws Exception { + runTest("testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/"); + } } } diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/left/left.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/left/left.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/left/left.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/left/left.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/right/right.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/right/right.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/right/right.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/right/right.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/top/top.kt similarity index 80% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/top/top.kt index 1485d55dec9e..0e5276233844 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualInBottom/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualInBottom/top/top.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: package sample expect class A diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/left/left.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/left/left.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/left/left.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/left/left.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/right/right.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/right/right.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/right/right.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/right/right.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/top/top.kt similarity index 89% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/top/top.kt index c8858d46bfc9..b50b7764e09a 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/diamondActualOnOnePath/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondActualOnOnePath/top/top.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: package sample expect class ActualizedInLeft diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/left/left.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/left/left.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/left/left.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/left/left.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/right/right.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/right/right.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/right/right.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/right/right.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/top/top.kt similarity index 91% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/top/top.kt index 11fc5e276706..98da97619999 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/diamondDuplicateActuals/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondDuplicateActuals/top/top.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: bottom, left // !RENDER_DIAGNOSTICS_MESSAGES package sample diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/common-1/common-1.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/common-1/common-1.kt similarity index 95% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/common-1/common-1.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/common-1/common-1.kt index 7f6ec8b45c2f..f19fb4820036 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/common-1/common-1.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/common-1/common-1.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: @file:Suppress("UNUSED_PARAMETER") package sample diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/common-2-1/common-2-1.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/common-2-1/common-2-1.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/common-2-1/common-2-1.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/common-2-1/common-2-1.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/common-2-2/common-2-2.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/common-2-2/common-2-2.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/common-2-2/common-2-2.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/common-2-2/common-2-2.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/graph.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/graph.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/graph.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/graph.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/jvm/jvm.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency1/jvm/jvm.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency1/jvm/jvm.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-1/common-1.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-1/common-1.kt similarity index 96% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-1/common-1.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-1/common-1.kt index 0a3f23bdc190..dad9c010a5ac 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-1/common-1.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-1/common-1.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: @file:Suppress("UNUSED_PARAMETER") package sample diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-2-1/common-2-1.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-2-1/common-2-1.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-2-1/common-2-1.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-2-1/common-2-1.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-2-2/common-2-2.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-2-2/common-2-2.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-2-2/common-2-2.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-2-2/common-2-2.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-2-3/common-2-3.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-2-3/common-2-3.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/common-2-3/common-2-3.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/common-2-3/common-2-3.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/graph.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/graph.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/graph.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/graph.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/jvm/jvm.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondModuleDependency2/jvm/jvm.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondModuleDependency2/jvm/jvm.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/left/left.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/left/left.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/left/left.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/left/left.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/right/right.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/right/right.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/right/right.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/right/right.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/top/top.kt similarity index 92% rename from plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/top/top.kt index 1dbc9d764f52..9f55d1a2e2bd 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/diamondSeesTwoActuals/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/diamondSeesTwoActuals/top/top.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: package sample expect class A { diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/middle/middle.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/middle/middle.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/middle/middle.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/middle/middle.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/top/top.kt similarity index 80% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/top/top.kt index da2de51bd1b6..9b350cc1f04b 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsExplicit/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsExplicit/top/top.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: bottom, middle package foo expect class A diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/middle/middle.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/middle/middle.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/middle/middle.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/middle/middle.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/top/top.kt similarity index 93% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/top/top.kt index 1f88b5751bc8..e2f8a56bbb16 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsImplicit/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsImplicit/top/top.kt @@ -1,4 +1,5 @@ // !RENDER_DIAGNOSTICS_MESSAGES +// AMBIGUOUS_ACTUALS: bottom, middle package foo diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/middle/middle.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/middle/middle.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/middle/middle.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/middle/middle.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/top/top.kt similarity index 81% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/top/top.kt index 2310983f5143..8a53ed318160 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWeaklyIncompatible/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWeaklyIncompatible/top/top.kt @@ -1,5 +1,5 @@ // !RENDER_DIAGNOSTICS_MESSAGES - +// AMBIGUOUS_ACTUALS: bottom, middle package foo expect class A diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/bottom/bottom.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/bottom/bottom.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/bottom/bottom.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/bottom/bottom.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/dependencies.txt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/dependencies.txt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/dependencies.txt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/dependencies.txt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/middle/middle.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/middle/middle.kt similarity index 100% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/middle/middle.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/middle/middle.kt diff --git a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/top/top.kt b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/top/top.kt similarity index 86% rename from plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/top/top.kt rename to plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/top/top.kt index 0328a09beb79..1fac159f5e05 100644 --- a/plugins/kotlin/idea/tests/testData/multiplatform/duplicateActualsOneWithStrongIncompatibility/top/top.kt +++ b/plugins/kotlin/idea/tests/testData/multiplatform/ambiguousActuals/duplicateActualsOneWithStrongIncompatibility/top/top.kt @@ -1,3 +1,4 @@ +// AMBIGUOUS_ACTUALS: package foo expect fun foo(): Int diff --git a/plugins/kotlin/kotlin.searching/src/org/jetbrains/kotlin/idea/searching/kmp/findAllActualForExpect.kt b/plugins/kotlin/kotlin.searching/src/org/jetbrains/kotlin/idea/searching/kmp/findAllActualForExpect.kt index db3740350c33..e6b66f30acef 100644 --- a/plugins/kotlin/kotlin.searching/src/org/jetbrains/kotlin/idea/searching/kmp/findAllActualForExpect.kt +++ b/plugins/kotlin/kotlin.searching/src/org/jetbrains/kotlin/idea/searching/kmp/findAllActualForExpect.kt @@ -18,9 +18,10 @@ import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyFqnNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.isExpectDeclaration @RequiresBackgroundThread(generateAssertion = false) -fun KtDeclaration.findAllActualForExpect(searchScope: SearchScope = runReadAction { useScope }): Sequence> { +fun KtDeclaration.findAllActualForExpect(searchScope: SearchScope = runReadAction { useScope }, compatibleOnly: Boolean = true): Sequence> { val declaration = this val scope = searchScope as? GlobalSearchScope ?: return emptySequence() val containingClassOrObjectOrSelf = parentOfType(withSelf = true) @@ -28,9 +29,9 @@ fun KtDeclaration.findAllActualForExpect(searchScope: SearchScope = runReadActio containingClassOrObjectOrSelf?.fqName?.let { fqName -> val fqNameAsString = fqName.asString() val targetDeclarations = KotlinFullClassNameIndex.getAllElements(fqNameAsString, project, scope) { - it.matchesWithExpect(containingClassOrObjectOrSelf) + it.matchesWithExpect(containingClassOrObjectOrSelf, compatibleOnly) } + KotlinTopLevelTypeAliasFqNameIndex.getAllElements(fqNameAsString, project, scope) { - it.matchesWithExpect(containingClassOrObjectOrSelf) + it.matchesWithExpect(containingClassOrObjectOrSelf, compatibleOnly) } return targetDeclarations.mapNotNull { targetDeclaration -> @@ -39,10 +40,13 @@ fun KtDeclaration.findAllActualForExpect(searchScope: SearchScope = runReadActio is KtConstructor<*> -> { if (targetDeclaration is KtClass) { val primaryConstructor = targetDeclaration.primaryConstructor - if (primaryConstructor?.matchesWithExpect(declaration) == true) { + if (primaryConstructor?.matchesWithExpect(declaration, compatibleOnly) == true) { primaryConstructor } else { - val secondaryConstructor = targetDeclaration.secondaryConstructors.find { it.matchesWithExpect(declaration) } + val secondaryConstructor = targetDeclaration.secondaryConstructors.find { it.matchesWithExpect( + declaration, + compatibleOnly + ) } if (secondaryConstructor != null) secondaryConstructor else if (declaration.valueParameters.isEmpty()) targetDeclaration else null } } else null @@ -50,7 +54,7 @@ fun KtDeclaration.findAllActualForExpect(searchScope: SearchScope = runReadActio is KtNamedDeclaration -> when (targetDeclaration) { is KtClassOrObject -> targetDeclaration.declarations.firstOrNull { - it is KtNamedDeclaration && it.name == declaration.name && it.matchesWithExpect(declaration) + it is KtNamedDeclaration && it.name == declaration.name && it.matchesWithExpect(declaration, compatibleOnly) } else -> null } @@ -65,11 +69,11 @@ fun KtDeclaration.findAllActualForExpect(searchScope: SearchScope = runReadActio val topLevelFqName = packageFqName.child(Name.identifier(name)).asString() return when (declaration) { is KtNamedFunction -> KotlinTopLevelFunctionFqnNameIndex.getAllElements(topLevelFqName, project, scope) { - it.matchesWithExpect(declaration) + it.matchesWithExpect(declaration, compatibleOnly) } is KtProperty -> KotlinTopLevelPropertyFqnNameIndex.getAllElements(topLevelFqName, project, scope) { - it.matchesWithExpect(declaration) + it.matchesWithExpect(declaration, compatibleOnly) } else -> emptySequence() @@ -77,10 +81,19 @@ fun KtDeclaration.findAllActualForExpect(searchScope: SearchScope = runReadActio } @OptIn(KaExperimentalApi::class) -private fun KtDeclaration.matchesWithExpect(expectDeclaration: KtDeclaration): Boolean { +private fun KtDeclaration.matchesWithExpect(expectDeclaration: KtDeclaration, compatibleOnly: Boolean): Boolean { val declaration = this - return declaration.isEffectivelyActual() && analyze(declaration) { + if (compatibleOnly) { + if (!declaration.isEffectivelyActual()) { + return false + } + } else { + if (declaration.isExpectDeclaration()) { + return false + } + } + return analyze(declaration) { val symbol: KaDeclarationSymbol = declaration.symbol - return symbol.getExpectsForActual().any { it.psi == expectDeclaration } + symbol.getExpectsForActual().any { it.psi == expectDeclaration } } } diff --git a/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt b/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt index 6e8d3c6fda7c..a809e968a622 100644 --- a/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt +++ b/plugins/kotlin/util/test-generator-fe10/test/org/jetbrains/kotlin/fe10/testGenerator/Fe10GenerateTests.kt @@ -1131,7 +1131,8 @@ private fun assembleWorkspace(): TWorkspace = workspace(KotlinPluginMode.K1) { } testClass { - model("multiplatform", isRecursive = false, pattern = DIRECTORY) + model("multiplatform", isRecursive = false, pattern = DIRECTORY, excludedDirectories = listOf("ambiguousActuals")) + model("multiplatform/ambiguousActuals", isRecursive = false, pattern = DIRECTORY) } testClass { diff --git a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2InspectionTests.kt b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2InspectionTests.kt index 02fcf2b4f848..156c49482b5f 100644 --- a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2InspectionTests.kt +++ b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2InspectionTests.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.idea.k2.quickfix.tests.AbstractK2MultiFileQuickFixTe import org.jetbrains.kotlin.idea.k2.quickfix.tests.AbstractK2QuickFixTest import org.jetbrains.kotlin.testGenerator.model.* import org.jetbrains.kotlin.testGenerator.model.GroupCategory.* +import org.jetbrains.kotlin.testGenerator.model.Patterns.DIRECTORY internal fun MutableTWorkspace.generateK2InspectionTests() { @@ -170,6 +171,10 @@ internal fun MutableTWorkspace.generateK2InspectionTests() { model("code-insight/inspections-k2/tests/testData/multiFileInspectionsLocal", pattern = pattern) } + testClass { + model("${idea}/multiplatform/ambiguousActuals", pattern = DIRECTORY, isRecursive = false) + } + testClass { val pattern = Patterns.forRegex("^([\\w\\-_]+)\\.kt$") model("code-insight/inspections-k2/tests/testData/multiplatform/actualExpect/", pattern = pattern, isRecursive = false)