Remove obsolete experimental coroutines support
in compiler.
This commit is contained in:
-2
@@ -26,6 +26,4 @@ class CompilerDeserializationConfiguration(languageVersionSettings: LanguageVers
|
||||
override val isJvmPackageNameSupported = languageVersionSettings.supportsFeature(LanguageFeature.JvmPackageName)
|
||||
|
||||
override val readDeserializedContracts: Boolean = languageVersionSettings.supportsFeature(LanguageFeature.ReadDeserializedContracts)
|
||||
|
||||
override val releaseCoroutines: Boolean = languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
||||
}
|
||||
|
||||
+15
-30
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.coroutines.hasSuspendFunctionType
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtCodeFragment
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
@@ -33,20 +34,17 @@ import org.jetbrains.kotlin.types.typeUtil.supertypes
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
val COROUTINE_CONTEXT_1_2_20_FQ_NAME =
|
||||
StandardNames.COROUTINES_INTRINSICS_PACKAGE_FQ_NAME_EXPERIMENTAL.child(Name.identifier("coroutineContext"))
|
||||
val COROUTINE_CONTEXT_FQ_NAME =
|
||||
StandardNames.COROUTINES_PACKAGE_FQ_NAME.child(Name.identifier("coroutineContext"))
|
||||
|
||||
val COROUTINE_CONTEXT_1_2_30_FQ_NAME =
|
||||
StandardNames.COROUTINES_PACKAGE_FQ_NAME_EXPERIMENTAL.child(Name.identifier("coroutineContext"))
|
||||
fun FqName.isBuiltInCoroutineContext(): Boolean =
|
||||
this == StandardNames.COROUTINES_PACKAGE_FQ_NAME.child(Name.identifier("coroutineContext"))
|
||||
|
||||
val COROUTINE_CONTEXT_1_3_FQ_NAME =
|
||||
StandardNames.COROUTINES_PACKAGE_FQ_NAME_RELEASE.child(Name.identifier("coroutineContext"))
|
||||
fun FunctionDescriptor.isBuiltInCoroutineContext() =
|
||||
(this as? PropertyGetterDescriptor)?.correspondingProperty?.fqNameSafe?.isBuiltInCoroutineContext() == true
|
||||
|
||||
fun FunctionDescriptor.isBuiltInCoroutineContext(languageVersionSettings: LanguageVersionSettings) =
|
||||
(this as? PropertyGetterDescriptor)?.correspondingProperty?.fqNameSafe?.isBuiltInCoroutineContext(languageVersionSettings) == true
|
||||
|
||||
fun PropertyDescriptor.isBuiltInCoroutineContext(languageVersionSettings: LanguageVersionSettings) =
|
||||
this.fqNameSafe.isBuiltInCoroutineContext(languageVersionSettings)
|
||||
fun PropertyDescriptor.isBuiltInCoroutineContext() =
|
||||
fqNameSafe.isBuiltInCoroutineContext()
|
||||
|
||||
private val ALLOWED_SCOPE_KINDS = setOf(LexicalScopeKind.FUNCTION_INNER_SCOPE, LexicalScopeKind.FUNCTION_HEADER_FOR_DESTRUCTURING)
|
||||
|
||||
@@ -60,11 +58,7 @@ object CoroutineSuspendCallChecker : CallChecker {
|
||||
val descriptor = resolvedCall.candidateDescriptor
|
||||
when (descriptor) {
|
||||
is FunctionDescriptor -> if (!descriptor.isSuspend) return
|
||||
is PropertyDescriptor -> when (descriptor.fqNameSafe) {
|
||||
COROUTINE_CONTEXT_1_2_20_FQ_NAME, COROUTINE_CONTEXT_1_2_30_FQ_NAME, COROUTINE_CONTEXT_1_3_FQ_NAME -> {
|
||||
}
|
||||
else -> return
|
||||
}
|
||||
is PropertyDescriptor -> if (descriptor.fqNameSafe != COROUTINE_CONTEXT_FQ_NAME) return
|
||||
else -> return
|
||||
}
|
||||
|
||||
@@ -92,17 +86,6 @@ object CoroutineSuspendCallChecker : CallChecker {
|
||||
context.trace.report(Errors.UNSUPPORTED.on(reportOn, "suspend function calls in a context of default parameter value"))
|
||||
}
|
||||
|
||||
if ((descriptor.fqNameSafe == COROUTINE_CONTEXT_1_2_20_FQ_NAME || descriptor.fqNameSafe == COROUTINE_CONTEXT_1_2_30_FQ_NAME) &&
|
||||
context.languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
||||
) {
|
||||
context.trace.report(
|
||||
Errors.UNSUPPORTED.on(
|
||||
reportOn,
|
||||
"experimental coroutineContext of release coroutine: use kotlin.coroutines.coroutineContext instead"
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
context.trace.record(
|
||||
BindingContext.ENCLOSING_SUSPEND_FUNCTION_FOR_SUSPEND_FUNCTION_CALL,
|
||||
resolvedCall.call,
|
||||
@@ -169,8 +152,10 @@ fun checkCoroutinesFeature(languageVersionSettings: LanguageVersionSettings, dia
|
||||
}
|
||||
}
|
||||
|
||||
fun KotlinType.isRestrictsSuspensionReceiver(languageVersionSettings: LanguageVersionSettings) = (listOf(this) + this.supertypes()).any {
|
||||
it.constructor.declarationDescriptor?.annotations?.hasAnnotation(languageVersionSettings.restrictsSuspensionFqName()) == true
|
||||
fun KotlinType.isRestrictsSuspensionReceiver() = (listOf(this) + this.supertypes()).any {
|
||||
it.constructor.declarationDescriptor?.annotations?.hasAnnotation(
|
||||
StandardNames.COROUTINES_PACKAGE_FQ_NAME.child(Name.identifier("RestrictsSuspension"))
|
||||
) == true
|
||||
}
|
||||
|
||||
private fun checkRestrictsSuspension(
|
||||
@@ -179,7 +164,7 @@ private fun checkRestrictsSuspension(
|
||||
reportOn: PsiElement,
|
||||
context: CallCheckerContext
|
||||
) {
|
||||
fun ReceiverValue.isRestrictsSuspensionReceiver() = type.isRestrictsSuspensionReceiver(context.languageVersionSettings)
|
||||
fun ReceiverValue.isRestrictsSuspensionReceiver() = type.isRestrictsSuspensionReceiver()
|
||||
|
||||
infix fun ReceiverValue.sameInstance(other: ReceiverValue?): Boolean {
|
||||
if (other == null) return false
|
||||
|
||||
-2
@@ -47,7 +47,6 @@ import org.jetbrains.kotlin.resolve.constants.ArrayValue
|
||||
import org.jetbrains.kotlin.resolve.constants.EnumValue
|
||||
import org.jetbrains.kotlin.resolve.constants.KClassValue
|
||||
import org.jetbrains.kotlin.resolve.constants.StringValue
|
||||
import org.jetbrains.kotlin.resolve.deprecation.CoroutineCompatibilitySupport
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationSettings
|
||||
@@ -338,7 +337,6 @@ class ExperimentalUsageChecker(project: Project) : CallChecker {
|
||||
val deprecationResolver = DeprecationResolver(
|
||||
LockBasedStorageManager("ExperimentalUsageChecker"),
|
||||
languageVersionSettings,
|
||||
CoroutineCompatibilitySupport.ENABLED,
|
||||
DeprecationSettings.Default
|
||||
)
|
||||
|
||||
|
||||
@@ -132,17 +132,6 @@ internal data class DeprecatedByOverridden(private val deprecations: Collection<
|
||||
"Overrides deprecated member in '${DescriptorUtils.getContainingClass(target)!!.fqNameSafe.asString()}'"
|
||||
}
|
||||
|
||||
internal data class DeprecatedExperimentalCoroutine(
|
||||
override val target: DeclarationDescriptor,
|
||||
override val deprecationLevel: DeprecationLevelValue
|
||||
) : Deprecation {
|
||||
override val message: String? =
|
||||
if (deprecationLevel == WARNING)
|
||||
"Experimental coroutines support will be dropped in 1.4"
|
||||
else
|
||||
"Experimental coroutine cannot be used with API version 1.3"
|
||||
}
|
||||
|
||||
internal data class DeprecatedOperatorMod(
|
||||
val languageVersionSettings: LanguageVersionSettings,
|
||||
val currentDeprecation: Deprecation
|
||||
|
||||
@@ -27,8 +27,6 @@ import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor.CoroutinesCompatibilityMode.COMPATIBLE
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor.CoroutinesCompatibilityMode.NEEDS_WRAPPER
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
@@ -38,7 +36,6 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
class DeprecationResolver(
|
||||
storageManager: StorageManager,
|
||||
private val languageVersionSettings: LanguageVersionSettings,
|
||||
private val coroutineCompatibilitySupport: CoroutineCompatibilitySupport,
|
||||
private val deprecationSettings: DeprecationSettings
|
||||
) {
|
||||
private val deprecations = storageManager.createMemoizedFunction { descriptor: DeclarationDescriptor ->
|
||||
@@ -226,7 +223,6 @@ class DeprecationResolver(
|
||||
for (deprecation in getDeprecationByVersionRequirement(this)) {
|
||||
result.add(deprecation)
|
||||
}
|
||||
getDeprecationByCoroutinesVersion(this)?.let(result::add)
|
||||
getDeprecationFromUserData(this)?.let(result::add)
|
||||
}
|
||||
|
||||
@@ -242,19 +238,6 @@ class DeprecationResolver(
|
||||
descriptor.valueParameters.singleOrNull()?.type?.let(KotlinBuiltIns::isInt) == true &&
|
||||
languageVersionSettings.apiVersion < ApiVersion.KOTLIN_1_3
|
||||
|
||||
private fun getDeprecationByCoroutinesVersion(target: DeclarationDescriptor): DeprecatedExperimentalCoroutine? {
|
||||
if (target !is DeserializedMemberDescriptor) return null
|
||||
|
||||
target.coroutinesExperimentalCompatibilityMode.let { mode ->
|
||||
return when {
|
||||
mode == COMPATIBLE -> null
|
||||
mode == NEEDS_WRAPPER && coroutineCompatibilitySupport.enabled ->
|
||||
DeprecatedExperimentalCoroutine(target, DeprecationLevelValue.WARNING)
|
||||
else -> DeprecatedExperimentalCoroutine(target, DeprecationLevelValue.ERROR)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getDeprecationFromUserData(target: DeclarationDescriptor): Deprecation? =
|
||||
target.safeAs<CallableDescriptor>()?.getUserData(DEPRECATED_FUNCTION_KEY)
|
||||
|
||||
|
||||
@@ -73,18 +73,6 @@ internal fun createDeprecationDiagnostic(
|
||||
}
|
||||
}
|
||||
|
||||
@DefaultImplementation(CoroutineCompatibilitySupport::class)
|
||||
class CoroutineCompatibilitySupport private constructor(val enabled: Boolean) : PlatformSpecificExtension<CoroutineCompatibilitySupport>{
|
||||
@Suppress("unused")
|
||||
constructor() : this(true)
|
||||
|
||||
companion object {
|
||||
val ENABLED = CoroutineCompatibilitySupport(true)
|
||||
|
||||
val DISABLED = CoroutineCompatibilitySupport(false)
|
||||
}
|
||||
}
|
||||
|
||||
@DefaultImplementation(DeprecationSettings.Default::class)
|
||||
interface DeprecationSettings {
|
||||
fun propagatedToOverrides(deprecationAnnotation: AnnotationDescriptor): Boolean
|
||||
|
||||
+1
-1
@@ -700,7 +700,7 @@ class DoubleColonExpressionResolver(
|
||||
) {
|
||||
val descriptor =
|
||||
if (resolutionResults?.isSingleResult == true) resolutionResults.resultingDescriptor else null
|
||||
if (descriptor is PropertyDescriptor && descriptor.isBuiltInCoroutineContext(languageVersionSettings)) {
|
||||
if (descriptor is PropertyDescriptor && descriptor.isBuiltInCoroutineContext()) {
|
||||
context.trace.report(UNSUPPORTED.on(expression.callableReference, "Callable reference to suspend property"))
|
||||
} else if (descriptor is FunctionDescriptor && descriptor.isSuspend
|
||||
&& !context.languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
||||
|
||||
Reference in New Issue
Block a user