diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index ff8b5c33180..6c777d8f567 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -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() 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(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 diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 0ae36fb9d7c..10e4e5e6cff 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -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 */ diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt index a9650b3e259..6a41c227f2f 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt @@ -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 ) { + init { + if (className == SpecialNames.NO_NAME_PROVIDED) { + delegatedSelfTypeRef = delegatedSuperTypeRef + } + } + private fun isObject(): Boolean { return classKind == ClassKind.OBJECT } diff --git a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt index 5ab87d37664..8138de19753 100644 --- a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt +++ b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt @@ -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 + ) + } }