diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/argumentUtils.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/argumentUtils.kt index 6b239043c73..1fed1f9d01e 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/argumentUtils.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/argumentUtils.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.cli.common.arguments +import com.intellij.util.text.VersionComparatorUtil import java.util.* import kotlin.reflect.KClass import kotlin.reflect.KMutableProperty1 @@ -98,4 +99,10 @@ fun collectProperties(kClass: KClass, inheritedOnly: Boolean): List return properties.filter { it.visibility == KVisibility.PUBLIC && it.findAnnotation() == null } +} + +fun CommonCompilerArguments.setApiVersionToLanguageVersionIfNeeded() { + if (languageVersion != null && VersionComparatorUtil.compare(languageVersion, apiVersion) < 0) { + apiVersion = languageVersion + } } \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt index 0b236521921..c63afd13ef4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project import com.intellij.util.text.VersionComparatorUtil import org.jdom.Element import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.setApiVersionToLanguageVersionIfNeeded import org.jetbrains.kotlin.config.SettingConstants.KOTLIN_COMMON_COMPILER_ARGUMENTS_SECTION import org.jetbrains.kotlin.config.detectVersionAutoAdvance import org.jetbrains.kotlin.config.dropVersionsIfNecessary @@ -41,10 +42,7 @@ class KotlinCommonCompilerArgumentsHolder(project: Project) : BaseKotlinCompiler update { // To fix earlier configurations with incorrect combination of language and API version - if (VersionComparatorUtil.compare(languageVersion, apiVersion) < 0) { - apiVersion = languageVersion - } - + setApiVersionToLanguageVersionIfNeeded() detectVersionAutoAdvance() } } diff --git a/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/kotlinc.xml b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/kotlinc.xml new file mode 100644 index 00000000000..c3f9fd130b7 --- /dev/null +++ b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/kotlinc.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/libraries/KotlinJavaRuntime.xml b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 00000000000..891d2a9bb89 --- /dev/null +++ b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/misc.xml b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/misc.xml new file mode 100644 index 00000000000..05483570e04 --- /dev/null +++ b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/modules.xml b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/modules.xml new file mode 100644 index 00000000000..51f02ad9d82 --- /dev/null +++ b/idea/testData/configuration/apiVersionWithoutLanguageVersion/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/apiVersionWithoutLanguageVersion/module.iml b/idea/testData/configuration/apiVersionWithoutLanguageVersion/module.iml new file mode 100644 index 00000000000..c7649d2d5da --- /dev/null +++ b/idea/testData/configuration/apiVersionWithoutLanguageVersion/module.iml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt index 5aa77c185b2..b8a7c298b4d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.impl.ApplicationImpl import com.intellij.openapi.util.io.FileUtil +import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder @@ -121,4 +122,10 @@ class ConfigureKotlinInTempDirTest : AbstractConfigureKotlinTest() { val moduleFileContentAfter = String(module.moduleFile!!.contentsToByteArray()) Assert.assertEquals(moduleFileContentBefore, moduleFileContentAfter) } + + fun testApiVersionWithoutLanguageVersion() { + KotlinCommonCompilerArgumentsHolder.getInstance(myProject) + val settings = myProject.getLanguageVersionSettings() + Assert.assertEquals(ApiVersion.KOTLIN_1_1, settings.apiVersion) + } } diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index 238f0029c11..7ada9571307 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -638,6 +638,19 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { assertFilesNotExistInOutput(myProject.modules.get(0), "_DefaultPackage.class") } + fun testDefaultLanguageVersionCustomApiVersion() { + initProject(JVM_FULL_RUNTIME) + buildAllModules().assertFailed() + + assertEquals(1, myProject.modules.size) + val module = myProject.modules.first() + val args = JpsKotlinCompilerSettings.getCommonCompilerArguments(module) + args.apiVersion = "1.2" + JpsKotlinCompilerSettings.setCommonCompilerArguments(myProject, args) + + buildAllModules().assertSuccessful() + } + fun testKotlinJavaProject() { doTestWithRuntime() } diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/model/KotlinCommonCompilerArgumentsSerializer.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/model/KotlinCommonCompilerArgumentsSerializer.kt index 230fb208610..078f7513375 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/model/KotlinCommonCompilerArgumentsSerializer.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/model/KotlinCommonCompilerArgumentsSerializer.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.jps.model import com.intellij.util.text.VersionComparatorUtil import org.jetbrains.jps.model.JpsProject import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.setApiVersionToLanguageVersionIfNeeded import org.jetbrains.kotlin.config.SettingConstants.KOTLIN_COMMON_COMPILER_ARGUMENTS_SECTION import org.jetbrains.kotlin.jps.JpsKotlinCompilerSettings @@ -26,9 +27,7 @@ internal class KotlinCommonCompilerArgumentsSerializer : BaseJpsCompilerSettings KOTLIN_COMMON_COMPILER_ARGUMENTS_SECTION, CommonCompilerArguments::DummyImpl ) { override fun onLoad(project: JpsProject, settings: CommonCompilerArguments.DummyImpl) { - if (VersionComparatorUtil.compare(settings.languageVersion, settings.apiVersion) < 0) { - settings.apiVersion = settings.languageVersion - } + settings.setApiVersionToLanguageVersionIfNeeded() JpsKotlinCompilerSettings.setCommonCompilerArguments(project, settings) } } diff --git a/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/kotlinProject.iml b/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/kotlinProject.iml new file mode 100644 index 00000000000..d04ecd6e02e --- /dev/null +++ b/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/kotlinProject.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/kotlinProject.ipr b/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/kotlinProject.ipr new file mode 100644 index 00000000000..001ea3380cd --- /dev/null +++ b/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/kotlinProject.ipr @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/src/main.kt b/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/src/main.kt new file mode 100644 index 00000000000..bf1bc16df8e --- /dev/null +++ b/jps-plugin/testData/general/DefaultLanguageVersionCustomApiVersion/src/main.kt @@ -0,0 +1,5 @@ +package test + +fun main(args: Array) { + arrayListOf(1, 2, 3).fill(0) +} \ No newline at end of file