From 7eea8f3849a8df5d80668db0981f5567294122d8 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 26 Jan 2017 11:43:29 +0100 Subject: [PATCH] Configuring project with Gradle adds kotlin-stdlib-jre7 or kotlin-stdlib-jre8 if the selected JDK is of a high enough version --- ...radleKotlinJavaFrameworkSupportProvider.kt | 2 +- .../KotlinWithGradleConfigurator.kt | 20 +++++++++++++------ .../idea/versions/KotlinRuntimeLibraryUtil.kt | 15 ++++++++++++++ .../configuration/gradle/default_after.gradle | 2 +- .../gradle/eapVersion_after.gradle | 2 +- .../gradle/m04Version_after.gradle | 2 +- .../gradle/missedLibrary_after.gradle | 2 +- .../gradle/plugin_present_after.gradle | 2 +- .../gradle/rcVersion_after.gradle | 2 +- 9 files changed, 36 insertions(+), 13 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt index 3ca4c644cc4..2f1fbc32132 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinJavaFrameworkSupportProvider.kt @@ -73,7 +73,7 @@ class GradleKotlinJavaFrameworkSupportProvider : GradleFrameworkSupportProvider( .addRepositoriesDefinition("mavenCentral()") .addBuildscriptPropertyDefinition("ext.kotlin_version = '$kotlinVersion'") - .addDependencyNotation(KotlinWithGradleConfigurator.LIBRARY) + .addDependencyNotation(KotlinWithGradleConfigurator.getRuntimeLibrary(rootModel.sdk)) .addBuildscriptDependencyNotation(KotlinWithGradleConfigurator.CLASSPATH) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt index 4b7c4a15eb1..fd10a7f42f1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt @@ -19,7 +19,9 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.codeInsight.CodeInsightUtilCore import com.intellij.ide.actions.OpenFileAction import com.intellij.openapi.module.Module +import com.intellij.openapi.module.ModuleUtil import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ExternalLibraryDescriptor import com.intellij.openapi.roots.ModuleRootManager @@ -33,6 +35,7 @@ import org.jetbrains.kotlin.idea.KotlinPluginUtil import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion import org.jetbrains.kotlin.idea.util.application.executeCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand +import org.jetbrains.kotlin.idea.versions.getStdlibArtifactId import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType import org.jetbrains.plugins.gradle.util.GradleConstants import org.jetbrains.plugins.groovy.lang.psi.GroovyFile @@ -72,7 +75,9 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { private fun isFileConfigured(projectGradleFile: GroovyFile): Boolean { val fileText = projectGradleFile.text - return containsDirective(fileText, applyPluginDirective) && fileText.contains(LIBRARY) + return containsDirective(fileText, applyPluginDirective) && + fileText.contains("org.jetbrains.kotlin") && + fileText.contains("kotlin-stdlib") } @JvmSuppressWildcards @@ -140,7 +145,8 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { wasModified = wasModified or addRepository(repositoriesBlock, version) val dependenciesBlock = getDependenciesBlock(file) - wasModified = wasModified or addExpressionInBlockIfNeeded(LIBRARY, dependenciesBlock, false) + val sdk = ModuleUtil.findModuleForPsiElement(file)?.let { ModuleRootManager.getInstance(it).sdk } + wasModified = wasModified or addExpressionInBlockIfNeeded(getRuntimeLibrary(sdk), dependenciesBlock, false) return wasModified } @@ -187,8 +193,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { private val MAVEN_CENTRAL = "mavenCentral()\n" private val JCENTER = "jcenter()\n" - val LIBRARY = "compile \"org.jetbrains.kotlin:kotlin-stdlib:\$kotlin_version\"" - val SOURCE_SET = "main.java.srcDirs += 'src/main/kotlin'\n" + private val VERSION = String.format("ext.kotlin_version = '%s'", VERSION_TEMPLATE) private fun containsDirective(fileText: String, directive: String): Boolean { @@ -318,8 +323,6 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { return getBlockOrCreate(file, "dependencies") } - fun getSourceSetsBlock(parent: GrStatementOwner) = getBlockOrCreate(parent, "sourceSets") - private fun getBuildScriptBlock(file: GrStatementOwner) = getBlockOrCreate(file, "buildscript") private fun getBuildScriptDependenciesBlock(file: GrStatementOwner): GrClosableBlock { @@ -402,5 +405,10 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { } return addLastExpressionInBlockIfNeeded(snippet, repositoriesBlock) } + + fun getRuntimeLibrary(sdk: Sdk?): String { + val artifactId = getStdlibArtifactId(sdk) + return "compile \"org.jetbrains.kotlin:$artifactId:\$kotlin_version\"" + } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt index 0da63904cf3..efb7dad27fc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt @@ -22,6 +22,9 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleUtil import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.JavaSdk +import com.intellij.openapi.projectRoots.JavaSdkVersion +import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ProjectFileIndex @@ -287,6 +290,18 @@ fun getKotlinJsRuntimeMarkerClass(project: Project, scope: GlobalSearchScope): V } } +fun getStdlibArtifactId(sdk: Sdk?): String { + val sdkVersion = sdk?.let { JavaSdk.getInstance().getVersion(it) } + val artifactId = when (sdkVersion) { + JavaSdkVersion.JDK_1_8, JavaSdkVersion.JDK_1_9 -> MAVEN_STDLIB_ID_JRE8 + JavaSdkVersion.JDK_1_7 -> MAVEN_STDLIB_ID_JRE7 + else -> MAVEN_STDLIB_ID + } + return artifactId +} + val MAVEN_STDLIB_ID = "kotlin-stdlib" +val MAVEN_STDLIB_ID_JRE7 = "kotlin-stdlib-jre7" +val MAVEN_STDLIB_ID_JRE8 = "kotlin-stdlib-jre8" val MAVEN_JS_STDLIB_ID = "kotlin-js-library" val MAVEN_COMMON_STDLIB_ID = "kotlin-stdlib-common" // TODO: KotlinCommonMavenConfigurator diff --git a/idea/testData/configuration/gradle/default_after.gradle b/idea/testData/configuration/gradle/default_after.gradle index 2dfd8aa1edf..0f7e4279c27 100644 --- a/idea/testData/configuration/gradle/default_after.gradle +++ b/idea/testData/configuration/gradle/default_after.gradle @@ -10,7 +10,7 @@ repositories { dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } buildscript { ext.kotlin_version = '$VERSION$' diff --git a/idea/testData/configuration/gradle/eapVersion_after.gradle b/idea/testData/configuration/gradle/eapVersion_after.gradle index ab5ae03cf00..2bacca93060 100644 --- a/idea/testData/configuration/gradle/eapVersion_after.gradle +++ b/idea/testData/configuration/gradle/eapVersion_after.gradle @@ -13,7 +13,7 @@ repositories { dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } buildscript { ext.kotlin_version = '$VERSION$' diff --git a/idea/testData/configuration/gradle/m04Version_after.gradle b/idea/testData/configuration/gradle/m04Version_after.gradle index 91603b37ba5..cbf9cd93bc5 100644 --- a/idea/testData/configuration/gradle/m04Version_after.gradle +++ b/idea/testData/configuration/gradle/m04Version_after.gradle @@ -13,7 +13,7 @@ repositories { dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } buildscript { ext.kotlin_version = '$VERSION$' diff --git a/idea/testData/configuration/gradle/missedLibrary_after.gradle b/idea/testData/configuration/gradle/missedLibrary_after.gradle index 0fe7ca69264..27e2f50c459 100644 --- a/idea/testData/configuration/gradle/missedLibrary_after.gradle +++ b/idea/testData/configuration/gradle/missedLibrary_after.gradle @@ -6,7 +6,7 @@ version = '1.0' dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } buildscript { diff --git a/idea/testData/configuration/gradle/plugin_present_after.gradle b/idea/testData/configuration/gradle/plugin_present_after.gradle index e166c49802b..069f7efe6c6 100644 --- a/idea/testData/configuration/gradle/plugin_present_after.gradle +++ b/idea/testData/configuration/gradle/plugin_present_after.gradle @@ -6,7 +6,7 @@ version = '1.0' dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } buildscript { diff --git a/idea/testData/configuration/gradle/rcVersion_after.gradle b/idea/testData/configuration/gradle/rcVersion_after.gradle index ab5ae03cf00..2bacca93060 100644 --- a/idea/testData/configuration/gradle/rcVersion_after.gradle +++ b/idea/testData/configuration/gradle/rcVersion_after.gradle @@ -13,7 +13,7 @@ repositories { dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } buildscript { ext.kotlin_version = '$VERSION$'