K2: handle suspend anonymous functions properly in various compiler parts
#KT-58332 Fixed
This commit is contained in:
committed by
Space Team
parent
aec0def5ca
commit
0906258d03
+3
-7
@@ -59,6 +59,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
|
||||
override lateinit var moduleData: FirModuleData
|
||||
override lateinit var origin: FirDeclarationOrigin
|
||||
override var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
|
||||
override var status: FirDeclarationStatus = FirResolvedDeclarationStatusImpl.DEFAULT_STATUS_FOR_STATUSLESS_DECLARATIONS
|
||||
override lateinit var returnTypeRef: FirTypeRef
|
||||
var receiverParameter: FirReceiverParameter? = null
|
||||
override var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider
|
||||
@@ -86,6 +87,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
|
||||
moduleData,
|
||||
origin,
|
||||
attributes,
|
||||
status,
|
||||
returnTypeRef,
|
||||
receiverParameter,
|
||||
deprecationsProvider,
|
||||
@@ -107,13 +109,6 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Deprecated("Modification of 'status' has no impact for FirAnonymousFunctionBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var status: FirDeclarationStatus
|
||||
get() = throw IllegalStateException()
|
||||
set(_) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
@@ -136,6 +131,7 @@ inline fun buildAnonymousFunctionCopy(original: FirAnonymousFunction, init: FirA
|
||||
copyBuilder.moduleData = original.moduleData
|
||||
copyBuilder.origin = original.origin
|
||||
copyBuilder.attributes = original.attributes.copy()
|
||||
copyBuilder.status = original.status
|
||||
copyBuilder.returnTypeRef = original.returnTypeRef
|
||||
copyBuilder.receiverParameter = original.receiverParameter
|
||||
copyBuilder.deprecationsProvider = original.deprecationsProvider
|
||||
|
||||
+1
-3
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.InlineStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.asResolveState
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
@@ -50,6 +49,7 @@ internal class FirAnonymousFunctionImpl(
|
||||
override val moduleData: FirModuleData,
|
||||
override val origin: FirDeclarationOrigin,
|
||||
override val attributes: FirDeclarationAttributes,
|
||||
override var status: FirDeclarationStatus,
|
||||
override var returnTypeRef: FirTypeRef,
|
||||
override var receiverParameter: FirReceiverParameter?,
|
||||
override var deprecationsProvider: DeprecationsProvider,
|
||||
@@ -69,8 +69,6 @@ internal class FirAnonymousFunctionImpl(
|
||||
override val typeParameters: MutableList<FirTypeParameter>,
|
||||
override var typeRef: FirTypeRef,
|
||||
) : FirAnonymousFunction() {
|
||||
override var status: FirDeclarationStatus = FirResolvedDeclarationStatusImpl.DEFAULT_STATUS_FOR_STATUSLESS_DECLARATIONS
|
||||
|
||||
init {
|
||||
symbol.bind(this)
|
||||
@OptIn(ResolveStateAccess::class)
|
||||
|
||||
+5
@@ -23,6 +23,11 @@ class FirResolvedDeclarationStatusImpl(
|
||||
Modality.FINAL,
|
||||
EffectiveVisibility.Public
|
||||
)
|
||||
val DEFAULT_STATUS_FOR_SUSPEND_FUNCTION_EXPRESSION = FirResolvedDeclarationStatusImpl(
|
||||
Visibilities.Local,
|
||||
Modality.FINAL,
|
||||
EffectiveVisibility.Public
|
||||
).apply { isSuspend = true }
|
||||
}
|
||||
|
||||
internal constructor(
|
||||
|
||||
@@ -96,4 +96,10 @@ class FirAllModifierRenderer : FirModifierRenderer() {
|
||||
renderModifier("external")
|
||||
}
|
||||
}
|
||||
|
||||
override fun renderModifiers(anonymousFunction: FirAnonymousFunction) {
|
||||
if (anonymousFunction.isSuspend) {
|
||||
renderModifier("suspend")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ abstract class FirModifierRenderer {
|
||||
abstract fun renderModifiers(backingField: FirBackingField)
|
||||
abstract fun renderModifiers(constructor: FirConstructor)
|
||||
abstract fun renderModifiers(propertyAccessor: FirPropertyAccessor)
|
||||
abstract fun renderModifiers(anonymousFunction: FirAnonymousFunction)
|
||||
open fun renderModifiers(valueParameter: FirValueParameter) {
|
||||
if (valueParameter.isCrossinline) {
|
||||
renderModifier("crossinline")
|
||||
|
||||
@@ -57,4 +57,10 @@ class FirPartialModifierRenderer : FirModifierRenderer() {
|
||||
|
||||
override fun renderModifiers(propertyAccessor: FirPropertyAccessor) {
|
||||
}
|
||||
|
||||
override fun renderModifiers(anonymousFunction: FirAnonymousFunction) {
|
||||
if (anonymousFunction.isSuspend) {
|
||||
renderModifier("suspend")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -388,6 +388,7 @@ class FirRenderer(
|
||||
|
||||
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
|
||||
annotationRenderer?.render(anonymousFunction)
|
||||
modifierRenderer?.renderModifiers(anonymousFunction)
|
||||
declarationRenderer?.render(anonymousFunction)
|
||||
print(" ")
|
||||
val receiverParameter = anonymousFunction.receiverParameter
|
||||
|
||||
+2
-1
@@ -271,8 +271,9 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
||||
defaultNull("invocationKind", "label", "body", "controlFlowGraphReference")
|
||||
default("inlineStatus", "InlineStatus.Unknown")
|
||||
default("contractDescription", "FirEmptyContractDescription")
|
||||
default("status", "FirResolvedDeclarationStatusImpl.DEFAULT_STATUS_FOR_STATUSLESS_DECLARATIONS")
|
||||
withCopy()
|
||||
useTypes(emptyContractDescriptionType)
|
||||
useTypes(emptyContractDescriptionType, resolvedDeclarationStatusImport)
|
||||
}
|
||||
|
||||
builder(propertyAccessor) {
|
||||
|
||||
+1
-2
@@ -565,7 +565,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
impl(contractElementDeclaration)
|
||||
|
||||
val implementationsWithoutStatusAndTypeParameters = listOf(
|
||||
"FirAnonymousFunctionImpl",
|
||||
"FirValueParameterImpl",
|
||||
"FirDefaultSetterValueParameter",
|
||||
"FirErrorPropertyImpl",
|
||||
@@ -582,7 +581,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
|
||||
configureFieldInAllImplementations(
|
||||
"typeParameters",
|
||||
implementationPredicate = { it.type != "FirAnonymousFunctionImpl" && it.type in implementationsWithoutStatusAndTypeParameters }
|
||||
implementationPredicate = { it.type in implementationsWithoutStatusAndTypeParameters }
|
||||
) {
|
||||
defaultEmptyList(it)
|
||||
useTypes(resolvedDeclarationStatusImplType)
|
||||
|
||||
+2
-1
@@ -9,4 +9,5 @@ import org.jetbrains.kotlin.fir.tree.generator.model.ArbitraryImportable
|
||||
|
||||
val phaseAsResolveStateExtentionImport = ArbitraryImportable("org.jetbrains.kotlin.fir.declarations", "asResolveState")
|
||||
val resolvePhaseExtensionImport = ArbitraryImportable("org.jetbrains.kotlin.fir.declarations", "resolvePhase")
|
||||
val resolveStateAccessImport = ArbitraryImportable("org.jetbrains.kotlin.fir.declarations", "ResolveStateAccess")
|
||||
val resolveStateAccessImport = ArbitraryImportable("org.jetbrains.kotlin.fir.declarations", "ResolveStateAccess")
|
||||
val resolvedDeclarationStatusImport = ArbitraryImportable("org.jetbrains.kotlin.fir.declarations.impl", "FirResolvedDeclarationStatusImpl")
|
||||
Reference in New Issue
Block a user