Support JVM target versions up to 12

#KT-26240 Fixed
This commit is contained in:
Alexander Udalov
2019-03-01 21:54:29 +01:00
parent 9f75fd0d62
commit 518b03125c
7 changed files with 24 additions and 15 deletions
@@ -244,6 +244,10 @@ public abstract class AnnotationCodegen {
annotationTargetMaps.put(JvmTarget.JVM_1_6, jvm6); annotationTargetMaps.put(JvmTarget.JVM_1_6, jvm6);
annotationTargetMaps.put(JvmTarget.JVM_1_8, jvm8); annotationTargetMaps.put(JvmTarget.JVM_1_8, jvm8);
annotationTargetMaps.put(JvmTarget.JVM_9, jvm8);
annotationTargetMaps.put(JvmTarget.JVM_10, jvm8);
annotationTargetMaps.put(JvmTarget.JVM_11, jvm8);
annotationTargetMaps.put(JvmTarget.JVM_12, jvm8);
} }
private void generateTargetAnnotation( private void generateTargetAnnotation(
@@ -62,7 +62,7 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
@Argument( @Argument(
value = "-jvm-target", value = "-jvm-target",
valueDescription = "<version>", valueDescription = "<version>",
description = "Target version of the generated JVM bytecode (1.6 or 1.8), default is 1.6" description = "Target version of the generated JVM bytecode (1.6, 1.8, 9, 10, 11 or 12), default is 1.6"
) )
var jvmTarget: String? by NullableStringFreezableVar(JvmTarget.DEFAULT.description) var jvmTarget: String? by NullableStringFreezableVar(JvmTarget.DEFAULT.description)
@@ -14,6 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.config package org.jetbrains.kotlin.config
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
@@ -21,10 +22,13 @@ import org.jetbrains.org.objectweb.asm.Opcodes
enum class JvmTarget(override val description: String) : TargetPlatformVersion { enum class JvmTarget(override val description: String) : TargetPlatformVersion {
JVM_1_6("1.6"), JVM_1_6("1.6"),
JVM_1_8("1.8"), JVM_1_8("1.8"),
JVM_9("9"),
JVM_10("10"),
JVM_11("11"),
JVM_12("12"),
; ;
val bytecodeVersion: Int by lazy { val bytecodeVersion: Int by lazy {
@Suppress("DEPRECATION")
when (this) { when (this) {
JVM_1_6 -> Opcodes.V1_6 JVM_1_6 -> Opcodes.V1_6
JVM_1_8 -> JVM_1_8 ->
@@ -33,6 +37,10 @@ enum class JvmTarget(override val description: String) : TargetPlatformVersion {
java.lang.Boolean.valueOf(System.getProperty("kotlin.test.substitute.bytecode.1.8.to.1.9")) -> Opcodes.V9 java.lang.Boolean.valueOf(System.getProperty("kotlin.test.substitute.bytecode.1.8.to.1.9")) -> Opcodes.V9
else -> Opcodes.V1_8 else -> Opcodes.V1_8
} }
JVM_9 -> Opcodes.V9
JVM_10 -> Opcodes.V9 + 1
JVM_11 -> Opcodes.V9 + 2
JVM_12 -> Opcodes.V9 + 3
} }
} }
@@ -44,16 +52,13 @@ enum class JvmTarget(override val description: String) : TargetPlatformVersion {
fun fromString(string: String) = values().find { it.description == string } fun fromString(string: String) = values().find { it.description == string }
fun getDescription(bytecodeVersion: Int): String { fun getDescription(bytecodeVersion: Int): String {
@Suppress("DEPRECATION") val platformDescription = values().find { it.bytecodeVersion == bytecodeVersion }?.description ?: when (bytecodeVersion) {
val platformDescription = values().find { it.bytecodeVersion == bytecodeVersion }?.description ?: Opcodes.V1_7 -> "1.7"
when (bytecodeVersion) { else -> null
Opcodes.V1_7 -> "1.7" }
Opcodes.V9 -> "1.9"
else -> null
}
return if (platformDescription != null) "JVM target $platformDescription" return if (platformDescription != null) "JVM target $platformDescription"
else "JVM bytecode version $bytecodeVersion" else "JVM bytecode version $bytecodeVersion"
} }
} }
} }
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.*
class InterfaceDefaultMethodCallChecker(val jvmTarget: JvmTarget) : CallChecker { class InterfaceDefaultMethodCallChecker(val jvmTarget: JvmTarget) : CallChecker {
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
val supportDefaults = jvmTarget == JvmTarget.JVM_1_8 val supportDefaults = jvmTarget >= JvmTarget.JVM_1_8
val descriptor = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return val descriptor = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return
if (descriptor is JavaPropertyDescriptor) return if (descriptor is JavaPropertyDescriptor) return
+1 -1
View File
@@ -5,7 +5,7 @@ where possible options include:
-include-runtime Include Kotlin runtime in to resulting .jar -include-runtime Include Kotlin runtime in to resulting .jar
-java-parameters Generate metadata for Java 1.8 reflection on method parameters -java-parameters Generate metadata for Java 1.8 reflection on method parameters
-jdk-home <path> Path to JDK home directory to include into classpath, if differs from default JAVA_HOME -jdk-home <path> Path to JDK home directory to include into classpath, if differs from default JAVA_HOME
-jvm-target <version> Target version of the generated JVM bytecode (1.6 or 1.8), default is 1.6 -jvm-target <version> Target version of the generated JVM bytecode (1.6, 1.8, 9, 10, 11 or 12), default is 1.6
-module-name <name> Name of the generated .kotlin_module file -module-name <name> Name of the generated .kotlin_module file
-no-jdk Don't include Java runtime into classpath -no-jdk Don't include Java runtime into classpath
-no-reflect Don't include kotlin-reflect.jar into classpath -no-reflect Don't include kotlin-reflect.jar into classpath
+1 -1
View File
@@ -1,3 +1,3 @@
error: unknown JVM target version: 1.5 error: unknown JVM target version: 1.5
Supported versions: 1.6, 1.8 Supported versions: 1.6, 1.8, 9, 10, 11, 12
COMPILATION_ERROR COMPILATION_ERROR
@@ -23,8 +23,8 @@ interface KotlinJvmOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonOption
var jdkHome: kotlin.String? var jdkHome: kotlin.String?
/** /**
* Target version of the generated JVM bytecode (1.6 or 1.8), default is 1.6 * Target version of the generated JVM bytecode (1.6, 1.8, 9, 10, 11 or 12), default is 1.6
* Possible values: "1.6", "1.8" * Possible values: "1.6", "1.8", "9", "10", "11", "12"
* Default value: "1.6" * Default value: "1.6"
*/ */
var jvmTarget: kotlin.String var jvmTarget: kotlin.String