diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt index 2eab26de58d..6b5597b9f09 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt @@ -23,7 +23,6 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.ModuleRootManager import com.intellij.psi.JavaDirectoryService import com.intellij.psi.codeStyle.CodeStyleManager import org.jetbrains.kotlin.builtins.KotlinBuiltIns @@ -32,13 +31,13 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.core.* +import org.jetbrains.kotlin.idea.facet.implementingModules import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory import org.jetbrains.kotlin.idea.refactoring.createKotlinFile import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.application.runWriteAction -import org.jetbrains.kotlin.idea.util.projectStructure.allModules import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.MultiTargetPlatform @@ -62,7 +61,7 @@ sealed class CreateActualFix( val element = element ?: return val factory = KtPsiFactory(project) - val actualFile = getOrCreateImplementationFile(project) ?: return + val actualFile = getOrCreateImplementationFile() ?: return val generated = factory.generateIt(project, element) ?: return runWriteAction { @@ -87,16 +86,13 @@ sealed class CreateActualFix( } } - private fun Project.implementationModuleOf(expectedModule: Module) = - allModules().firstOrNull { + private fun implementationModuleOf(expectedModule: Module) = + expectedModule.implementingModules.firstOrNull { PackageUtil.checkSourceRootsConfigured(it, false) && - TargetPlatformDetector.getPlatform(it).multiTargetPlatform == actualPlatform && - expectedModule in ModuleRootManager.getInstance(it).dependencies + TargetPlatformDetector.getPlatform(it).multiTargetPlatform == actualPlatform } - private fun getOrCreateImplementationFile( - project: Project - ): KtFile? { + private fun getOrCreateImplementationFile(): KtFile? { val declaration = element as? KtNamedDeclaration ?: return null val name = declaration.name ?: return null @@ -104,7 +100,7 @@ sealed class CreateActualFix( val expectedPackage = JavaDirectoryService.getInstance().getPackage(expectedDir) val expectedModule = ModuleUtilCore.findModuleForPsiElement(declaration) ?: return null - val actualModule = project.implementationModuleOf(expectedModule) ?: return null + val actualModule = implementationModuleOf(expectedModule) ?: return null val actualDirectory = PackageUtil.findOrCreateDirectoryForPackage( actualModule, expectedPackage?.qualifiedName ?: "", null, false ) ?: return null diff --git a/idea/testData/multiModuleQuickFix/withFakeJvm/fake_jvm/foo.kt b/idea/testData/multiModuleQuickFix/withFakeJvm/fake_jvm/foo.kt new file mode 100644 index 00000000000..14287f6695d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withFakeJvm/fake_jvm/foo.kt @@ -0,0 +1 @@ +// foo: NOT to be implemented diff --git a/idea/testData/multiModuleQuickFix/withFakeJvm/fake_jvm/foo.kt.after b/idea/testData/multiModuleQuickFix/withFakeJvm/fake_jvm/foo.kt.after new file mode 100644 index 00000000000..14287f6695d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withFakeJvm/fake_jvm/foo.kt.after @@ -0,0 +1 @@ +// foo: NOT to be implemented diff --git a/idea/testData/multiModuleQuickFix/withFakeJvm/header/header.kt b/idea/testData/multiModuleQuickFix/withFakeJvm/header/header.kt new file mode 100644 index 00000000000..6da21495109 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withFakeJvm/header/header.kt @@ -0,0 +1,3 @@ +// "Create actual function for platform JVM" "true" + +expect fun foo(arg: Int): String \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withFakeJvm/header/header.kt.after b/idea/testData/multiModuleQuickFix/withFakeJvm/header/header.kt.after new file mode 100644 index 00000000000..9f63574042e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withFakeJvm/header/header.kt.after @@ -0,0 +1,3 @@ +// "Create actual function for platform JVM" "true" + +expect fun foo(arg: Int): String \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withFakeJvm/jvm/foo.kt b/idea/testData/multiModuleQuickFix/withFakeJvm/jvm/foo.kt new file mode 100644 index 00000000000..611b3f4a6eb --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withFakeJvm/jvm/foo.kt @@ -0,0 +1 @@ +// foo: to be implemented \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withFakeJvm/jvm/foo.kt.after b/idea/testData/multiModuleQuickFix/withFakeJvm/jvm/foo.kt.after new file mode 100644 index 00000000000..7270ed6e51a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withFakeJvm/jvm/foo.kt.after @@ -0,0 +1,4 @@ +// foo: to be implemented +actual fun foo(arg: Int): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/common/common.kt b/idea/testData/multiModuleQuickFix/withTestDummy/common/common.kt new file mode 100644 index 00000000000..0f4d9089f40 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/common/common.kt @@ -0,0 +1,3 @@ +// "Create actual function for platform JVM" "true" + +expect fun testHelper() \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/common/common.kt.after b/idea/testData/multiModuleQuickFix/withTestDummy/common/common.kt.after new file mode 100644 index 00000000000..17a1d58dcd5 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/common/common.kt.after @@ -0,0 +1,3 @@ +// "Create actual function for platform JVM" "true" + +expect fun testHelper() \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/commonTest/test.kt b/idea/testData/multiModuleQuickFix/withTestDummy/commonTest/test.kt new file mode 100644 index 00000000000..5c867189d56 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/commonTest/test.kt @@ -0,0 +1 @@ +// TEST \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/commonTest/test.kt.after b/idea/testData/multiModuleQuickFix/withTestDummy/commonTest/test.kt.after new file mode 100644 index 00000000000..5c867189d56 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/commonTest/test.kt.after @@ -0,0 +1 @@ +// TEST \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/jvm/testHelper.kt b/idea/testData/multiModuleQuickFix/withTestDummy/jvm/testHelper.kt new file mode 100644 index 00000000000..ac6469cef85 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/jvm/testHelper.kt @@ -0,0 +1 @@ +// testHelper: to be implemented diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/jvm/testHelper.kt.after b/idea/testData/multiModuleQuickFix/withTestDummy/jvm/testHelper.kt.after new file mode 100644 index 00000000000..fcf7f8d277c --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/jvm/testHelper.kt.after @@ -0,0 +1,2 @@ +// testHelper: to be implemented +actual fun testHelper() {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/jvmTest/testHelper.kt b/idea/testData/multiModuleQuickFix/withTestDummy/jvmTest/testHelper.kt new file mode 100644 index 00000000000..7f209e0bc76 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/jvmTest/testHelper.kt @@ -0,0 +1,2 @@ +// testHelper: NOT to be implemented +// TEST \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/withTestDummy/jvmTest/testHelper.kt.after b/idea/testData/multiModuleQuickFix/withTestDummy/jvmTest/testHelper.kt.after new file mode 100644 index 00000000000..7f209e0bc76 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/withTestDummy/jvmTest/testHelper.kt.after @@ -0,0 +1,2 @@ +// testHelper: NOT to be implemented +// TEST \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt index 674e6e825c6..8a60f582a87 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt @@ -169,11 +169,30 @@ class QuickFixMultiModuleTest : AbstractQuickFixMultiModuleTest() { doMultiPlatformTest() } + @Test + fun testWithFakeJvm() { + val commonModule = module("header") + commonModule.createFacet(TargetPlatformKind.Common, false) + val jvmKind = TargetPlatformKind.Jvm[JvmTarget.JVM_1_6] + arrayOf("fake_jvm" to jvmKind, "jvm" to jvmKind).forEach { (implName, implKind) -> + val implModule = module(implName) + implModule.createFacet(implKind, implementedModuleName = "header".takeIf { implName == "jvm" }) + implModule.enableMultiPlatform() + implModule.addDependency(commonModule) + } + doQuickFixTest() + } + @Test fun testWithTest() { doMultiPlatformTest(expectName = "common", withTests = true) } + @Test + fun testWithTestDummy() { + doMultiPlatformTest(expectName = "common", withTests = true) + } + @Test fun testMemberFunToExtensionByHeader() = doTestHeaderWithJvmAndJs()