From 86e7faf63965ac76a999e918517ee844247fe199 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 23 Mar 2020 20:00:04 +0300 Subject: [PATCH] [FIR] Add start offset and end offset to FirSourceElement --- .../fir/lightTree/converter/BaseConverter.kt | 9 +++++---- .../converter/DeclarationsConverter.kt | 7 ++++--- .../lightTree/converter/ExpressionsConverter.kt | 5 +++-- .../jetbrains/kotlin/fir/FirSourceElement.kt | 17 ++++++++++++++++- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt index 170d1b9fa87..dbda59556e6 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt @@ -21,18 +21,19 @@ import org.jetbrains.kotlin.lexer.KtToken import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.name.Name import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract open class BaseConverter( baseSession: FirSession, - private val tree: FlyweightCapableTreeStructure, + val tree: FlyweightCapableTreeStructure, + val offset: Int, context: Context = Context() ) : BaseFirBuilder(baseSession, context) { protected val implicitType = buildImplicitTypeRef() override fun LighterASTNode.toFirSourceElement(): FirSourceElement { - return FirLightSourceElement(this, tree) + val startOffset = offset + tree.getStartOffset(this) + val endOffset = offset + tree.getEndOffset(this) + return FirLightSourceElement(this, startOffset, endOffset, tree) } override val LighterASTNode.elementType: IElementType diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 63b5121858e..5c23e3162a8 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -52,9 +52,10 @@ class DeclarationsConverter( private val baseScopeProvider: FirScopeProvider, private val stubMode: Boolean, tree: FlyweightCapableTreeStructure, + offset: Int = 0, context: Context = Context() -) : BaseConverter(session, tree, context) { - private val expressionConverter = ExpressionsConverter(session, stubMode, tree, this, context) +) : BaseConverter(session, tree, offset, context) { + private val expressionConverter = ExpressionsConverter(session, stubMode, tree, this, offset + 1, context) /** * [org.jetbrains.kotlin.parsing.KotlinParsing.parseFile] @@ -1194,7 +1195,7 @@ class DeclarationsConverter( return if (!stubMode) { val blockTree = LightTree2Fir.buildLightTreeBlockExpression(block.asText) return DeclarationsConverter( - baseSession, baseScopeProvider, stubMode, blockTree, context + baseSession, baseScopeProvider, stubMode, blockTree, offset = tree.getStartOffset(block), context ).convertBlockExpression(blockTree.root) } else { FirSingleExpressionBlock( diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index c0dcd0a31f1..544b328ef9f 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -50,8 +50,9 @@ class ExpressionsConverter( private val stubMode: Boolean, tree: FlyweightCapableTreeStructure, private val declarationsConverter: DeclarationsConverter, + offset: Int, context: Context = Context() -) : BaseConverter(session, tree, context) { +) : BaseConverter(session, tree, offset, context) { inline fun getAsFirExpression(expression: LighterASTNode?, errorReason: String = ""): R { return expression?.let { convertExpression(it, errorReason) } as? R ?: (buildErrorExpression(null, ConeSimpleDiagnostic(errorReason, DiagnosticKind.Syntax)) as R) @@ -63,7 +64,7 @@ class ExpressionsConverter( return when (expression.tokenType) { LAMBDA_EXPRESSION -> { val lambdaTree = LightTree2Fir.buildLightTreeLambdaExpression(expression.asText) - ExpressionsConverter(baseSession, stubMode, lambdaTree, declarationsConverter, context) + ExpressionsConverter(baseSession, stubMode, lambdaTree, declarationsConverter, offset, context) .convertLambdaExpression(lambdaTree.root) } BINARY_EXPRESSION -> convertBinaryExpression(expression) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt index 62519f6308e..791604219e7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -12,17 +12,32 @@ import com.intellij.psi.tree.IElementType import com.intellij.util.diff.FlyweightCapableTreeStructure import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.psi.KtModifierListOwner +import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.startOffset sealed class FirSourceElement { abstract val elementType: IElementType + abstract val startOffset: Int + abstract val endOffset: Int } class FirPsiSourceElement(val psi: PsiElement) : FirSourceElement() { override val elementType: IElementType get() = psi.node.elementType + + override val startOffset: Int + get() = psi.startOffset + + override val endOffset: Int + get() = psi.endOffset } -class FirLightSourceElement(val element: LighterASTNode, val tree: FlyweightCapableTreeStructure) : FirSourceElement() { +class FirLightSourceElement( + val element: LighterASTNode, + override val startOffset: Int, + override val endOffset: Int, + val tree: FlyweightCapableTreeStructure +) : FirSourceElement() { override val elementType: IElementType get() = element.tokenType }