Refactor language features, which control effect system

- Introduce new language feature 'ReadDeserializedContracts', which
allows to deserialize contracts from metadata.

- Introduce new language feature 'AllowContractsForCustomFunctions',
which allows reading contracts from sources.

- Use new features instead of combination 'CallsInPlaceEffect ||
ReturnsEffect'

- Rename 'CallsInPlaceEffect' -> 'UseCallsInPlaceEffect',
'ReturnsEffect' -> 'UseReturnsEffect'. As names suggest, they control
if it is allowed to use corresponding effect in analysis.

We have to introduce separate 'ReadDeserializedContracts' to enable
contracts only in some modules of the project, because libraries are
read with project-wide settings (see KT-20692).
This commit is contained in:
Dmitry Savvinov
2018-01-24 21:17:16 +03:00
parent 78850087be
commit b29a6e48fb
100 changed files with 116 additions and 206 deletions
@@ -131,6 +131,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
)
var effectSystem: Boolean by FreezableVar(false)
@Argument(
value = "-Xread-deserialized-contracts",
description = "Enable reading of contracts from metadata"
)
var readDeserializedContracts: Boolean by FreezableVar(false)
open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
return HashMap<AnalysisFlag<*>, Any>().apply {
put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck)
@@ -44,7 +44,6 @@ import java.io.PrintStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.jetbrains.kotlin.cli.common.ExitCode.*;
import static org.jetbrains.kotlin.cli.common.environment.UtilKt.setIdeaIoUseFallback;
@@ -218,8 +217,12 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
}
if (arguments.getEffectSystem()) {
extraLanguageFeatures.put(LanguageFeature.CallsInPlaceEffect, LanguageFeature.State.ENABLED);
extraLanguageFeatures.put(LanguageFeature.ReturnsEffect, LanguageFeature.State.ENABLED);
extraLanguageFeatures.put(LanguageFeature.UseCallsInPlaceEffect, LanguageFeature.State.ENABLED);
extraLanguageFeatures.put(LanguageFeature.UseReturnsEffect, LanguageFeature.State.ENABLED);
}
if (arguments.getReadDeserializedContracts()) {
extraLanguageFeatures.put(LanguageFeature.ReadDeserializedContracts, LanguageFeature.State.ENABLED);
}
@@ -1048,7 +1048,7 @@ class ControlFlowProcessor(private val trace: BindingTrace) {
mark(lambdaExpression)
val functionLiteral = lambdaExpression.functionLiteral
// NB. Behaviour here is implicitly controlled by the LanguageFeature 'CallsInPlaceEffect'
// NB. Behaviour here is implicitly controlled by the LanguageFeature 'UseCallsInPlaceEffect'
// If this feature is turned off, then slice LAMBDA_INVOCATIONS is never written and invocationKind
// in all subsequent calls always 'null', resulting in falling back to old behaviour
visitFunction(functionLiteral, trace[BindingContext.LAMBDA_INVOCATIONS, lambdaExpression])
@@ -38,7 +38,7 @@ class ContractDeserializerImpl(private val configuration: DeserializationConfigu
): Pair<FunctionDescriptor.UserDataKey<*>, LazyContractProvider>? {
if (!proto.hasContract()) return null
if (!configuration.returnsEffectAllowed && !configuration.callsInPlaceEffectAllowed) return null
if (!configuration.readDeserializedContracts) return null
val worker = ContractDeserializationWorker(typeTable, typeDeserializer, ownerFunction)
val contract = worker.deserializeContract(proto.contract)
@@ -45,7 +45,7 @@ class EffectSystem(val languageVersionSettings: LanguageVersionSettings) {
bindingTrace: BindingTrace,
moduleDescriptor: ModuleDescriptor
): DataFlowInfo {
if (!languageVersionSettings.supportsFeature(LanguageFeature.ReturnsEffect)) return DataFlowInfo.EMPTY
if (!languageVersionSettings.supportsFeature(LanguageFeature.UseReturnsEffect)) return DataFlowInfo.EMPTY
// Prevent launch of effect system machinery on pointless cases (constants/enums/constructors/etc.)
val callExpression = resolvedCall.call.callElement as? KtCallExpression ?: return DataFlowInfo.EMPTY
@@ -62,7 +62,7 @@ class EffectSystem(val languageVersionSettings: LanguageVersionSettings) {
bindingTrace: BindingTrace,
moduleDescriptor: ModuleDescriptor
): ConditionalDataFlowInfo {
if (!languageVersionSettings.supportsFeature(LanguageFeature.ReturnsEffect)) return ConditionalDataFlowInfo.EMPTY
if (!languageVersionSettings.supportsFeature(LanguageFeature.UseReturnsEffect)) return ConditionalDataFlowInfo.EMPTY
if (leftExpression == null || rightExpression == null) return ConditionalDataFlowInfo.EMPTY
val leftComputation =
@@ -82,7 +82,7 @@ class EffectSystem(val languageVersionSettings: LanguageVersionSettings) {
}
fun recordDefiniteInvocations(resolvedCall: ResolvedCall<*>, bindingTrace: BindingTrace, moduleDescriptor: ModuleDescriptor) {
if (!languageVersionSettings.supportsFeature(LanguageFeature.CallsInPlaceEffect)) return
if (!languageVersionSettings.supportsFeature(LanguageFeature.UseCallsInPlaceEffect)) return
// Prevent launch of effect system machinery on pointless cases (constants/enums/constructors/etc.)
val callExpression = resolvedCall.call.callElement as? KtCallExpression ?: return
@@ -102,7 +102,7 @@ class EffectSystem(val languageVersionSettings: LanguageVersionSettings) {
bindingTrace: BindingTrace,
moduleDescriptor: ModuleDescriptor
): DataFlowInfo {
if (!languageVersionSettings.supportsFeature(LanguageFeature.ReturnsEffect)) return DataFlowInfo.EMPTY
if (!languageVersionSettings.supportsFeature(LanguageFeature.UseReturnsEffect)) return DataFlowInfo.EMPTY
if (condition == null) return DataFlowInfo.EMPTY
return getContextInfoWhen(ESReturns(value.lift()), condition, bindingTrace, moduleDescriptor)
@@ -43,8 +43,7 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin
if (!isContractDescriptionCallFastCheck(expression) || ownerDescriptor !is FunctionDescriptor) return
val contractProvider = ownerDescriptor.getUserData(ContractProviderKey) ?: return
val isFeatureTurnedOn = languageVersionSettings.supportsFeature(LanguageFeature.CallsInPlaceEffect) ||
languageVersionSettings.supportsFeature(LanguageFeature.ReturnsEffect) ||
val isFeatureTurnedOn = languageVersionSettings.supportsFeature(LanguageFeature.AllowContractsForCustomFunctions) ||
// This condition is here for technical purposes of compiling 1.2-runtime with contracts
languageVersionSettings.getFlag(AnalysisFlag.Flags.allowKotlinPackage)
@@ -31,7 +31,5 @@ class CompilerDeserializationConfiguration(languageVersionSettings: LanguageVers
override val isJvmPackageNameSupported = languageVersionSettings.supportsFeature(LanguageFeature.JvmPackageName)
override val returnsEffectAllowed: Boolean = languageVersionSettings.supportsFeature(LanguageFeature.ReturnsEffect)
override val callsInPlaceEffectAllowed: Boolean = languageVersionSettings.supportsFeature(LanguageFeature.CallsInPlaceEffect)
override val readDeserializedContracts: Boolean = languageVersionSettings.supportsFeature(LanguageFeature.ReadDeserializedContracts)
}
@@ -235,8 +235,7 @@ class FunctionDescriptorResolver(
}
val emptyContract = LazyContractProvider.createInitialized(null)
val isContractsEnabled = languageVersionSettings.supportsFeature(LanguageFeature.CallsInPlaceEffect) ||
languageVersionSettings.supportsFeature(LanguageFeature.ReturnsEffect) ||
val isContractsEnabled = languageVersionSettings.supportsFeature(LanguageFeature.AllowContractsForCustomFunctions) ||
// We need to enable contracts if we're compiling "kotlin"-package to be able to ship contracts in stdlib in 1.2
languageVersionSettings.getFlag(AnalysisFlag.allowKotlinPackage)
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +UseReturnsEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
+1
View File
@@ -14,6 +14,7 @@ where advanced options include:
-Xno-check-actual Do not check presence of 'actual' modifier in multi-platform projects
-Xno-inline Disable method inlining
-Xplugin=<path> Load plugins from the given classpath
-Xread-deserialized-contracts Enable reading of contracts from metadata
-Xrepeat=<count> Repeat compilation (for performance analysis)
-Xreport-output-files Report source to output files mapping
-Xskip-metadata-version-check Load classes with bad metadata version anyway (incl. pre-release classes)
+1
View File
@@ -53,6 +53,7 @@ where advanced options include:
-Xno-check-actual Do not check presence of 'actual' modifier in multi-platform projects
-Xno-inline Disable method inlining
-Xplugin=<path> Load plugins from the given classpath
-Xread-deserialized-contracts Enable reading of contracts from metadata
-Xrepeat=<count> Repeat compilation (for performance analysis)
-Xreport-output-files Report source to output files mapping
-Xskip-metadata-version-check Load classes with bad metadata version anyway (incl. pre-release classes)
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// WITH_RUNTIME
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +ReadDeserializedContracts
// FILE: 1.kt
package test
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,97 +0,0 @@
== myRun ==
fun <T> myRun(@CalledInPlace block: () -> T): T = block()
---------------------
L0:
1 <START> INIT: in: {} out: {}
v(@CalledInPlace block: () -> T) INIT: in: {} out: {block=D}
magic[FAKE_INITIALIZER](@CalledInPlace block: () -> T) -> <v0> INIT: in: {block=D} out: {block=D}
w(block|<v0>) INIT: in: {block=D} out: {block=ID} USE: in: {block=READ} out: {block=READ}
r(block) -> <v1> INIT: in: {block=ID} out: {block=ID} USE: in: {} out: {block=READ}
mark(block())
call(block(), invoke|<v1>) -> <v2>
ret(*|<v2>) L1
L1:
<END>
error:
<ERROR> INIT: in: {} out: {}
sink:
<SINK> INIT: in: {block=I?} out: {block=I?} USE: in: {} out: {}
=====================
== functionWithExpressionBody ==
fun functionWithExpressionBody(x: Int) = myRun {
if (x == 0) return true
if (x == 1) return false
return functionWithExpressionBody(x - 2)
}
---------------------
L0:
1 <START> INIT: in: {} out: {}
v(x: Int) INIT: in: {} out: {x=D}
magic[FAKE_INITIALIZER](x: Int) -> <v0> INIT: in: {x=D} out: {x=D}
w(x|<v0>) INIT: in: {x=D} out: {x=ID}
mark({ if (x == 0) return true if (x == 1) return false return functionWithExpressionBody(x - 2) }) INIT: in: {x=ID} out: {x=ID}
jmp?(L2)
d({ if (x == 0) return true if (x == 1) return false return functionWithExpressionBody(x - 2) }) INIT: in: {} out: {} USE: in: {x=READ} out: {x=READ}
L2 [after local declaration]:
r({ if (x == 0) return true if (x == 1) return false return functionWithExpressionBody(x - 2) }) -> <v1> INIT: in: {x=ID} out: {x=ID}
mark(myRun { if (x == 0) return true if (x == 1) return false return functionWithExpressionBody(x - 2) })
call(myRun { if (x == 0) return true if (x == 1) return false return functionWithExpressionBody(x - 2) }, myRun|<v1>) -> <v2>
ret(*|<v2>) L1
L1:
<END>
error:
<ERROR> INIT: in: {} out: {}
sink:
<SINK> INIT: in: {x=I?} out: {x=I?} USE: in: {} out: {}
=====================
== anonymous_0 ==
{
if (x == 0) return true
if (x == 1) return false
return functionWithExpressionBody(x - 2)
}
---------------------
L3:
2 <START> INIT: in: {x=ID} out: {x=ID}
3 mark(if (x == 0) return true if (x == 1) return false return functionWithExpressionBody(x - 2))
mark(if (x == 0) return true)
r(x) -> <v0>
r(0) -> <v1>
mark(x == 0)
call(x == 0, equals|<v0>, <v1>) -> <v2>
jf(L5|<v2>) USE: in: {x=READ} out: {x=READ}
r(true) -> <v3>
ret(*|<v3>) L1 USE: in: {} out: {}
- jmp(L6)
L5 [else branch]:
read (Unit) INIT: in: {x=ID} out: {x=ID}
L6 ['if' expression result]:
merge(if (x == 0) return true|!<v4>) -> <v5>
mark(if (x == 1) return false)
r(x) -> <v6>
r(1) -> <v7>
mark(x == 1)
call(x == 1, equals|<v6>, <v7>) -> <v8>
jf(L7|<v8>) USE: in: {x=READ} out: {x=READ}
r(false) -> <v9>
ret(*|<v9>) L1 USE: in: {} out: {}
- jmp(L8)
L7 [else branch]:
read (Unit) INIT: in: {x=ID} out: {x=ID}
L8 ['if' expression result]:
merge(if (x == 1) return false|!<v10>) -> <v11> USE: in: {x=READ} out: {x=READ}
r(x) -> <v12> USE: in: {} out: {x=READ}
r(2) -> <v13>
mark(x - 2)
call(x - 2, minus|<v12>, <v13>) -> <v14>
mark(functionWithExpressionBody(x - 2))
call(functionWithExpressionBody(x - 2), functionWithExpressionBody|<v14>) -> <v15>
ret(*|<v15>) L1 USE: in: {} out: {}
- 2 ret(*|!<v16>) L4
L4:
<END> INIT: in: {} out: {}
error:
<ERROR>
sink:
<SINK> USE: in: {} out: {}
=====================
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,5 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -INVISIBLE_MEMBER -INVISIBLE_REFERENCE
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER -UNUSED_PARAMETER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +ReadDeserializedContracts +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
fun testCheckSmartcast(x: Any?) {
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect
// !LANGUAGE: +ReadDeserializedContracts +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
fun testRunWithUnitReturn() {
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +ReadDeserializedContracts +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
fun testIsNullOrBlank(x: String?) {
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +ReadDeserializedContracts +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
fun testIsNullOrEmpty(x: String?) {
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +ReadDeserializedContracts +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
fun testRequireSmartcast(x: Any?) {
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +CallsInPlaceEffect +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +UseCallsInPlaceEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
// !WITH_NEW_INFERENCE
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -1,4 +1,4 @@
// !LANGUAGE: +ReturnsEffect
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.internal.contracts.*
@@ -67,8 +67,6 @@ enum class LanguageFeature(
DefaultMethodsCallFromJava6TargetError(KOTLIN_1_2),
BooleanElvisBoundSmartCasts(KOTLIN_1_3),
ReturnsEffect(KOTLIN_1_3),
CallsInPlaceEffect(KOTLIN_1_3),
RestrictionOfValReassignmentViaBackingField(KOTLIN_1_3),
NestedClassesInEnumEntryShouldBeInner(KOTLIN_1_3),
ProhibitDataClassesOverridingCopy(KOTLIN_1_3),
@@ -80,6 +78,11 @@ enum class LanguageFeature(
StrictJavaNullabilityAssertions(sinceVersion = null, defaultState = State.DISABLED),
ReadDeserializedContracts(KOTLIN_1_3),
UseReturnsEffect(KOTLIN_1_3),
UseCallsInPlaceEffect(KOTLIN_1_3),
AllowContractsForCustomFunctions(KOTLIN_1_3),
// Experimental features
Coroutines(KOTLIN_1_1, ApiVersion.KOTLIN_1_1, "https://kotlinlang.org/docs/diagnostics/experimental-coroutines", State.ENABLED_WITH_WARNING),
@@ -29,10 +29,7 @@ interface DeserializationConfiguration {
val isJvmPackageNameSupported: Boolean
get() = true
val returnsEffectAllowed: Boolean
get() = false
val callsInPlaceEffectAllowed: Boolean
val readDeserializedContracts: Boolean
get() = false
object Default : DeserializationConfiguration