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