From 794a21aa9c88a9048a86c276c122b68a2869bdc9 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 19 Apr 2017 17:49:10 +0200 Subject: [PATCH] Set default jvmTarget when configuring Kotlin with default configurator --- .../KotlinJavaModuleConfigurator.kt | 33 +++++++++++++++++++ .../KotlinWithLibraryConfigurator.kt | 5 +++ .../jetbrains/kotlin/idea/facet/facetUtils.kt | 10 +++++- .../kotlin/idea/util/projectStructureUtil.kt | 4 +++ .../configuration/ConfigureKotlinTest.java | 2 +- 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt index 168c14be3ef..e1affc0e8b5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt @@ -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) { + 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" diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt index 14ec0a54cfb..b78893e4e20 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt @@ -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 + protected open fun configureKotlinSettings(modules: List) { + } + companion object { val DEFAULT_LIBRARY_DIR = "lib" diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index 3c1da190afa..57e8e1cfba9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -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> 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 } diff --git a/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt b/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt index 72bd6b70738..e2f012cb7c5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt @@ -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 -> diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java index 3fa900f8107..2b6fd211629 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -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,