diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.kt index 1f1061f7663..9c29e30a5ee 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleModuleConfigurator.kt @@ -16,6 +16,8 @@ package org.jetbrains.kotlin.idea.configuration +import com.intellij.openapi.projectRoots.Sdk +import org.jetbrains.kotlin.idea.versions.getDefaultJvmTarget import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform @@ -33,6 +35,8 @@ class KotlinGradleModuleConfigurator internal constructor() : KotlinWithGradleCo override val applyPluginDirective: String get() = APPLY_KOTLIN + override fun getJvmTarget(sdk: Sdk?, version: String) = getDefaultJvmTarget(sdk, version)?.description + companion object { val NAME = "gradle" diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt index 73961aade6b..5ee72df88cb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt @@ -135,40 +135,44 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { } protected fun addElementsToModuleFile(file: GroovyFile, version: String): Boolean { - var wasModified = false + val oldText = file.text if (!containsDirective(file.text, applyPluginDirective)) { val apply = GroovyPsiElementFactory.getInstance(file.project).createExpressionFromText(applyPluginDirective) val applyStatement = getApplyStatement(file) if (applyStatement != null) { file.addAfter(apply, applyStatement) - wasModified = true } else { val buildScript = getBlockByName(file, "buildscript") if (buildScript != null) { file.addAfter(apply, buildScript.parent) - wasModified = true } else { file.addAfter(apply, file.statements.lastOrNull() ?: file.firstChild) - wasModified = true } } } val repositoriesBlock = getRepositoriesBlock(file) - wasModified = wasModified or addRepository(repositoriesBlock, version) + addRepository(repositoriesBlock, version) val dependenciesBlock = getDependenciesBlock(file) val sdk = ModuleUtil.findModuleForPsiElement(file)?.let { ModuleRootManager.getInstance(it).sdk } - wasModified = wasModified or addExpressionInBlockIfNeeded(getDependencyDirective(sdk, version), dependenciesBlock, false) + addExpressionInBlockIfNeeded(getDependencyDirective(sdk, version), dependenciesBlock, false) + val jvmTarget = getJvmTarget(sdk, version) + if (jvmTarget != null) { + changeKotlinTaskParameter(file, "jvmTarget", jvmTarget, forTests = false) + changeKotlinTaskParameter(file, "jvmTarget", jvmTarget, forTests = true) + } - return wasModified + return file.text != oldText } protected open fun getDependencyDirective(sdk: Sdk?, version: String) = getRuntimeLibrary(sdk, version) + protected open fun getJvmTarget(sdk: Sdk?, version: String): String? = null + protected abstract val applyPluginDirective: String protected open fun addElementsToFile( @@ -299,26 +303,26 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { } fun changeLanguageVersion(gradleFile: GroovyFile, languageVersion: String, forTests: Boolean): PsiElement? { - return changeVersion(gradleFile, languageVersion, forTests, "languageVersion") + return changeKotlinTaskParameter(gradleFile, "languageVersion", languageVersion, forTests) } fun changeApiVersion(gradleFile: GroovyFile, apiVersion: String, forTests: Boolean): PsiElement? { - return changeVersion(gradleFile, apiVersion, forTests, "apiVersion") + return changeKotlinTaskParameter(gradleFile, "apiVersion", apiVersion, forTests) } - private fun changeVersion(gradleFile: GroovyFile, version: String, forTests: Boolean, versionParameter: String): PsiElement? { - val snippet = "$versionParameter = \"$version\"" + private fun changeKotlinTaskParameter(gradleFile: GroovyFile, parameterName: String, parameterValue: String, forTests: Boolean): PsiElement? { + val snippet = "$parameterName = \"$parameterValue\"" val kotlinBlock = getBlockOrCreate(gradleFile, if (forTests) "compileTestKotlin" else "compileKotlin") for (stmt in kotlinBlock.statements) { - if ((stmt as? GrAssignmentExpression)?.lValue?.text == "kotlinOptions." + versionParameter) { + if ((stmt as? GrAssignmentExpression)?.lValue?.text == "kotlinOptions." + parameterName) { return stmt.replaceWithStatementFromText("kotlinOptions." + snippet) } } val kotlinOptionsBlock = getBlockOrCreate(kotlinBlock, "kotlinOptions") addOrReplaceExpression(kotlinOptionsBlock, snippet) { stmt -> - (stmt as? GrAssignmentExpression)?.lValue?.text == versionParameter + (stmt as? GrAssignmentExpression)?.lValue?.text == parameterName } return kotlinBlock.parent } diff --git a/idea/testData/configuration/gradle/default_after.gradle b/idea/testData/configuration/gradle/default_after.gradle index 26248b945ed..f6416aa6139 100644 --- a/idea/testData/configuration/gradle/default_after.gradle +++ b/idea/testData/configuration/gradle/default_after.gradle @@ -21,3 +21,13 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} \ No newline at end of file diff --git a/idea/testData/configuration/gradle/missedLibrary_after.gradle b/idea/testData/configuration/gradle/missedLibrary_after.gradle index b5056e6062e..34164d8efda 100644 --- a/idea/testData/configuration/gradle/missedLibrary_after.gradle +++ b/idea/testData/configuration/gradle/missedLibrary_after.gradle @@ -23,4 +23,14 @@ sourceSets { } repositories { mavenCentral() -} \ No newline at end of file +} +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} diff --git a/idea/testData/configuration/gradle/plugin_present_after.gradle b/idea/testData/configuration/gradle/plugin_present_after.gradle index 08c943f5447..83591579c77 100644 --- a/idea/testData/configuration/gradle/plugin_present_after.gradle +++ b/idea/testData/configuration/gradle/plugin_present_after.gradle @@ -24,3 +24,13 @@ sourceSets { repositories { mavenCentral() } +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +}