From da332d1a27917e55d7491bf66763324773c72a4e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 15 Jun 2016 14:17:54 +0300 Subject: [PATCH] Validate "-jvm-target" value in CLI, improve message --- .../kotlin/codegen/state/GenerationState.kt | 3 +- .../arguments/K2JVMCompilerArguments.java | 4 +-- .../jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt | 13 +++++++-- .../kotlin/config/JVMConfigurationKeys.java | 4 +-- .../org/jetbrains/kotlin/config/JvmTarget.kt | 28 +++++++++++++++++++ compiler/testData/cli/jvm/help.out | 2 +- compiler/testData/cli/jvm/wrongArgument.out | 2 +- .../cli/jvm/wrongJvmTargetVersion.args | 5 ++++ .../cli/jvm/wrongJvmTargetVersion.out | 3 ++ .../kotlin/cli/CliTestGenerated.java | 6 ++++ .../internal/KotlinBytecodeToolWindow.java | 3 +- 11 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/config/JvmTarget.kt create mode 100644 compiler/testData/cli/jvm/wrongJvmTargetVersion.args create mode 100644 compiler/testData/cli/jvm/wrongJvmTargetVersion.out diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index c7140778b73..93f7e2cbe76 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.codegen.optimization.OptimizationClassBuilderFactory import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic @@ -155,7 +156,7 @@ class GenerationState @JvmOverloads constructor( val isInlineDisabled: Boolean = configuration.getBoolean(CommonConfigurationKeys.DISABLE_INLINE) val useTypeTableInSerializer: Boolean = configuration.getBoolean(JVMConfigurationKeys.USE_TYPE_TABLE) val inheritMultifileParts: Boolean = configuration.getBoolean(JVMConfigurationKeys.INHERIT_MULTIFILE_PARTS) - val isJvm8Target: Boolean = configuration.getBoolean(JVMConfigurationKeys.JVM_8_TARGET) + val isJvm8Target: Boolean = configuration.get(JVMConfigurationKeys.JVM_TARGET) == JvmTarget.JVM_1_8 val rootContext: CodegenContext<*> = RootContext(this) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java index 7a8dfb1c856..33f4408d196 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java @@ -51,8 +51,8 @@ public class K2JVMCompilerArguments extends CommonCompilerArguments { @Argument(value = "module-name", description = "Module name") public String moduleName; - @Argument(value = "jvm-target", description = "Compile code to specified JVM target: 1.6 or 1.8. Default one is 1.6.") - @ValueDescription("<1.6|1.8>") + @Argument(value = "jvm-target", description = "Target version of the generated JVM bytecode (1.6 or 1.8), default is 1.6") + @ValueDescription("") public String jvmTarget; // Advanced options diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt index efe3ad7074b..7635bc3a5e4 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -128,8 +128,17 @@ class K2JVMCompiler : CLICompiler() { if (friendPaths != null) { configuration.put(JVMConfigurationKeys.FRIEND_PATHS, friendPaths) } - if ("1.8".equals(arguments.jvmTarget)) { - configuration.put(JVMConfigurationKeys.JVM_8_TARGET, true) + + if (arguments.jvmTarget != null) { + val jvmTarget = JvmTarget.fromString(arguments.jvmTarget) + if (jvmTarget != null) { + configuration.put(JVMConfigurationKeys.JVM_TARGET, jvmTarget) + } + else { + val errorMessage = "Unknown JVM target version: ${arguments.jvmTarget}\n" + + "Supported versions: ${JvmTarget.values().joinToString { it.string }}" + messageCollector.report(CompilerMessageSeverity.ERROR, errorMessage, CompilerMessageLocation.NO_LOCATION) + } } putAdvancedOptions(configuration, arguments) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java index 8c688c55336..1b06b6d6331 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java @@ -57,8 +57,8 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey USE_TYPE_TABLE = CompilerConfigurationKey.create("use type table in serializer"); - public static final CompilerConfigurationKey JVM_8_TARGET = - CompilerConfigurationKey.create("compile to jvm 8"); + public static final CompilerConfigurationKey JVM_TARGET = + CompilerConfigurationKey.create("JVM bytecode target version"); public static final CompilerConfigurationKey INCREMENTAL_COMPILATION_COMPONENTS = CompilerConfigurationKey.create("incremental cache provider"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JvmTarget.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JvmTarget.kt new file mode 100644 index 00000000000..50965422035 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JvmTarget.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.config + +enum class JvmTarget(val string: String) { + JVM_1_6("1.6"), + JVM_1_8("1.8"), + ; + + companion object { + @JvmStatic + fun fromString(string: String) = values().find { it.string == string } + } +} diff --git a/compiler/testData/cli/jvm/help.out b/compiler/testData/cli/jvm/help.out index bf02da0247a..ef9b7d16c26 100644 --- a/compiler/testData/cli/jvm/help.out +++ b/compiler/testData/cli/jvm/help.out @@ -9,7 +9,7 @@ where possible options include: -script Evaluate the script file -kotlin-home Path to Kotlin compiler home directory, used for runtime libraries discovery -module-name Module name - -jvm-target <1.6|1.8> Compile code to specified JVM target: 1.6 or 1.8. Default one is 1.6. + -jvm-target Target version of the generated JVM bytecode (1.6 or 1.8), default is 1.6 -language-version Provide source compatibility with specified language version -nowarn Generate no warnings -verbose Enable verbose logging output diff --git a/compiler/testData/cli/jvm/wrongArgument.out b/compiler/testData/cli/jvm/wrongArgument.out index d3a735e2d9a..78663953d81 100644 --- a/compiler/testData/cli/jvm/wrongArgument.out +++ b/compiler/testData/cli/jvm/wrongArgument.out @@ -10,7 +10,7 @@ where possible options include: -script Evaluate the script file -kotlin-home Path to Kotlin compiler home directory, used for runtime libraries discovery -module-name Module name - -jvm-target <1.6|1.8> Compile code to specified JVM target: 1.6 or 1.8. Default one is 1.6. + -jvm-target Target version of the generated JVM bytecode (1.6 or 1.8), default is 1.6 -language-version Provide source compatibility with specified language version -nowarn Generate no warnings -verbose Enable verbose logging output diff --git a/compiler/testData/cli/jvm/wrongJvmTargetVersion.args b/compiler/testData/cli/jvm/wrongJvmTargetVersion.args new file mode 100644 index 00000000000..0ef733ee06d --- /dev/null +++ b/compiler/testData/cli/jvm/wrongJvmTargetVersion.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/simple.kt +-d +$TEMP_DIR$ +-jvm-target +1.5 diff --git a/compiler/testData/cli/jvm/wrongJvmTargetVersion.out b/compiler/testData/cli/jvm/wrongJvmTargetVersion.out new file mode 100644 index 00000000000..4a0a38a31ab --- /dev/null +++ b/compiler/testData/cli/jvm/wrongJvmTargetVersion.out @@ -0,0 +1,3 @@ +error: unknown JVM target version: 1.5 +Supported versions: 1.6, 1.8 +COMPILATION_ERROR diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index 3a5cfb04657..6981f08ce7f 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -289,6 +289,12 @@ public class CliTestGenerated extends AbstractCliTest { doJvmTest(fileName); } + @TestMetadata("wrongJvmTargetVersion.args") + public void testWrongJvmTargetVersion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/wrongJvmTargetVersion.args"); + doJvmTest(fileName); + } + @TestMetadata("wrongScriptWithNoSource.args") public void testWrongScriptWithNoSource() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/wrongScriptWithNoSource.args"); diff --git a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java index 7ae8c980b2f..04687fbdfd5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java +++ b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.JVMConfigurationKeys; +import org.jetbrains.kotlin.config.JvmTarget; import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; @@ -128,7 +129,7 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { } if (jvm8Target.isSelected()) { - configuration.put(JVMConfigurationKeys.JVM_8_TARGET, true); + configuration.put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_1_8); } return getBytecodeForFile(ktFile, configuration);