diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index d0fb5342f6e..1f6111eaed9 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -548,6 +548,7 @@ class RawFirBuilder(val session: FirSession) { function.hasModifier(KtTokens.INLINE_KEYWORD), function.hasModifier(KtTokens.TAILREC_KEYWORD), function.hasModifier(KtTokens.EXTERNAL_KEYWORD), + function.hasModifier(KtTokens.SUSPEND_KEYWORD), function.receiverTypeReference.convertSafe(), if (function.hasBlockBody()) { typeReference.toFirOrUnitType() diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.kt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.kt index 59281f1b0bb..1416a08e3a7 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.kt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.kt @@ -1 +1,3 @@ -fun foo() {} \ No newline at end of file +fun foo() {} + +suspend fun bar() {} \ No newline at end of file diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.txt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.txt index e5f180a6f81..a66ed2df21d 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/simpleFun.txt @@ -1,3 +1,5 @@ FILE: simpleFun.kt public? final? function foo(): kotlin.Unit { } + public? final? suspend function bar(): kotlin.Unit { + } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 117e9c50031..6ffe6c83a96 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -170,6 +170,9 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { if (memberDeclaration.isExternal) { print("external ") } + if (memberDeclaration.isSuspend) { + print("suspend ") + } } else if (memberDeclaration is FirProperty) { if (memberDeclaration.isConst) { print("const ") diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt index 890d3d8d4a9..baccbe0b338 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt @@ -44,6 +44,8 @@ interface FirDeclarationStatus : FirElement { val isData: Boolean + val isSuspend: Boolean + override val psi: PsiElement? get() = null diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirNamedFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirNamedFunction.kt index 762e1884410..1227c6ad8b3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirNamedFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirNamedFunction.kt @@ -21,6 +21,8 @@ interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMember { val isExternal: Boolean get() = status.isExternal + val isSuspend: Boolean get() = status.isSuspend + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitNamedFunction(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt index 1a272d33e64..b37425bbf90 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt @@ -106,6 +106,12 @@ open class FirDeclarationStatusImpl( this[DATA] = value } + override var isSuspend: Boolean + get() = this[SUSPEND] + set(value) { + this[SUSPEND] = value + } + private enum class Modifier(val mask: Int) { EXPECT(0x1), ACTUAL(0x2), @@ -119,7 +125,8 @@ open class FirDeclarationStatusImpl( LATEINIT(0x200), INNER(0x400), COMPANION(0x800), - DATA(0x1000) + DATA(0x1000), + SUSPEND(0x2000) } fun resolved(visibility: Visibility, modality: Modality): FirDeclarationStatus { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt index f173a5805ea..5a27df2b96b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt @@ -32,6 +32,7 @@ class FirMemberFunctionImpl( isInline: Boolean, isTailRec: Boolean, isExternal: Boolean, + isSuspend: Boolean, receiverType: FirType?, returnType: FirType, override val body: FirBody? @@ -45,6 +46,7 @@ class FirMemberFunctionImpl( status.isInline = isInline status.isTailRec = isTailRec status.isExternal = isExternal + status.isSuspend = isSuspend } override val valueParameters = mutableListOf()