[FIR] Add property delegate positioning strategy

This commit is contained in:
Nikolay Lunyak
2021-09-29 15:11:31 +03:00
committed by TeamCityServer
parent 276fb77155
commit f97e666608
4 changed files with 38 additions and 0 deletions
@@ -108,6 +108,7 @@ enum class PositioningStrategy(private val strategy: String? = null) {
ENUM_MODIFIER,
FIELD_KEYWORD,
TAILREC_MODIFIER,
PROPERTY_DELEGATE,
;
@@ -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<LighterASTNode>
): List<TextRange> {
val delegate = tree.findChildByType(node, KtNodeTypes.PROPERTY_DELEGATE)
return markElement(delegate ?: node, startOffset, endOffset, tree, node)
}
override fun isValid(node: LighterASTNode, tree: FlyweightCapableTreeStructure<LighterASTNode>): 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<LighterASTNode>.returnKeyword(node: Li
private fun FlyweightCapableTreeStructure<LighterASTNode>.fieldKeyword(node: LighterASTNode): LighterASTNode? =
findChildByType(node, KtTokens.FIELD_KEYWORD)
private fun FlyweightCapableTreeStructure<LighterASTNode>.byKeyword(node: LighterASTNode): LighterASTNode? =
findChildByType(node, KtTokens.BY_KEYWORD)
internal fun FlyweightCapableTreeStructure<LighterASTNode>.nameIdentifier(node: LighterASTNode): LighterASTNode? =
findChildByType(node, KtTokens.IDENTIFIER)
@@ -329,4 +329,9 @@ object SourceElementPositioningStrategies {
LightTreePositioningStrategies.TAILREC_MODIFIER,
PositioningStrategies.TAILREC_MODIFIER
)
val PROPERTY_DELEGATE = SourceElementPositioningStrategy(
LightTreePositioningStrategies.PROPERTY_DELEGATE,
PositioningStrategies.PROPERTY_DELEGATE
)
}
@@ -302,6 +302,18 @@ object PositioningStrategies {
}
}
@JvmField
val PROPERTY_DELEGATE: PositioningStrategy<KtProperty> = object : DeclarationHeader<KtProperty>() {
override fun mark(element: KtProperty): List<TextRange> {
val delegate = element.delegate
return if (delegate != null) {
markElement(delegate)
} else {
DEFAULT.mark(element)
}
}
}
@JvmField
val FOR_REDECLARATION: PositioningStrategy<PsiElement> = object : PositioningStrategy<PsiElement>() {
override fun mark(element: PsiElement): List<TextRange> {