Set default jvmTarget when configuring Kotlin with default configurator

This commit is contained in:
Dmitry Jemerov
2017-04-19 17:49:10 +02:00
parent 98903d4e39
commit 794a21aa9c
5 changed files with 52 additions and 2 deletions
@@ -17,12 +17,21 @@
package org.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl
import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.JavaSdk
import com.intellij.openapi.projectRoots.JavaSdkVersion
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.libraries.Library
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
import org.jetbrains.kotlin.idea.facet.initializeIfNeeded
import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription
import org.jetbrains.kotlin.idea.util.projectStructure.allModules
import org.jetbrains.kotlin.idea.util.projectStructure.sdk
import org.jetbrains.kotlin.idea.versions.LibraryJarDescriptor
import org.jetbrains.kotlin.idea.versions.isKotlinJavaRuntime
import org.jetbrains.kotlin.resolve.TargetPlatform
@@ -74,6 +83,30 @@ open class KotlinJavaModuleConfigurator internal constructor() : KotlinWithLibra
override val libraryMatcher: (Library) -> Boolean
get() = ::isKotlinJavaRuntime
override fun configureKotlinSettings(modules: List<Module>) {
val project = modules.firstOrNull()?.project ?: return
val canChangeProjectSettings = project.allModules().all {
it.sdk?.let { JavaSdk.getInstance().getVersion(it)?.isAtLeast(JavaSdkVersion.JDK_1_8) } ?: true
}
if (canChangeProjectSettings) {
Kotlin2JvmCompilerArgumentsHolder.getInstance(project).update {
jvmTarget = "1.8"
}
}
else {
for (module in modules) {
val hasJdk8 = module.sdk?.let { JavaSdk.getInstance().getVersion(it)?.isAtLeast(JavaSdkVersion.JDK_1_8) }
if (hasJdk8 == true) {
val modelsProvider = IdeModifiableModelsProviderImpl(project)
val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false, commitModel = true)
val facetSettings = facet.configuration.settings
facetSettings.initializeIfNeeded(module, null, TargetPlatformKind.Jvm(JvmTarget.JVM_1_8))
(facetSettings.compilerArguments as? K2JVMCompilerArguments)?.jvmTarget = "1.8"
}
}
}
}
companion object {
val NAME = "java"
@@ -98,6 +98,8 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj
configureModuleWithLibrary(module, defaultPathToJar, copyLibraryIntoPath, collector)
}
configureKotlinSettings(modulesToConfigure)
collector.showNotification()
}
@@ -285,6 +287,9 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj
abstract fun getLibraryJarDescriptors(sdk: Sdk?): List<LibraryJarDescriptor>
protected open fun configureKotlinSettings(modules: List<Module>) {
}
companion object {
val DEFAULT_LIBRARY_DIR = "lib"
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumen
import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.idea.versions.*
import java.lang.reflect.Field
@@ -108,13 +109,20 @@ val mavenLibraryIdToPlatform: Map<String, TargetPlatformKind<*>> by lazy {
.toMap()
}
fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, useProjectSettings: Boolean): KotlinFacet {
fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider,
useProjectSettings: Boolean,
commitModel: Boolean = false): KotlinFacet {
val facetModel = modelsProvider.getModifiableFacetModel(this)
val facet = facetModel.findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName)
?: with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) }
.apply { facetModel.addFacet(this) }
facet.configuration.settings.useProjectSettings = useProjectSettings
if (commitModel) {
runWriteAction {
facetModel.commit()
}
}
return facet
}
@@ -19,6 +19,8 @@ package org.jetbrains.kotlin.idea.util.projectStructure
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.OrderEnumerator
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.libraries.Library
@@ -29,6 +31,8 @@ fun Project.allModules() = ModuleManager.getInstance(this).modules.toList()
fun Module.findLibrary(predicate: (Library) -> Boolean): Library? = OrderEnumerator.orderEntries(this).findLibrary(predicate)
val Module.sdk: Sdk? get() = ModuleRootManager.getInstance(this).sdk
fun OrderEnumerator.findLibrary(predicate: (Library) -> Boolean): Library? {
var lib: Library? = null
forEachLibrary { library ->
@@ -233,7 +233,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
private void configureFacetAndCheckJvm(JvmTarget jvmTarget) {
IdeModifiableModelsProviderImpl modelsProvider = new IdeModifiableModelsProviderImpl(getProject());
try {
KotlinFacet facet = FacetUtilsKt.getOrCreateFacet(getModule(), modelsProvider, false);
KotlinFacet facet = FacetUtilsKt.getOrCreateFacet(getModule(), modelsProvider, false, false);
TargetPlatformKind.Jvm platformKind = TargetPlatformKind.Jvm.Companion.get(jvmTarget);
FacetUtilsKt.configureFacet(
facet,