FIR: support suspend functions #KT-24084 Fixed

This commit is contained in:
Mikhail Glukhikh
2018-04-26 17:56:55 +03:00
parent 7aba441234
commit 7095182e2d
8 changed files with 23 additions and 2 deletions
@@ -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()
@@ -1 +1,3 @@
fun foo() {}
fun foo() {}
suspend fun bar() {}
@@ -1,3 +1,5 @@
FILE: simpleFun.kt
public? final? function foo(): kotlin.Unit {
}
public? final? suspend function bar(): kotlin.Unit {
}
@@ -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 ")
@@ -44,6 +44,8 @@ interface FirDeclarationStatus : FirElement {
val isData: Boolean
val isSuspend: Boolean
override val psi: PsiElement?
get() = null
@@ -21,6 +21,8 @@ interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMember {
val isExternal: Boolean get() = status.isExternal
val isSuspend: Boolean get() = status.isSuspend
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitNamedFunction(this, data)
@@ -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 {
@@ -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<FirValueParameter>()