Switch enableJvmDefault to jvmDefaultMode

This commit is contained in:
Mikhael Bogdanov
2018-05-23 14:57:14 +02:00
parent bacc2079ed
commit 065780de4c
61 changed files with 114 additions and 70 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.cli.common.arguments
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.config.*
@@ -222,8 +223,19 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
)
var noExceptionOnExplicitEqualsForBoxedNull by FreezableVar(false)
@Argument(value = "-Xenable-jvm-default", description = "Allow to use '@JvmDefault' for JVM default method support")
var enableJvmDefault: Boolean by FreezableVar(false)
@Argument(
value = "-Xoutput-imports",
valueDescription = "<path>",
description = "Output imports from all compiled files to the specified file in JSON format"
)
var outputImports: String? by FreezableVar(null)
@Argument(
value = "-Xjvm-default-mode",
valueDescription = "{disable|enable|compatibility}",
description = "Allow to use '@JvmDefault' for JVM default method support"
)
var jvmDefaultMode: String by FreezableVar(JvmDefaultMode.DEFAULT.description)
@Argument(value = "-Xdisable-default-scripting-plugin", description = "Do not enable scripting plugin by default")
var disableDefaultScriptingPlugin: Boolean by FreezableVar(false)
@@ -240,8 +252,13 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
jsr305,
supportCompatqualCheckerFrameworkAnnotations
)
result[AnalysisFlag.enableJvmDefault] = enableJvmDefault
result[AnalysisFlag.ignoreDataFlowInAssert] = JVMAssertionsMode.fromString(assertionsMode) != JVMAssertionsMode.LEGACY
JvmDefaultMode.fromStringOrNull(jvmDefaultMode)?.let { result[AnalysisFlag.jvmDefaultMode] = it }
?: collector.report(
CompilerMessageSeverity.ERROR,
"Unknown @JvmDefault mode: $jvmDefaultMode, " +
"supported modes: ${JvmDefaultMode.values().map { it.description }}"
)
return result
}
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
class JvmDefaultChecker(val jvmTarget: JvmTarget) : DeclarationChecker {
override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
val enableJvmDefault = context.languageVersionSettings.getFlag(AnalysisFlag.enableJvmDefault)
val jvmDefaultMode = context.languageVersionSettings.getFlag(AnalysisFlag.jvmDefaultMode)
descriptor.annotations.findAnnotation(JVM_DEFAULT_FQ_NAME)?.let { annotationDescriptor ->
val reportOn = DescriptorToSourceUtils.getSourceFromAnnotation(annotationDescriptor) ?: declaration
@@ -31,7 +31,7 @@ class JvmDefaultChecker(val jvmTarget: JvmTarget) : DeclarationChecker {
context.trace.report(ErrorsJvm.JVM_DEFAULT_NOT_IN_INTERFACE.on(reportOn))
} else if (jvmTarget == JvmTarget.JVM_1_6) {
context.trace.report(ErrorsJvm.JVM_DEFAULT_IN_JVM6_TARGET.on(reportOn))
} else if (!enableJvmDefault) {
} else if (!jvmDefaultMode.isEnabled) {
context.trace.report(ErrorsJvm.JVM_DEFAULT_IN_DECLARATION.on(declaration))
}
return@check
@@ -42,7 +42,7 @@ class JvmDefaultChecker(val jvmTarget: JvmTarget) : DeclarationChecker {
descriptor.unsubstitutedMemberScope.getContributedDescriptors().filterIsInstance<CallableMemberDescriptor>().any {
it.kind.isReal && it.hasJvmDefaultAnnotation()
}
if (!hasDeclaredJvmDefaults && !checkJvmDefaultsInHierarchy(descriptor, enableJvmDefault)) {
if (!hasDeclaredJvmDefaults && !checkJvmDefaultsInHierarchy(descriptor, jvmDefaultMode.isEnabled)) {
context.trace.report(ErrorsJvm.JVM_DEFAULT_THROUGH_INHERITANCE.on(declaration))
}
}
@@ -54,7 +54,7 @@ class JvmDefaultChecker(val jvmTarget: JvmTarget) : DeclarationChecker {
if (memberDescriptor.overriddenDescriptors.any { it.annotations.hasAnnotation(JVM_DEFAULT_FQ_NAME) }) {
context.trace.report(ErrorsJvm.JVM_DEFAULT_REQUIRED_FOR_OVERRIDE.on(declaration))
} else if (enableJvmDefault) {
} else if (jvmDefaultMode.isEnabled) {
descriptor.overriddenDescriptors.flatMap { OverridingUtil.getOverriddenDeclarations(it) }.toSet().let {
for (realDescriptor in OverridingUtil.filterOutOverridden(it)) {
if (realDescriptor is JavaMethodDescriptor && realDescriptor.modality != Modality.ABSTRACT) {
@@ -137,9 +137,9 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
MAP.put(JVM_DEFAULT_NOT_IN_INTERFACE,"'@JvmDefault' is only supported on interface members");
MAP.put(JVM_DEFAULT_IN_JVM6_TARGET,"'@JvmDefault' is only supported since JVM target 1.8. Recompile with '-jvm-target 1.8'");
MAP.put(JVM_DEFAULT_REQUIRED_FOR_OVERRIDE, "'@JvmDefault' is required for an override of a '@JvmDefault' member");
MAP.put(JVM_DEFAULT_IN_DECLARATION, "Usage of '@JvmDefault' is only allowed if the flag -Xenable-jvm-default is enabled");
MAP.put(JVM_DEFAULT_THROUGH_INHERITANCE, "Inheritance from an interface with '@JvmDefault' members is only allowed if the flag -Xenable-jvm-default is enabled");
MAP.put(USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL, "Super calls of '@JvmDefault' members are only allowed if the flag -Xenable-jvm-default is enabled");
MAP.put(JVM_DEFAULT_IN_DECLARATION, "Usage of '@JvmDefault' is only allowed with -Xjvm-default-mode option");
MAP.put(JVM_DEFAULT_THROUGH_INHERITANCE, "Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default-mode option");
MAP.put(USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL, "Super calls of '@JvmDefault' members are only allowed with -Xjvm-default-mode option");
MAP.put(NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT, "Non-@JvmDefault interface method cannot override default Java method. Please annotate this method with @JvmDefault");
}
@@ -19,8 +19,8 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
class JvmDefaultSuperCallChecker : CallChecker {
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
val enableJvmDefault = context.languageVersionSettings.getFlag(AnalysisFlag.enableJvmDefault)
if (enableJvmDefault) return
val jvmDefaultMode = context.languageVersionSettings.getFlag(AnalysisFlag.jvmDefaultMode)
if (jvmDefaultMode.isEnabled) return
val superExpression = getSuperCallExpression(resolvedCall.call) ?: return
val resultingDescriptor = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return
if (!resultingDescriptor.hasJvmDefaultAnnotation()) return
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Z {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_REFLECT
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// IGNORE_BACKEND: JS
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_REFLECT
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FILE: 1.kt
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FILE: 1.kt
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FILE: 1.kt
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
// FILE: 1.kt
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// FILE: 1.kt
interface Test {
fun test(): String {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// FILE: 1.kt
interface Test {
fun test(): String {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// FILE: 1.kt
interface Test {
fun test(): String {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// FILE: 1.kt
interface Test {
fun test(): String {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// FILE: 1.kt
interface Test {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// FILE: 1.kt
interface Test {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// JVM_TARGET: 1.8
// WITH_RUNTIME
@@ -1,6 +1,6 @@
// !API_VERSION: 1.3
// !JVM_TARGET: 1.8
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
interface A<T> {
@JvmDefault
fun test(p: T) {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// !JVM_TARGET: 1.8
// FILE: JavaInterface.java
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// !JVM_TARGET: 1.8
public interface KInterface {
@@ -1,5 +1,5 @@
// !API_VERSION: 1.3
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
// !JVM_TARGET: 1.8
// FILE: JavaInterface.java
@@ -1,6 +1,6 @@
// !API_VERSION: 1.3
// !JVM_TARGET: 1.8
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
interface B {
@JvmDefault
@@ -1,6 +1,6 @@
// !API_VERSION: 1.3
// !JVM_TARGET: 1.8
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
interface A {
@JvmDefault
fun test() {}
@@ -1,6 +1,6 @@
// !API_VERSION: 1.3
// !JVM_TARGET: 1.8
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
interface A {
@JvmDefault
val test: String
@@ -1,6 +1,6 @@
// !API_VERSION: 1.3
// !JVM_TARGET: 1.8
// !ENABLE_JVM_DEFAULT
// !JVM_DEFAULT_MODE: enable
interface B {
@JvmDefault
@@ -18,7 +18,7 @@ const val API_VERSION_DIRECTIVE = "API_VERSION"
const val EXPERIMENTAL_DIRECTIVE = "EXPERIMENTAL"
const val USE_EXPERIMENTAL_DIRECTIVE = "USE_EXPERIMENTAL"
const val IGNORE_DATA_FLOW_IN_ASSERT_DIRECTIVE = "IGNORE_DATA_FLOW_IN_ASSERT"
const val ENABLE_JVM_DEFAULT = "ENABLE_JVM_DEFAULT"
const val JVM_DEFAULT_MODE = "JVM_DEFAULT_MODE"
data class CompilerTestLanguageVersionSettings(
private val initialLanguageFeatures: Map<LanguageFeature, LanguageFeature.State>,
@@ -51,7 +51,7 @@ fun parseLanguageVersionSettings(directiveMap: Map<String, String>): LanguageVer
val experimental = directiveMap[EXPERIMENTAL_DIRECTIVE]?.split(' ')?.let { AnalysisFlag.experimental to it }
val useExperimental = directiveMap[USE_EXPERIMENTAL_DIRECTIVE]?.split(' ')?.let { AnalysisFlag.useExperimental to it }
val ignoreDataFlowInAssert = AnalysisFlag.ignoreDataFlowInAssert to directiveMap.containsKey(IGNORE_DATA_FLOW_IN_ASSERT_DIRECTIVE)
val enableJvmDefault = AnalysisFlag.enableJvmDefault to directiveMap.containsKey(ENABLE_JVM_DEFAULT)
val enableJvmDefault = directiveMap[JVM_DEFAULT_MODE]?.let { AnalysisFlag.jvmDefaultMode to JvmDefaultMode.fromStringOrNull(it)!! }
if (apiVersionString == null && languageFeaturesString == null && experimental == null && useExperimental == null && !ignoreDataFlowInAssert.second) return null
@@ -56,7 +56,7 @@ class VersionRequirementTest : TestCaseWithTmpdir() {
languageVersionSettings = LanguageVersionSettingsImpl(
LanguageVersionSettingsImpl.DEFAULT.languageVersion,
LanguageVersionSettingsImpl.DEFAULT.apiVersion,
mapOf(AnalysisFlag.enableJvmDefault to true),
mapOf(AnalysisFlag.jvmDefaultMode to JvmDefaultMode.ENABLE),
emptyMap()
)
},
@@ -32,6 +32,10 @@ class AnalysisFlag<out T> internal constructor(
operator fun provideDelegate(instance: Any?, property: KProperty<*>) = Flag(property.name, Jsr305State.DEFAULT)
}
object JvmDefaultModeDisabledByDefaul {
operator fun provideDelegate(instance: Any?, property: KProperty<*>) = Flag(property.name, org.jetbrains.kotlin.config.JvmDefaultMode.DISABLE)
}
object ListOfStrings {
operator fun provideDelegate(instance: Any?, property: KProperty<*>) = Flag(property.name, emptyList<String>())
}
@@ -60,9 +64,9 @@ class AnalysisFlag<out T> internal constructor(
val explicitApiVersion by Flag.Boolean
@JvmStatic
val enableJvmDefault by Flag.Boolean
val ignoreDataFlowInAssert by Flag.Boolean
@JvmStatic
val ignoreDataFlowInAssert by Flag.Boolean
val jvmDefaultMode by Flag.JvmDefaultModeDisabledByDefaul
}
}
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.config
enum class JvmDefaultMode(val description: String) {
DISABLE("disable"),
ENABLE("enable"),
ENABLE_WITH_DEFAULT_IMPLS("compatibility");
val isEnabled
get() = this != DISABLE
companion object {
@JvmField
val DEFAULT = DISABLE
@JvmStatic
fun fromStringOrNull(string: String?) = values().find { it.description == string }
}
}