From f97e6666088ddc6420ebb1d04933ce0b5ae91cb0 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 29 Sep 2021 15:11:31 +0300 Subject: [PATCH] [FIR] Add property delegate positioning strategy --- .../model/RegularDiagnosticData.kt | 1 + .../LightTreePositioningStrategies.kt | 20 +++++++++++++++++++ .../SourceElementPositioningStrategies.kt | 5 +++++ .../diagnostics/PositioningStrategies.kt | 12 +++++++++++ 4 files changed, 38 insertions(+) diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt index 638a96792ae..53fa7af7e3d 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt @@ -108,6 +108,7 @@ enum class PositioningStrategy(private val strategy: String? = null) { ENUM_MODIFIER, FIELD_KEYWORD, TAILREC_MODIFIER, + PROPERTY_DELEGATE, ; diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index f28d4332da0..bf94d5adbb7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -13,6 +13,7 @@ import com.intellij.psi.tree.TokenSet import com.intellij.util.diff.FlyweightCapableTreeStructure import org.jetbrains.kotlin.KtNodeType import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.diagnostics.PositioningStrategies import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.MODALITY_MODIFIERS @@ -401,6 +402,22 @@ object LightTreePositioningStrategies { } } + val PROPERTY_DELEGATE: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + val delegate = tree.findChildByType(node, KtNodeTypes.PROPERTY_DELEGATE) + return markElement(delegate ?: node, startOffset, endOffset, tree, node) + } + + override fun isValid(node: LighterASTNode, tree: FlyweightCapableTreeStructure): Boolean { + return tree.findChildByType(node, KtNodeTypes.PROPERTY_DELEGATE) != null + } + } + val INLINE_PARAMETER_MODIFIER: LightTreePositioningStrategy = ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.NOINLINE_KEYWORD, KtTokens.CROSSINLINE_KEYWORD)) @@ -1023,6 +1040,9 @@ private fun FlyweightCapableTreeStructure.returnKeyword(node: Li private fun FlyweightCapableTreeStructure.fieldKeyword(node: LighterASTNode): LighterASTNode? = findChildByType(node, KtTokens.FIELD_KEYWORD) +private fun FlyweightCapableTreeStructure.byKeyword(node: LighterASTNode): LighterASTNode? = + findChildByType(node, KtTokens.BY_KEYWORD) + internal fun FlyweightCapableTreeStructure.nameIdentifier(node: LighterASTNode): LighterASTNode? = findChildByType(node, KtTokens.IDENTIFIER) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index aa4f9873a20..4c2715ef224 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -329,4 +329,9 @@ object SourceElementPositioningStrategies { LightTreePositioningStrategies.TAILREC_MODIFIER, PositioningStrategies.TAILREC_MODIFIER ) + + val PROPERTY_DELEGATE = SourceElementPositioningStrategy( + LightTreePositioningStrategies.PROPERTY_DELEGATE, + PositioningStrategies.PROPERTY_DELEGATE + ) } diff --git a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index f00cb95fa9a..92f0b6ff7f3 100644 --- a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -302,6 +302,18 @@ object PositioningStrategies { } } + @JvmField + val PROPERTY_DELEGATE: PositioningStrategy = object : DeclarationHeader() { + override fun mark(element: KtProperty): List { + val delegate = element.delegate + return if (delegate != null) { + markElement(delegate) + } else { + DEFAULT.mark(element) + } + } + } + @JvmField val FOR_REDECLARATION: PositioningStrategy = object : PositioningStrategy() { override fun mark(element: PsiElement): List {