From 48994976d48a4df32e6a08f0cc31a6b2b67576e6 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Wed, 14 Apr 2021 19:32:34 +0300 Subject: [PATCH] [FIR][LightTree] Skip comments and whitespaces when marking elements --- .../analysis/diagnostics/LightTreePositioningStrategy.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt index 2d76d410168..971251f0885 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.util.Ref import com.intellij.openapi.util.TextRange import com.intellij.psi.TokenType import com.intellij.util.diff.FlyweightCapableTreeStructure +import org.jetbrains.kotlin.fir.analysis.checkers.getChildren import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.WHITE_SPACE @@ -50,7 +51,8 @@ fun markRange( tree: FlyweightCapableTreeStructure, originalNode: LighterASTNode ): List { - val startDelta = tree.getStartOffset(from) - tree.getStartOffset(originalNode) + val betterFrom = from.nonFillerChildOrSelf(tree) + val startDelta = tree.getStartOffset(betterFrom) - tree.getStartOffset(originalNode) val endDelta = tree.getEndOffset(to) - tree.getEndOffset(originalNode) return listOf(TextRange(startDelta + startOffset, endDelta + endOffset)) } @@ -60,6 +62,10 @@ private val DOC_AND_COMMENT_TOKENS = setOf( KtTokens.EOL_COMMENT, KtTokens.BLOCK_COMMENT, KtTokens.SHEBANG_COMMENT, KtTokens.DOC_COMMENT ) +private fun LighterASTNode.nonFillerChildOrSelf(tree: FlyweightCapableTreeStructure): LighterASTNode = + getChildren(tree).firstOrNull { it != null && it.tokenType !in DOC_AND_COMMENT_TOKENS } ?: this + + private fun hasSyntaxErrors(node: LighterASTNode, tree: FlyweightCapableTreeStructure): Boolean { if (node.tokenType == TokenType.ERROR_ELEMENT) return true