@@ -135,21 +135,23 @@ class LightTreeRawFirDeclarationBuilder(
135
135
/* *
136
136
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseBlockExpression
137
137
*/
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()
140
140
}
141
141
142
- fun convertBlockExpressionWithoutBuilding (block : LighterASTNode , kind : KtFakeSourceElementKind ? = null): FirBlockBuilder {
142
+ fun convertBlockExpressionWithoutBuilding (block : LighterASTNode , kind : KtFakeSourceElementKind ? = null, generateHeaders : Boolean = false ): FirBlockBuilder {
143
143
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
+ }
153
155
}
154
156
}
155
157
return FirBlockBuilder ().apply {
@@ -2115,7 +2117,7 @@ class LightTreeRawFirDeclarationBuilder(
2115
2117
): Pair <FirBlock ?, FirContractDescription ?> {
2116
2118
return when {
2117
2119
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)
2119
2121
val contractDescription = runIf(allowLegacyContractDescription) {
2120
2122
val blockSource = block.source
2121
2123
val diagnostic = when {
@@ -2151,15 +2153,15 @@ class LightTreeRawFirDeclarationBuilder(
2151
2153
/* *
2152
2154
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseBlock
2153
2155
*/
2154
- fun convertBlock (block : LighterASTNode ? ): FirBlock {
2156
+ fun convertBlock (block : LighterASTNode ? , generateHeaders : Boolean = false ): FirBlock {
2155
2157
if (block == null ) return buildEmptyExpressionBlock()
2156
2158
if (block.tokenType != BLOCK ) {
2157
2159
return FirSingleExpressionBlock (
2158
2160
expressionConverter.getAsFirStatement(block)
2159
2161
)
2160
2162
}
2161
2163
2162
- return convertBlockExpression(block)
2164
+ return convertBlockExpression(block, generateHeaders )
2163
2165
}
2164
2166
2165
2167
/* *
0 commit comments