diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt index 6909fa61d92..aa4ad7788c9 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.gradle.KotlinModule import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.gradle.KotlinSourceSet import org.jetbrains.kotlin.idea.facet.* +import org.jetbrains.kotlin.idea.framework.KotlinSdkType import org.jetbrains.kotlin.idea.inspections.gradle.findAll import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling @@ -43,6 +44,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService @@ -66,6 +69,9 @@ class KotlinSourceSetDataService : AbstractProjectDataService = ProjectJdkTable.getInstance().allJdks + + fun getKotlinSdks() = ProjectJdkTable.getInstance().allJdks.filter { it.sdkType is KotlinSdkType } + + private fun getCreatedKotlinSdks() = + ProjectJdkTable.getInstance().allJdks.filter { !sdksBefore.contains(it) && it.sdkType is KotlinSdkType } + + fun isKotlinSdkCreated() = getCreatedKotlinSdks().isNotEmpty() + + fun removeNewKotlinSdk() { + val jdkTable = ProjectJdkTable.getInstance() + ApplicationManager.getApplication().invokeAndWait { + runWriteAction { + getCreatedKotlinSdks().forEach { jdkTable.removeJdk(it) } + } + } + } +} \ No newline at end of file diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt index 043a81fd9db..63062ab81db 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt @@ -11,17 +11,36 @@ import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.KotlinResourceRootType import org.jetbrains.kotlin.config.KotlinSourceRootType +import org.jetbrains.kotlin.idea.codeInsight.gradle.ExternalSystemImportingTestCase import org.jetbrains.kotlin.idea.codeInsight.gradle.GradleImportingTestCase import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind import org.jetbrains.kotlin.test.KotlinTestUtils +import org.junit.After +import org.junit.Before import org.junit.Test import org.junit.runners.Parameterized class NewMultiplatformProjectImportingTest : GradleImportingTestCase() { private val kotlinVersion = "1.3.0-rc-146" + @Before + fun saveSdksBeforeTest() { + val kotlinSdks = sdkCreationChecker?.getKotlinSdks() ?: emptyList() + if (kotlinSdks.isNotEmpty()) { + ExternalSystemImportingTestCase.fail("Found Kotlin SDK before importing test. Sdk list: $kotlinSdks") + } + } + + @After + fun checkSdkCreated() { + if (sdkCreationChecker?.isKotlinSdkCreated() == false) { + ExternalSystemImportingTestCase.fail("Kotlin SDK was not created during import of MPP Project.") + } + } + + @Test fun testProjectDependency() { configureByFiles() diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleImportingTestCase.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleImportingTestCase.kt index e3cad2d92a6..4be3d13a29e 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleImportingTestCase.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleImportingTestCase.kt @@ -43,6 +43,7 @@ import org.gradle.util.GradleVersion import org.gradle.wrapper.GradleWrapperMain import org.intellij.lang.annotations.Language import org.jetbrains.annotations.NonNls +import org.jetbrains.kotlin.gradle.KotlinSdkCreationChecker import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.plugins.gradle.settings.DistributionType @@ -65,6 +66,8 @@ import java.util.* @RunWith(value = Parameterized::class) abstract class GradleImportingTestCase : ExternalSystemImportingTestCase() { + protected var sdkCreationChecker : KotlinSdkCreationChecker? = null + @JvmField @Rule var name = TestName() @@ -101,6 +104,7 @@ abstract class GradleImportingTestCase : ExternalSystemImportingTestCase() { GradleSettings.getInstance(myProject).gradleVmOptions = "-Xmx128m -XX:MaxPermSize=64m" System.setProperty(ExternalSystemExecutionSettings.REMOTE_PROCESS_IDLE_TTL_IN_MS_KEY, GRADLE_DAEMON_TTL_MS.toString()) configureWrapper() + sdkCreationChecker = KotlinSdkCreationChecker() } override fun tearDown() { @@ -114,6 +118,7 @@ abstract class GradleImportingTestCase : ExternalSystemImportingTestCase() { Messages.setTestDialog(TestDialog.DEFAULT) FileUtil.delete(BuildManager.getInstance().buildSystemDirectory.toFile()) + sdkCreationChecker?.removeNewKotlinSdk() } finally { super.tearDown() } diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index fc728f17802..94583e6ed9f 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -831,6 +831,8 @@ + + diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/CreateKotlinSdkActivity.kt b/idea/src/org/jetbrains/kotlin/idea/framework/CreateKotlinSdkActivity.kt new file mode 100644 index 00000000000..ef761ccb6e4 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/framework/CreateKotlinSdkActivity.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.framework + +import com.intellij.openapi.project.Project +import com.intellij.openapi.startup.StartupActivity +import org.jetbrains.kotlin.idea.project.platform +import org.jetbrains.kotlin.idea.util.projectStructure.allModules +import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind +import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind + +/** + * This StartupActivity creates KotlinSdk for projects containing JS or Common modules. + * This activity is work-around required until the issue IDEA-203655 is fixed. The major case is to create + * Kotlin SDK when the KotlinSourceRootType is created + */ +class CreateKotlinSdkActivity : StartupActivity { + + override fun runActivity(project: Project) { + val kotlinSdkIsRequired = project.allModules().any { + it.platform is JsIdePlatformKind.Platform || it.platform is CommonIdePlatformKind.Platform + } + if (kotlinSdkIsRequired) { + KotlinSdkType.setUpIfNeeded() + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt index becddbb71a2..ab22ff6d686 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.impl.ApplicationImpl -import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.config.LanguageVersion @@ -27,9 +26,7 @@ import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgu import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.junit.Assert -import java.io.File import java.io.IOException -import java.nio.file.Path open class ConfigureKotlinInTempDirTest : AbstractConfigureKotlinInTempDirTest() { @Throws(IOException::class) @@ -123,9 +120,4 @@ open class ConfigureKotlinInTempDirTest : AbstractConfigureKotlinInTempDirTest() application.saveAll() Assert.assertTrue(project.baseDir.findFileByRelativePath(".idea/kotlinc.xml") == null) } - - //todo[Sedunov]: wait for fix in platform to avoid misunderstood from Java newbies (also PluginStartupComponent) - /*fun testKotlinSdkAdded() { - Assert.assertTrue(ProjectJdkTable.getInstance().allJdks.any { it.sdkType is KotlinSdkType }) - }*/ }