Write object literal parsing (light tree to FIR)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
8dd72a5cf2
commit
26290746f3
+2
-5
@@ -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
|
||||
|
||||
+17
@@ -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
|
||||
}
|
||||
|
||||
+21
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user