From d571d0ad517495253b7d2165d68bec89c55e47bc Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Fri, 7 Sep 2018 17:29:07 +0300 Subject: [PATCH] JS: prohibit using experimental coroutines from 1.3 --- .../kotlin/codegen/state/GenerationState.kt | 2 +- .../checkers/ExperimentalUsageChecker.kt | 2 +- .../kotlin/resolve/deprecationUtil.kt | 26 +++++++++++++++---- .../module/coroutineProhibitedMigration.kt | 6 +++++ .../module/coroutineProhibitedMigration.txt | 3 +++ .../DiagnosticsTestWithJsStdLibGenerated.java | 5 ++++ .../js/resolve/JsPlatformConfigurator.kt | 6 ++--- 7 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index 32ad21a5f51..56f84053f1f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -138,7 +138,7 @@ class GenerationState private constructor( val deserializationConfiguration: DeserializationConfiguration = CompilerDeserializationConfiguration(configuration.languageVersionSettings) - val deprecationProvider = DeprecationResolver(LockBasedStorageManager.NO_LOCKS, configuration.languageVersionSettings) + val deprecationProvider = DeprecationResolver(LockBasedStorageManager.NO_LOCKS, configuration.languageVersionSettings, CoroutineCompatibilitySupport.ENABLED) init { val icComponents = configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt index 0fcf3ab4da4..795020081f7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -208,7 +208,7 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { // Ideally, we should run full resolution (with all classifier usage checkers) on classifiers used in "-Xexperimental" and // "-Xuse-experimental" arguments. However, it's not easy to do this. This should be solved in the future with the support of // module annotations. For now, we only check deprecations because this is needed to correctly retire unneeded compiler arguments. - val deprecationResolver = DeprecationResolver(LockBasedStorageManager(), languageVersionSettings) + val deprecationResolver = DeprecationResolver(LockBasedStorageManager(), languageVersionSettings, CoroutineCompatibilitySupport.ENABLED) fun checkAnnotation(fqName: String): Boolean { val descriptor = module.resolveClassByFqName(FqName(fqName), NoLookupLocation.FOR_NON_TRACKED_SCOPE) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt index e1ad7bead88..a17ce004812 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.container.DefaultImplementation import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.impl.DescriptorDerivedFromTypeAlias @@ -218,9 +219,21 @@ enum class DeprecationLevelValue { WARNING, ERROR, HIDDEN } +@DefaultImplementation(CoroutineCompatibilitySupport::class) +class CoroutineCompatibilitySupport private constructor(val enabled: Boolean) { + constructor() : this(true) + + companion object { + val ENABLED = CoroutineCompatibilitySupport(true) + + val DISABLED = CoroutineCompatibilitySupport(false) + } +} + class DeprecationResolver( storageManager: StorageManager, - private val languageVersionSettings: LanguageVersionSettings + private val languageVersionSettings: LanguageVersionSettings, + private val coroutineCompatibilitySupport: CoroutineCompatibilitySupport ) { private val deprecations = storageManager.createMemoizedFunction { descriptor: DeclarationDescriptor -> val deprecations = descriptor.getOwnDeprecations() @@ -364,10 +377,13 @@ class DeprecationResolver( private fun getDeprecationByCoroutinesVersion(target: DeclarationDescriptor): DeprecatedExperimentalCoroutine? { if (target !is DeserializedMemberDescriptor) return null - return when (target.coroutinesExperimentalCompatibilityMode) { - COMPATIBLE -> null - NEEDS_WRAPPER -> DeprecatedExperimentalCoroutine(target, WARNING) - INCOMPATIBLE -> DeprecatedExperimentalCoroutine(target, ERROR) + + target.coroutinesExperimentalCompatibilityMode.let { mode -> + return when { + mode == COMPATIBLE -> null + mode == NEEDS_WRAPPER && coroutineCompatibilitySupport.enabled -> DeprecatedExperimentalCoroutine(target, WARNING) + else -> DeprecatedExperimentalCoroutine(target, ERROR) + } } } diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.kt b/compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.kt new file mode 100644 index 00000000000..f1c0897e210 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.kt @@ -0,0 +1,6 @@ +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +suspend fun dummy(): String = suspendCoroutine { + it.resume("OK") +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.txt b/compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.txt new file mode 100644 index 00000000000..6a0a1df0eeb --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.txt @@ -0,0 +1,3 @@ +package + +public suspend fun dummy(): kotlin.String diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index a24c80a2768..cf039e722ee 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -383,6 +383,11 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/module"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("coroutineProhibitedMigration.kt") + public void testCoroutineProhibitedMigration() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJsStdLib/module/coroutineProhibitedMigration.kt"); + } + @TestMetadata("dualModuleFromUmd.kt") public void testDualModuleFromUmd() throws Exception { runTest("compiler/testData/diagnostics/testsWithJsStdLib/module/dualModuleFromUmd.kt"); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt index e79c99733e9..273513178ab 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt @@ -23,10 +23,7 @@ import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.js.analyze.JsNativeDiagnosticSuppressor import org.jetbrains.kotlin.js.naming.NameSuggestion import org.jetbrains.kotlin.js.resolve.diagnostics.* -import org.jetbrains.kotlin.resolve.DeclarationReturnTypeSanitizer -import org.jetbrains.kotlin.resolve.OverloadFilter -import org.jetbrains.kotlin.resolve.OverridesBackwardCompatibilityHelper -import org.jetbrains.kotlin.resolve.PlatformConfigurator +import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.checkers.ReifiedTypeParameterSubstitutionChecker import org.jetbrains.kotlin.resolve.calls.components.SamConversionTransformer import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker @@ -76,5 +73,6 @@ object JsPlatformConfigurator : PlatformConfigurator( container.useInstance(ExtensionFunctionToExternalIsInlinable) container.useInstance(JsQualifierChecker) container.useInstance(JsNativeDiagnosticSuppressor) + container.useInstance(CoroutineCompatibilitySupport.DISABLED) } }