diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt index 4b41bd3f883..f5b1d2c7a5c 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt @@ -52,7 +52,7 @@ class LightTree2Fir( } fun buildFirFile(file: File): FirFile { - val code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() + val code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true) return buildFirFile(code, file.name) } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt index d383fb15399..d3a94e3be12 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt @@ -21,12 +21,13 @@ import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.name.Name import kotlin.contracts.ExperimentalContracts -open class BaseConverter( +abstract class BaseConverter( baseSession: FirSession, val tree: FlyweightCapableTreeStructure, - val offset: Int, context: Context = Context() ) : BaseFirBuilder(baseSession, context) { + abstract val offset: Int + protected val implicitType = buildImplicitTypeRef() override fun LighterASTNode.toFirSourceElement(kind: FirFakeSourceElementKind?): FirLightSourceElement { @@ -175,4 +176,4 @@ open class BaseConverter( return container } -} \ No newline at end of file +} diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index dedd0d5d0e7..7def4ad4f41 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -65,8 +65,22 @@ class DeclarationsConverter( tree: FlyweightCapableTreeStructure, offset: Int = 0, context: Context = Context() -) : BaseConverter(session, tree, offset, context) { - private val expressionConverter = ExpressionsConverter(session, stubMode, tree, this, offset + 1, context) +) : BaseConverter(session, tree, context) { + @set:PrivateForInline + override var offset: Int = offset + + @OptIn(PrivateForInline::class) + inline fun withOffset(newOffset: Int, block: () -> R): R { + val oldOffset = offset + offset = newOffset + return try { + block() + } finally { + offset = oldOffset + } + } + + private val expressionConverter = ExpressionsConverter(session, stubMode, tree, this, context) /** * [org.jetbrains.kotlin.parsing.KotlinParsing.parseFile] diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index f28ffd57073..affd7d14d44 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -50,9 +50,10 @@ class ExpressionsConverter( private val stubMode: Boolean, tree: FlyweightCapableTreeStructure, private val declarationsConverter: DeclarationsConverter, - offset: Int, context: Context = Context() -) : BaseConverter(session, tree, offset, context) { +) : BaseConverter(session, tree, context) { + override val offset: Int + get() = declarationsConverter.offset inline fun getAsFirExpression(expression: LighterASTNode?, errorReason: String = ""): R { return expression?.let { @@ -68,8 +69,10 @@ class ExpressionsConverter( return when (expression.tokenType) { LAMBDA_EXPRESSION -> { val lambdaTree = LightTree2Fir.buildLightTreeLambdaExpression(expression.asText) - ExpressionsConverter(baseSession, stubMode, lambdaTree, declarationsConverter, offset, context) - .convertLambdaExpression(lambdaTree.root) + declarationsConverter.withOffset(offset + expression.startOffset) { + ExpressionsConverter(baseSession, stubMode, lambdaTree, declarationsConverter, context) + .convertLambdaExpression(lambdaTree.root) + } } BINARY_EXPRESSION -> convertBinaryExpression(expression) BINARY_WITH_TYPE -> convertBinaryWithTypeRHSExpression(expression) { @@ -172,22 +175,24 @@ class ExpressionsConverter( } body = if (block != null) { - declarationsConverter.convertBlockExpressionWithoutBuilding(block!!).apply { - if (statements.isEmpty()) { - statements.add( - buildReturnExpression { - source = expressionSource - this.target = target - result = buildUnitExpression { source = expressionSource } - } - ) - } - if (destructuringBlock is FirBlock) { - for ((index, statement) in destructuringBlock.statements.withIndex()) { - statements.add(index, statement) + declarationsConverter.withOffset(expressionSource.startOffset) { + declarationsConverter.convertBlockExpressionWithoutBuilding(block!!).apply { + if (statements.isEmpty()) { + statements.add( + buildReturnExpression { + source = expressionSource + this.target = target + result = buildUnitExpression { source = expressionSource } + } + ) } - } - }.build() + if (destructuringBlock is FirBlock) { + for ((index, statement) in destructuringBlock.statements.withIndex()) { + statements.add(index, statement) + } + } + }.build() + } } else { buildSingleExpressionBlock(buildErrorExpression(null, ConeSimpleDiagnostic("Lambda has no body", DiagnosticKind.Syntax))) }