Forbid coroutines in language version is 1.3 and api version is less
This commit is contained in:
+5
-4
@@ -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
@@ -1,3 +1,4 @@
|
||||
// !API_VERSION: 1.3
|
||||
// !LANGUAGE: +ReleaseCoroutines
|
||||
// SKIP_TXT
|
||||
|
||||
|
||||
+32
@@ -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
|
||||
);
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java
Generated
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user