FIR: record and serialize the modifier "fun" for functional interface

This commit is contained in:
Jinseong Jeon
2020-06-05 15:00:03 -07:00
committed by Mikhail Glukhikh
parent 6a2fed33d3
commit 0d2552b0b6
24 changed files with 33 additions and 196 deletions
@@ -98,7 +98,7 @@ class FirElementSerializer private constructor(
regularClass?.isExternal == true,
regularClass?.isExpect == true,
regularClass?.isInline == true,
false // TODO: klass.isFun not supported yet
regularClass?.isFun == true
)
if (flags != builder.flags) {
builder.flags = flags
@@ -183,7 +183,7 @@ class Fir2IrClassifierStorage(
isExternal = regularClass.isExternal,
isInline = regularClass.isInline,
isExpect = regularClass.isExpect,
isFun = false // TODO FirRegularClass.isFun
isFun = regularClass.isFun
).apply {
metadata = FirMetadataSource.Class(regularClass, descriptor)
descriptor.bind(this)
@@ -382,6 +382,7 @@ class DeclarationsConverter(
isCompanion = modifiers.isCompanion() && classKind == ClassKind.OBJECT
isData = modifiers.isDataClass()
isInline = modifiers.isInlineClass()
isFun = modifiers.isFunctionalInterface()
}
buildRegularClass {
@@ -78,6 +78,10 @@ class Modifier(
return classModifiers.contains(ClassModifier.COMPANION)
}
fun isFunctionalInterface(): Boolean {
return classModifiers.contains(ClassModifier.FUN)
}
fun hasOverride(): Boolean {
return memberModifiers.contains(MemberModifier.OVERRIDE)
}
@@ -11,7 +11,8 @@ enum class ClassModifier {
DATA,
INLINE,
INNER,
COMPANION
COMPANION,
FUN
}
enum class MemberModifier {
@@ -670,6 +670,7 @@ class RawFirBuilder(
isCompanion = (classOrObject as? KtObjectDeclaration)?.isCompanion() == true
isData = classOrObject.hasModifier(DATA_KEYWORD)
isInline = classOrObject.hasModifier(INLINE_KEYWORD)
isFun = classOrObject.hasModifier(FUN_KEYWORD)
}
withCapturedTypeParameters {
if (!status.isInner) context.capturedTypeParameters = context.capturedTypeParameters.clear()
@@ -39,6 +39,7 @@ interface FirDeclarationStatus : FirElement {
val isStatic: Boolean
val isFromSealedClass: Boolean
val isFromEnumClass: Boolean
val isFun: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitDeclarationStatus(this, data)
}
@@ -38,6 +38,7 @@ interface FirResolvedDeclarationStatus : FirDeclarationStatus {
override val isStatic: Boolean
override val isFromSealedClass: Boolean
override val isFromEnumClass: Boolean
override val isFun: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedDeclarationStatus(this, data)
}
@@ -37,6 +37,7 @@ inline val FirRegularClass.isInner get() = status.isInner
inline val FirRegularClass.isCompanion get() = status.isCompanion
inline val FirRegularClass.isData get() = status.isData
inline val FirRegularClass.isInline get() = status.isInline
inline val FirRegularClass.isFun get() = status.isFun
inline val FirMemberDeclaration.modality get() = status.modality
inline val FirMemberDeclaration.visibility get() = status.visibility
inline val FirMemberDeclaration.allowsToHaveFakeOverride: Boolean
@@ -136,6 +136,12 @@ open class FirDeclarationStatusImpl(
this[FROM_ENUM] = value
}
override var isFun: Boolean
get() = this[FUN]
set(value) {
this[FUN] = value
}
private enum class Modifier(val mask: Int) {
EXPECT(0x1),
ACTUAL(0x2),
@@ -153,7 +159,8 @@ open class FirDeclarationStatusImpl(
SUSPEND(0x2000),
STATIC(0x4000),
FROM_SEALED(0x8000),
FROM_ENUM(0x10000)
FROM_ENUM(0x10000),
FUN(0x20000)
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
@@ -323,7 +323,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
generateBooleanFields(
"expect", "actual", "override", "operator", "infix", "inline", "tailRec",
"external", "const", "lateInit", "inner", "companion", "data", "suspend", "static",
"fromSealedClass", "fromEnumClass"
"fromSealedClass", "fromEnumClass", "fun"
)
}