Create Kotlin SDK on load or import project with JS/Common modules
#KT-22590 Fixed
This commit is contained in:
+6
@@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -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()
|
||||
|
||||
+5
@@ -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 })
|
||||
}*/
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user