@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.lightTree.converter
7
7
8
8
import com.intellij.lang.LighterASTNode
9
9
import com.intellij.psi.TokenType
10
- import com.intellij.util.containers.addIfNotNull
11
10
import com.intellij.util.diff.FlyweightCapableTreeStructure
12
11
import org.jetbrains.kotlin.*
13
12
import org.jetbrains.kotlin.ElementTypeUtils.isExpression
@@ -97,11 +96,11 @@ class LightTreeRawFirDeclarationBuilder(
97
96
packageDirective = convertPackageDirective(child).also { context.packageFqName = it.packageFqName }
98
97
}
99
98
IMPORT_LIST -> importList + = convertImportDirectives(child)
100
- CLASS -> firDeclarationList + = convertClass(child)
99
+ CLASS -> firDeclarationList + = convertClass(child, headerCompilationMode )
101
100
FUN -> firDeclarationList + = convertFunctionDeclaration(child) as FirDeclaration
102
101
KtNodeTypes .PROPERTY -> firDeclarationList + = convertPropertyDeclaration(child)
103
102
TYPEALIAS -> firDeclarationList + = convertTypeAlias(child)
104
- OBJECT_DECLARATION -> firDeclarationList + = convertClass(child)
103
+ OBJECT_DECLARATION -> firDeclarationList + = convertClass(child, headerCompilationMode )
105
104
DESTRUCTURING_DECLARATION -> {
106
105
val initializer = buildFirDestructuringDeclarationInitializer(child)
107
106
firDeclarationList + = buildErrorNonLocalDestructuringDeclaration(child.toFirSourceElement(), initializer)
@@ -140,11 +139,15 @@ class LightTreeRawFirDeclarationBuilder(
140
139
return convertBlockExpressionWithoutBuilding(block, generateHeaders = generateHeaders).build()
141
140
}
142
141
143
- fun convertBlockExpressionWithoutBuilding (block : LighterASTNode , kind : KtFakeSourceElementKind ? = null, generateHeaders : Boolean = false): FirBlockBuilder {
142
+ fun convertBlockExpressionWithoutBuilding (
143
+ block : LighterASTNode ,
144
+ kind : KtFakeSourceElementKind ? = null,
145
+ generateHeaders : Boolean = false
146
+ ): FirBlockBuilder {
144
147
val firStatements = block.forEachChildrenReturnList { node, container ->
145
148
if (! generateHeaders || container.isEmpty()) { // Take only the first statement which could be a contract for header generation.
146
149
when (node.tokenType) {
147
- CLASS , OBJECT_DECLARATION -> container + = convertClass(node) as FirStatement
150
+ CLASS , OBJECT_DECLARATION -> container + = convertClass(node, generateHeaders ) as FirStatement
148
151
FUN -> container + = convertFunctionDeclaration(node)
149
152
KtNodeTypes .PROPERTY -> container + = convertPropertyDeclaration(node) as FirStatement
150
153
DESTRUCTURING_DECLARATION -> container + =
@@ -461,7 +464,7 @@ class LightTreeRawFirDeclarationBuilder(
461
464
/* *
462
465
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject
463
466
*/
464
- private fun convertClass (classNode : LighterASTNode ): FirDeclaration {
467
+ private fun convertClass (classNode : LighterASTNode , generateHeaders : Boolean ): FirDeclaration {
465
468
var modifiers: ModifierList ? = null
466
469
var classKind: ClassKind = ClassKind .CLASS
467
470
var identifier: String? = null
@@ -471,6 +474,7 @@ class LightTreeRawFirDeclarationBuilder(
471
474
var classBody: LighterASTNode ? = null
472
475
var superTypeList: LighterASTNode ? = null
473
476
var typeParameterList: LighterASTNode ? = null
477
+ var headerMode = generateHeaders
474
478
classNode.forEachChildren {
475
479
when (it.tokenType) {
476
480
MODIFIER_LIST -> modifiers = convertModifierList(it, isInClass = true )
@@ -479,6 +483,9 @@ class LightTreeRawFirDeclarationBuilder(
479
483
}
480
484
481
485
val calculatedModifiers = modifiers ? : ModifierList ()
486
+ if (calculatedModifiers.isInlineClass()) {
487
+ headerMode = false
488
+ }
482
489
val className = identifier.nameAsSafeName(if (calculatedModifiers.isCompanion()) " Companion" else " " )
483
490
val isLocalWithinParent = classNode.getParent()?.elementType != CLASS_BODY && isClassLocal(classNode) { getParent() }
484
491
val classIsExpect = calculatedModifiers.hasExpect() || context.containerIsExpect
@@ -637,7 +644,7 @@ class LightTreeRawFirDeclarationBuilder(
637
644
638
645
// parse declarations
639
646
classBody?.let {
640
- addDeclarations(convertClassBody(it, classWrapper))
647
+ addDeclarations(convertClassBody(it, classWrapper, headerMode ))
641
648
}
642
649
643
650
// parse data class
@@ -923,10 +930,14 @@ class LightTreeRawFirDeclarationBuilder(
923
930
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassBody
924
931
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseEnumClassBody
925
932
*/
926
- private fun convertClassBody (classBody : LighterASTNode , classWrapper : ClassWrapper ? ): List <FirDeclaration > {
933
+ private fun convertClassBody (
934
+ classBody : LighterASTNode ,
935
+ classWrapper : ClassWrapper ? ,
936
+ generateHeaders : Boolean = false
937
+ ): List <FirDeclaration > {
927
938
val modifierLists = mutableListOf<LighterASTNode >()
928
939
val firDeclarations = classBody.forEachChildrenReturnList { node, container ->
929
- convertDeclarationFromClassBody(node, container, classWrapper, modifierLists)
940
+ convertDeclarationFromClassBody(node, container, classWrapper, modifierLists, generateHeaders )
930
941
}
931
942
932
943
convertDanglingModifierListsInClassBody(modifierLists, firDeclarations)
@@ -938,14 +949,15 @@ class LightTreeRawFirDeclarationBuilder(
938
949
container : MutableList <FirDeclaration >,
939
950
classWrapper : ClassWrapper ? ,
940
951
modifierLists : MutableList <LighterASTNode >,
952
+ generateHeaders : Boolean = false
941
953
) {
942
954
when (node.tokenType) {
943
955
ENUM_ENTRY -> container + = convertEnumEntry(node, classWrapper!! )
944
- CLASS -> container + = convertClass(node)
956
+ CLASS -> container + = convertClass(node, generateHeaders )
945
957
FUN -> container + = convertFunctionDeclaration(node) as FirDeclaration
946
958
KtNodeTypes .PROPERTY -> container + = convertPropertyDeclaration(node, classWrapper)
947
959
TYPEALIAS -> container + = convertTypeAlias(node)
948
- OBJECT_DECLARATION -> container + = convertClass(node)
960
+ OBJECT_DECLARATION -> container + = convertClass(node, generateHeaders )
949
961
CLASS_INITIALIZER -> container + = convertAnonymousInitializer(node, classWrapper!! .classBuilder.ownerRegularOrAnonymousObjectSymbol) // anonymousInitializer
950
962
SECONDARY_CONSTRUCTOR -> container + = convertSecondaryConstructor(node, classWrapper!! )
951
963
MODIFIER_LIST -> modifierLists + = node
0 commit comments