Write object literal parsing (light tree to FIR)

This commit is contained in:
Ivan Cilcic
2019-07-18 13:12:30 +03:00
committed by Mikhail Glukhikh
parent 8dd72a5cf2
commit 26290746f3
4 changed files with 48 additions and 6 deletions
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.SpecialNames
class DeclarationsConverter(
private val session: FirSession,
@@ -102,16 +103,12 @@ class DeclarationsConverter(
val firStatements = mutableListOf<FirStatement>()
block.forEachChildren {
when (it.tokenType) {
//TODO("not implemented")
BLOCK -> ""
CLASS -> firStatements += convertClass(it) as FirStatement
FUN -> firStatements += convertFunctionDeclaration(it) as FirStatement
PROPERTY -> firStatements += convertPropertyDeclaration(it) as FirStatement
TYPEALIAS -> firStatements += convertTypeAlias(it) as FirStatement
OBJECT_DECLARATION -> firStatements += convertClass(it) as FirStatement
CLASS_INITIALIZER -> firStatements += convertAnonymousInitializer(it) as FirStatement
else -> if (it.isExpression()) firStatements += expressionConverter.getAsFirExpression<FirStatement>(it)
}
}
@@ -330,7 +327,7 @@ class DeclarationsConverter(
/**
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject
*/
private fun convertClass(classNode: LighterASTNode): FirDeclaration {
fun convertClass(classNode: LighterASTNode): FirDeclaration {
var modifiers = Modifier(session)
lateinit var classKind: ClassKind
var identifier: String? = null
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.builder.*
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousObjectImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.*
@@ -83,6 +85,7 @@ class ExpressionsConverter(
PARENTHESIZED, PROPERTY_DELEGATE, INDICES -> convertExpression(expression.getExpressionInParentheses())
THIS_EXPRESSION -> convertThisExpression(expression)
SUPER_EXPRESSION -> convertSuperExpression(expression)
OBJECT_LITERAL -> convertObjectLiteral(expression)
FUN -> declarationsConverter.convertFunctionDeclaration(expression)
else -> FirExpressionStub(session, null)
@@ -695,6 +698,20 @@ class ExpressionsConverter(
}
}
/**
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseObjectLiteral
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitObjectLiteralExpression
*/
private fun convertObjectLiteral(objectLiteral: LighterASTNode): FirElement {
val firObject = declarationsConverter.convertClass(objectLiteral.getChildNodesByType(OBJECT_DECLARATION).first()) as FirClass
return FirAnonymousObjectImpl(session, null).apply {
annotations += firObject.annotations
superTypeRefs += firObject.superTypeRefs
this.typeRef = superTypeRefs.first()
declarations += firObject.declarations
}
}
/**
* @see org.jetbrains.kotlin.fir.builder.ConversionUtilsKt.initializeLValue
*/
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.types.FirUserTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
class ClassWrapper(
private val session: FirSession,
@@ -25,10 +26,16 @@ class ClassWrapper(
private val classKind: ClassKind,
val hasPrimaryConstructor: Boolean,
val hasSecondaryConstructor: Boolean,
val delegatedSelfTypeRef: FirTypeRef,
var delegatedSelfTypeRef: FirTypeRef,
val delegatedSuperTypeRef: FirTypeRef,
val superTypeCallEntry: MutableList<FirExpression>
) {
init {
if (className == SpecialNames.NO_NAME_PROVIDED) {
delegatedSelfTypeRef = delegatedSuperTypeRef
}
}
private fun isObject(): Boolean {
return classKind == ClassKind.OBJECT
}
@@ -258,4 +258,25 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
visitLambdaArgumentExpression = true
)
}
fun testAnonymousObject() {
compare(
stubMode = false,
visitAnonymousFunction = true,
visitLambdaExpression = true,
visitNamedFunction = true,
visitMemberDeclaration = true,
visitAnnotation = true,
visitTypeOperatorCall = true,
visitArrayOfCall = true,
visitFunctionCall = true,
visitGetClassCall = true,
visitReturnExpression = true,
visitConstExpression = true,
visitQualifiedAccessExpression = true,
visitCallableReferenceAccess = true,
visitLambdaArgumentExpression = true,
visitAnonymousObject = true
)
}
}