Create Kotlin SDK on load or import project with JS/Common modules

#KT-22590 Fixed
This commit is contained in:
Andrey Uskov
2018-12-26 19:26:48 +03:00
parent a9df9b22e9
commit a9be8aac5a
8 changed files with 108 additions and 8 deletions
@@ -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<GradleSourceSetDat
project: Project,
modelsProvider: IdeModifiableModelsProvider
) {
var hasKotlinSourceRootTypes = false
for (nodeToImport in toImport) {
val mainModuleData = ExternalSystemApiUtil.findParent(
nodeToImport,
@@ -56,6 +58,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
if (platform != KotlinPlatform.JVM && platform != KotlinPlatform.ANDROID) {
migrateNonJvmSourceFolders(rootModel)
hasKotlinSourceRootTypes = true
}
configureFacet(sourceSetData, kotlinSourceSet, mainModuleData, ideModule, modelsProvider)?.let { facet ->
@@ -66,6 +69,9 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
assignTestScope(rootModel)
}
}
if (hasKotlinSourceRootTypes) {
KotlinSdkType.setUpIfNeeded()
}
}
private fun assignTestScope(rootModel: ModifiableRootModel) {
@@ -14,6 +14,19 @@ import org.jetbrains.kotlin.konan.target.HostManager
import org.junit.Test
class GradleMultiplatformWizardTest : AbstractGradleMultiplatformWizardTest() {
lateinit var sdkCreationChecker: KotlinSdkCreationChecker
override fun setUp() {
super.setUp()
sdkCreationChecker = KotlinSdkCreationChecker()
}
override fun tearDown() {
sdkCreationChecker.removeNewKotlinSdk()
super.tearDown()
}
@Test
fun testMobile() {
// TODO: add import & tests here when we will be able to locate Android SDK automatically (see KT-27635)
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2019 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.gradle
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.projectRoots.Sdk
import org.jetbrains.kotlin.idea.framework.KotlinSdkType
class KotlinSdkCreationChecker {
private val sdksBefore: Array<out Sdk> = 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) }
}
}
}
}
@@ -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()
@@ -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()
}
@@ -831,6 +831,8 @@
<sdkType implementation="org.jetbrains.kotlin.idea.framework.KotlinSdkType"/>
<postStartupActivity implementation="org.jetbrains.kotlin.idea.framework.CreateKotlinSdkActivity"/>
<moduleConfigurationEditorProvider implementation="org.jetbrains.kotlin.idea.roots.ui.NonJvmKotlinModuleEditorsProvider"/>
<projectStructure.sourceRootEditHandler implementation="org.jetbrains.kotlin.idea.roots.ui.KotlinModuleSourceRootEditHandler$Source"/>
@@ -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()
}
}
}
@@ -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 })
}*/
}