Skip to content

Commit 55111d5

Browse files
committed
Skip function body AST -> FIR conversion and only process contracts.
^KT-78422
1 parent b29b236 commit 55111d5

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
@@ -135,21 +135,23 @@ class LightTreeRawFirDeclarationBuilder(
135135
/**
136136
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseBlockExpression
137137
*/
138-
fun convertBlockExpression(block: LighterASTNode): FirBlock {
139-
return convertBlockExpressionWithoutBuilding(block).build()
138+
fun convertBlockExpression(block: LighterASTNode, generateHeaders: Boolean = false): FirBlock {
139+
return convertBlockExpressionWithoutBuilding(block, generateHeaders = generateHeaders).build()
140140
}
141141

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

2162-
return convertBlockExpression(block)
2164+
return convertBlockExpression(block, generateHeaders)
21632165
}
21642166

21652167
/**

0 commit comments

Comments
 (0)