From c7a5a7ebd50931528fbce60882e48aab3a70c2fc Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 21 Aug 2018 18:10:52 +0300 Subject: [PATCH] Gradle: Use common language/api version (if any) of all modules for project #KT-26290 Fixed --- .../KotlinGradleSourceSetDataService.kt | 31 +++ .../gradle/GradleFacetImportTest.kt | 217 ++++++++++++++++++ .../gradle/GradleFacetImportTest.kt.as31 | 217 ++++++++++++++++++ .../gradle/GradleFacetImportTest.kt.as32 | 217 ++++++++++++++++++ idea/src/META-INF/gradle-java.xml | 1 + idea/src/META-INF/gradle-java.xml.as33c4 | 1 + idea/src/META-INF/gradle.xml.181 | 1 + 7 files changed, 685 insertions(+) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt index 0dc64ee6ac5..c9c8be5f629 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor import org.jetbrains.kotlin.gradle.ArgsInfo import org.jetbrains.kotlin.gradle.CompilerArgumentsBySourceSet +import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder import org.jetbrains.kotlin.idea.facet.* import org.jetbrains.kotlin.idea.framework.CommonLibraryKind import org.jetbrains.kotlin.idea.framework.JSLibraryKind @@ -74,6 +75,36 @@ interface GradleProjectImportHandler { fun importByModule(facet: KotlinFacet, moduleNode: DataNode) } +class KotlinGradleProjectSettingsDataService : AbstractProjectDataService() { + override fun getTargetDataKey() = ProjectKeys.PROJECT + + override fun postProcess( + toImport: MutableCollection>, + projectData: ProjectData?, + project: Project, + modelsProvider: IdeModifiableModelsProvider + ) { + val allSettings = modelsProvider.modules.mapNotNull { + val settings = modelsProvider + .getModifiableFacetModel(it) + .findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName) + ?.configuration + ?.settings ?: return@mapNotNull null + if (settings.useProjectSettings) null else settings + } + val languageVersion = allSettings.asSequence().mapNotNullTo(LinkedHashSet()) { it.languageLevel }.singleOrNull() + val apiVersion = allSettings.asSequence().mapNotNullTo(LinkedHashSet()) { it.apiLevel}.singleOrNull() + KotlinCommonCompilerArgumentsHolder.getInstance(project).update { + if (languageVersion != null) { + this.languageVersion = languageVersion.versionString + } + if (apiVersion != null) { + this.apiVersion = apiVersion.versionString + } + } + } +} + class KotlinGradleSourceSetDataService : AbstractProjectDataService() { override fun getTargetDataKey() = GradleSourceSetData.KEY diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt index fc94a2f2e96..b76bfe5fe54 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt @@ -25,6 +25,7 @@ import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.impl.libraries.LibraryEx +import junit.framework.TestCase import org.jetbrains.jps.model.java.JavaResourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType @@ -2273,6 +2274,222 @@ compileTestKotlin { assertAllModulesConfigured() } + @Test + fun testSharedLanguageVersion() { + createProjectSubFile( + "build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-common' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.2.60" + } + + """.trimIndent() + ) + createProjectSubFile( + "settings.gradle", + """ + rootProject.name = 'MultiTest' + include 'MultiTest-jvm', 'MultiTest-js' + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-js/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-js' + + sourceSets { + myMain { + kotlin { + srcDir 'src' + } + } + myTest { + kotlin { + srcDir 'test' + } + } + } + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-jvm/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-jvm' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + + val holder = KotlinCommonCompilerArgumentsHolder.getInstance(myProject) + + holder.update { languageVersion = "1.1" } + + importProject() + + TestCase.assertEquals("1.2", holder.settings.languageVersion) + } + + @Test + fun testNonSharedLanguageVersion() { + createProjectSubFile( + "build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-common' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.2.60" + } + + compileKotlinCommon { + kotlinOptions.languageVersion = "1.1" + } + + """.trimIndent() + ) + createProjectSubFile( + "settings.gradle", + """ + rootProject.name = 'MultiTest' + include 'MultiTest-jvm', 'MultiTest-js' + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-js/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-js' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-jvm/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-jvm' + + sourceSets { + myMain { + kotlin { + srcDir 'src' + } + } + myTest { + kotlin { + srcDir 'test' + } + } + } + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + + val holder = KotlinCommonCompilerArgumentsHolder.getInstance(myProject) + + holder.update { languageVersion = "1.1" } + + importProject() + + TestCase.assertEquals("1.1", holder.settings.languageVersion) + } + private fun checkStableModuleName(projectName: String, expectedName: String, platform: TargetPlatform, isProduction: Boolean) { val module = getModule(projectName) val moduleInfo = if (isProduction) module.productionSourceInfo() else module.testSourceInfo() diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as31 b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as31 index 50944706c13..022cebdf609 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as31 +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as31 @@ -25,6 +25,7 @@ import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.impl.libraries.LibraryEx +import junit.framework.TestCase import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments @@ -2022,6 +2023,222 @@ compileTestKotlin { assertAllModulesConfigured() } + @Test + fun testSharedLanguageVersion() { + createProjectSubFile( + "build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-common' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.2.60" + } + + """.trimIndent() + ) + createProjectSubFile( + "settings.gradle", + """ + rootProject.name = 'MultiTest' + include 'MultiTest-jvm', 'MultiTest-js' + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-js/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-js' + + sourceSets { + myMain { + kotlin { + srcDir 'src' + } + } + myTest { + kotlin { + srcDir 'test' + } + } + } + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-jvm/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-jvm' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + + val holder = KotlinCommonCompilerArgumentsHolder.getInstance(myProject) + + holder.update { languageVersion = "1.1" } + + importProject() + + TestCase.assertEquals("1.2", holder.settings.languageVersion) + } + + @Test + fun testNonSharedLanguageVersion() { + createProjectSubFile( + "build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-common' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.2.60" + } + + compileKotlinCommon { + kotlinOptions.languageVersion = "1.1" + } + + """.trimIndent() + ) + createProjectSubFile( + "settings.gradle", + """ + rootProject.name = 'MultiTest' + include 'MultiTest-jvm', 'MultiTest-js' + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-js/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-js' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-jvm/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-jvm' + + sourceSets { + myMain { + kotlin { + srcDir 'src' + } + } + myTest { + kotlin { + srcDir 'test' + } + } + } + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + + val holder = KotlinCommonCompilerArgumentsHolder.getInstance(myProject) + + holder.update { languageVersion = "1.1" } + + importProject() + + TestCase.assertEquals("1.1", holder.settings.languageVersion) + } + private fun checkStableModuleName(projectName: String, expectedName: String, platform: TargetPlatform, isProduction: Boolean) { val module = getModule(projectName) val moduleInfo = if (isProduction) module.productionSourceInfo() else module.testSourceInfo() diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as32 b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as32 index 50944706c13..022cebdf609 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as32 +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt.as32 @@ -25,6 +25,7 @@ import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.impl.libraries.LibraryEx +import junit.framework.TestCase import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments @@ -2022,6 +2023,222 @@ compileTestKotlin { assertAllModulesConfigured() } + @Test + fun testSharedLanguageVersion() { + createProjectSubFile( + "build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-common' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.2.60" + } + + """.trimIndent() + ) + createProjectSubFile( + "settings.gradle", + """ + rootProject.name = 'MultiTest' + include 'MultiTest-jvm', 'MultiTest-js' + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-js/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-js' + + sourceSets { + myMain { + kotlin { + srcDir 'src' + } + } + myTest { + kotlin { + srcDir 'test' + } + } + } + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-jvm/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-jvm' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + + val holder = KotlinCommonCompilerArgumentsHolder.getInstance(myProject) + + holder.update { languageVersion = "1.1" } + + importProject() + + TestCase.assertEquals("1.2", holder.settings.languageVersion) + } + + @Test + fun testNonSharedLanguageVersion() { + createProjectSubFile( + "build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-common' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-common:1.2.60" + } + + compileKotlinCommon { + kotlinOptions.languageVersion = "1.1" + } + + """.trimIndent() + ) + createProjectSubFile( + "settings.gradle", + """ + rootProject.name = 'MultiTest' + include 'MultiTest-jvm', 'MultiTest-js' + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-js/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-js' + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + createProjectSubFile( + "MultiTest-jvm/build.gradle", + """ + buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.60") + } + } + + apply plugin: 'kotlin-platform-jvm' + + sourceSets { + myMain { + kotlin { + srcDir 'src' + } + } + myTest { + kotlin { + srcDir 'test' + } + } + } + + repositories { + mavenCentral() + } + + dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.60" + implement project(":") + } + + """.trimIndent() + ) + + val holder = KotlinCommonCompilerArgumentsHolder.getInstance(myProject) + + holder.update { languageVersion = "1.1" } + + importProject() + + TestCase.assertEquals("1.1", holder.settings.languageVersion) + } + private fun checkStableModuleName(projectName: String, expectedName: String, platform: TargetPlatform, isProduction: Boolean) { val module = getModule(projectName) val moduleInfo = if (isProduction) module.productionSourceInfo() else module.testSourceInfo() diff --git a/idea/src/META-INF/gradle-java.xml b/idea/src/META-INF/gradle-java.xml index 8e52e90bb2a..b3fa7c0165b 100644 --- a/idea/src/META-INF/gradle-java.xml +++ b/idea/src/META-INF/gradle-java.xml @@ -22,6 +22,7 @@ + + +