Forbid coroutines in language version is 1.3 and api version is less

This commit is contained in:
Ilmir Usmanov
2018-07-09 22:02:33 +03:00
parent 03c50ea139
commit c460593b7d
8 changed files with 72 additions and 8 deletions
@@ -6,10 +6,7 @@
package org.jetbrains.kotlin.resolve.calls.checkers
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.isBuiltInCoroutineContext
import org.jetbrains.kotlin.config.restrictsSuspensionFqName
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.coroutines.hasSuspendFunctionType
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
@@ -64,6 +61,10 @@ object CoroutineSuspendCallChecker : CallChecker {
else -> return
}
if (context.languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines) && context.languageVersionSettings.apiVersion < ApiVersion.KOTLIN_1_3) {
context.trace.report(Errors.UNSUPPORTED.on(reportOn, "cannot use release coroutines API version less than 1.3"))
}
val enclosingSuspendFunction = context.scope
.parentsWithSelf.firstOrNull {
it is LexicalScope && it.kind in ALLOWED_SCOPE_KINDS &&
@@ -1,3 +1,4 @@
// !API_VERSION: 1.3
// LANGUAGE_VERSION: 1.3
suspend fun named() {}
@@ -1,3 +1,4 @@
// !API_VERSION: 1.3
// !LANGUAGE: +ReleaseCoroutines
// SKIP_TXT
@@ -0,0 +1,32 @@
// !API_VERSION: 1.2
// !DIAGNOSTICS: -PRE_RELEASE_CLASS
// !LANGUAGE: +ReleaseCoroutines
// SKIP_TXT
suspend fun dummy() {}
suspend fun test1() {
kotlin.coroutines.<!UNRESOLVED_REFERENCE!>coroutineContext<!>
kotlin.coroutines.experimental.<!UNSUPPORTED, UNSUPPORTED!>coroutineContext<!>
<!UNSUPPORTED!>suspend {}()<!>
<!UNSUPPORTED!>dummy<!>()
val c: suspend () -> Unit = {}
<!UNSUPPORTED!>c<!>()
}
fun test2() {
kotlin.coroutines.experimental.buildSequence<Int> {
yield(1<!NO_VALUE_FOR_PARAMETER!>)<!>
}
kotlin.sequences.<!UNRESOLVED_REFERENCE!>buildSequence<!><Int> {
<!UNRESOLVED_REFERENCE!>yield<!>(1)
}
}
suspend fun test3(): Unit = <!TYPE_MISMATCH!>kotlin.coroutines.experimental.<!NO_VALUE_FOR_PARAMETER, TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR!>suspendCoroutine<!> <!TYPE_MISMATCH!>{ <!CANNOT_INFER_PARAMETER_TYPE!>_<!> -> Unit }<!><!>
suspend fun test4(): Unit = kotlin.coroutines.<!UNRESOLVED_REFERENCE!>suspendCoroutine<!> { <!CANNOT_INFER_PARAMETER_TYPE!>_<!> -> Unit }
@@ -1,3 +1,4 @@
// !API_VERSION: 1.3
// !LANGUAGE: +ReleaseCoroutines
// SKIP_TXT
@@ -61,10 +61,7 @@ import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -663,6 +660,19 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
classpath.add(ForTestCompileRuntime.androidAnnotationsForTests());
}
ApiVersion av = ApiVersion.LATEST_STABLE;
boolean explicitApiVersion = false;
for (TestFile tf : files) {
Map<String, String> directives = KotlinTestUtils.parseDirectives(tf.content);
if (directives.containsKey(API_VERSION_DIRECTIVE)) {
assert !explicitApiVersion : "multiple API_VERSIONs";
explicitApiVersion = true;
av = ApiVersion.Companion.parse(directives.get(API_VERSION_DIRECTIVE));
assert av != null : "incorrect API_VERSION";
}
}
CompilerConfiguration configuration = createConfiguration(
configurationKind, getJdkKind(files),
classpath,
@@ -670,6 +680,14 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
files
);
if (explicitApiVersion) {
CommonConfigurationKeysKt.setLanguageVersionSettings(configuration, new LanguageVersionSettingsImpl(
CommonConfigurationKeysKt.getLanguageVersionSettings(configuration).getLanguageVersion(), av,
new HashMap<AnalysisFlag<?>, Object>() {{
put(AnalysisFlag.getExplicitApiVersion(), true);
}}));
}
myEnvironment = KotlinCoreEnvironment.createForTests(
getTestRootDisposable(), configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES
);
@@ -1872,6 +1872,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW
runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/release/coroutineContext.kt");
}
@TestMetadata("languageVersionIsNotEqualToApiVersion.kt")
public void testLanguageVersionIsNotEqualToApiVersion() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/release/languageVersionIsNotEqualToApiVersion.kt");
}
@TestMetadata("suspend.kt")
public void testSuspend() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/release/suspend.kt");
@@ -1872,6 +1872,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno
runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/release/coroutineContext.kt");
}
@TestMetadata("languageVersionIsNotEqualToApiVersion.kt")
public void testLanguageVersionIsNotEqualToApiVersion() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/release/languageVersionIsNotEqualToApiVersion.kt");
}
@TestMetadata("suspend.kt")
public void testSuspend() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/release/suspend.kt");