Skip to content

Commit 5a2b31c

Browse files
committed
Skip function body AST -> FIR conversion and only process contracts.
^KT-78422
1 parent abfd398 commit 5a2b31c

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -136,21 +136,23 @@ class LightTreeRawFirDeclarationBuilder(
136136
/**
137137
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseBlockExpression
138138
*/
139-
fun convertBlockExpression(block: LighterASTNode): FirBlock {
140-
return convertBlockExpressionWithoutBuilding(block).build()
139+
fun convertBlockExpression(block: LighterASTNode, generateHeaders: Boolean = false): FirBlock {
140+
return convertBlockExpressionWithoutBuilding(block, generateHeaders = generateHeaders).build()
141141
}
142142

143-
fun convertBlockExpressionWithoutBuilding(block: LighterASTNode, kind: KtFakeSourceElementKind? = null): FirBlockBuilder {
143+
fun convertBlockExpressionWithoutBuilding(block: LighterASTNode, kind: KtFakeSourceElementKind? = null, generateHeaders: Boolean = false): FirBlockBuilder {
144144
val firStatements = block.forEachChildrenReturnList { node, container ->
145-
when (node.tokenType) {
146-
CLASS, OBJECT_DECLARATION -> container += convertClass(node) as FirStatement
147-
FUN -> container += convertFunctionDeclaration(node)
148-
KtNodeTypes.PROPERTY -> container += convertPropertyDeclaration(node) as FirStatement
149-
DESTRUCTURING_DECLARATION -> container +=
150-
convertDestructingDeclaration(node).toFirDestructingDeclaration(this, baseModuleData)
151-
TYPEALIAS -> container += convertTypeAlias(node) as FirStatement
152-
CLASS_INITIALIZER -> shouldNotBeCalled("CLASS_INITIALIZER expected to be processed during class body conversion")
153-
else -> if (node.isExpression()) container += expressionConverter.getAsFirStatement(node)
145+
if (!generateHeaders || container.isEmpty()) { // Take only the first statement which could be a contract for header generation.
146+
when (node.tokenType) {
147+
CLASS, OBJECT_DECLARATION -> container += convertClass(node) as FirStatement
148+
FUN -> container += convertFunctionDeclaration(node)
149+
KtNodeTypes.PROPERTY -> container += convertPropertyDeclaration(node) as FirStatement
150+
DESTRUCTURING_DECLARATION -> container +=
151+
convertDestructingDeclaration(node).toFirDestructingDeclaration(this, baseModuleData)
152+
TYPEALIAS -> container += convertTypeAlias(node) as FirStatement
153+
CLASS_INITIALIZER -> shouldNotBeCalled("CLASS_INITIALIZER expected to be processed during class body conversion")
154+
else -> if (node.isExpression()) container += expressionConverter.getAsFirStatement(node)
155+
}
154156
}
155157
}
156158
return FirBlockBuilder().apply {
@@ -2116,7 +2118,7 @@ class LightTreeRawFirDeclarationBuilder(
21162118
): Pair<FirBlock?, FirContractDescription?> {
21172119
return when {
21182120
blockNode != null -> {
2119-
val block = convertBlock(blockNode) // We might be able to process only the contract statement in the body.
2121+
val block = convertBlock(blockNode, generateHeaders)
21202122
val contractDescription = runIf(allowLegacyContractDescription) {
21212123
val blockSource = block.source
21222124
val diagnostic = when {
@@ -2152,15 +2154,15 @@ class LightTreeRawFirDeclarationBuilder(
21522154
/**
21532155
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseBlock
21542156
*/
2155-
fun convertBlock(block: LighterASTNode?): FirBlock {
2157+
fun convertBlock(block: LighterASTNode?, generateHeaders: Boolean = false): FirBlock {
21562158
if (block == null) return buildEmptyExpressionBlock()
21572159
if (block.tokenType != BLOCK) {
21582160
return FirSingleExpressionBlock(
21592161
expressionConverter.getAsFirStatement(block)
21602162
)
21612163
}
21622164

2163-
return convertBlockExpression(block)
2165+
return convertBlockExpression(block, generateHeaders)
21642166
}
21652167

21662168
/**

0 commit comments

Comments
 (0)