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.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens.*
|
import org.jetbrains.kotlin.lexer.KtTokens.*
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.SpecialNames
|
||||||
|
|
||||||
class DeclarationsConverter(
|
class DeclarationsConverter(
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
@@ -102,16 +103,12 @@ class DeclarationsConverter(
|
|||||||
val firStatements = mutableListOf<FirStatement>()
|
val firStatements = mutableListOf<FirStatement>()
|
||||||
block.forEachChildren {
|
block.forEachChildren {
|
||||||
when (it.tokenType) {
|
when (it.tokenType) {
|
||||||
//TODO("not implemented")
|
|
||||||
BLOCK -> ""
|
|
||||||
|
|
||||||
CLASS -> firStatements += convertClass(it) as FirStatement
|
CLASS -> firStatements += convertClass(it) as FirStatement
|
||||||
FUN -> firStatements += convertFunctionDeclaration(it) as FirStatement
|
FUN -> firStatements += convertFunctionDeclaration(it) as FirStatement
|
||||||
PROPERTY -> firStatements += convertPropertyDeclaration(it) as FirStatement
|
PROPERTY -> firStatements += convertPropertyDeclaration(it) as FirStatement
|
||||||
TYPEALIAS -> firStatements += convertTypeAlias(it) as FirStatement
|
TYPEALIAS -> firStatements += convertTypeAlias(it) as FirStatement
|
||||||
OBJECT_DECLARATION -> firStatements += convertClass(it) as FirStatement
|
OBJECT_DECLARATION -> firStatements += convertClass(it) as FirStatement
|
||||||
CLASS_INITIALIZER -> firStatements += convertAnonymousInitializer(it) as FirStatement
|
CLASS_INITIALIZER -> firStatements += convertAnonymousInitializer(it) as FirStatement
|
||||||
|
|
||||||
else -> if (it.isExpression()) firStatements += expressionConverter.getAsFirExpression<FirStatement>(it)
|
else -> if (it.isExpression()) firStatements += expressionConverter.getAsFirExpression<FirStatement>(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -330,7 +327,7 @@ class DeclarationsConverter(
|
|||||||
/**
|
/**
|
||||||
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject
|
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject
|
||||||
*/
|
*/
|
||||||
private fun convertClass(classNode: LighterASTNode): FirDeclaration {
|
fun convertClass(classNode: LighterASTNode): FirDeclaration {
|
||||||
var modifiers = Modifier(session)
|
var modifiers = Modifier(session)
|
||||||
lateinit var classKind: ClassKind
|
lateinit var classKind: ClassKind
|
||||||
var identifier: String? = null
|
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.FirReference
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.builder.*
|
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.FirAnonymousFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousObjectImpl
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||||
@@ -83,6 +85,7 @@ class ExpressionsConverter(
|
|||||||
PARENTHESIZED, PROPERTY_DELEGATE, INDICES -> convertExpression(expression.getExpressionInParentheses())
|
PARENTHESIZED, PROPERTY_DELEGATE, INDICES -> convertExpression(expression.getExpressionInParentheses())
|
||||||
THIS_EXPRESSION -> convertThisExpression(expression)
|
THIS_EXPRESSION -> convertThisExpression(expression)
|
||||||
SUPER_EXPRESSION -> convertSuperExpression(expression)
|
SUPER_EXPRESSION -> convertSuperExpression(expression)
|
||||||
|
OBJECT_LITERAL -> convertObjectLiteral(expression)
|
||||||
|
|
||||||
FUN -> declarationsConverter.convertFunctionDeclaration(expression)
|
FUN -> declarationsConverter.convertFunctionDeclaration(expression)
|
||||||
else -> FirExpressionStub(session, null)
|
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
|
* @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.FirQualifierPartImpl
|
||||||
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
|
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.name.SpecialNames
|
||||||
|
|
||||||
class ClassWrapper(
|
class ClassWrapper(
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
@@ -25,10 +26,16 @@ class ClassWrapper(
|
|||||||
private val classKind: ClassKind,
|
private val classKind: ClassKind,
|
||||||
val hasPrimaryConstructor: Boolean,
|
val hasPrimaryConstructor: Boolean,
|
||||||
val hasSecondaryConstructor: Boolean,
|
val hasSecondaryConstructor: Boolean,
|
||||||
val delegatedSelfTypeRef: FirTypeRef,
|
var delegatedSelfTypeRef: FirTypeRef,
|
||||||
val delegatedSuperTypeRef: FirTypeRef,
|
val delegatedSuperTypeRef: FirTypeRef,
|
||||||
val superTypeCallEntry: MutableList<FirExpression>
|
val superTypeCallEntry: MutableList<FirExpression>
|
||||||
) {
|
) {
|
||||||
|
init {
|
||||||
|
if (className == SpecialNames.NO_NAME_PROVIDED) {
|
||||||
|
delegatedSelfTypeRef = delegatedSuperTypeRef
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun isObject(): Boolean {
|
private fun isObject(): Boolean {
|
||||||
return classKind == ClassKind.OBJECT
|
return classKind == ClassKind.OBJECT
|
||||||
}
|
}
|
||||||
|
|||||||
+21
@@ -258,4 +258,25 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
|
|||||||
visitLambdaArgumentExpression = true
|
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