[FE] Fix positioning strategy for SAFE_CALL_WILL_CHANGE_NULLABILITY warning

^KT-46860
This commit is contained in:
Dmitriy Novozhilov
2022-03-28 11:28:08 +04:00
committed by teamcity
parent 565c61a702
commit 078acb1bfe
16 changed files with 127 additions and 7 deletions
@@ -1120,6 +1120,30 @@ object LightTreePositioningStrategies {
return markElement(byKeyword, startOffset, endOffset, tree, node)
}
}
val CALL_ELEMENT_WITH_DOT: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> {
val callElementRanges = SELECTOR_BY_QUALIFIED.mark(node, startOffset, endOffset, tree)
val callElementRange = when (callElementRanges.size) {
1 -> callElementRanges.first()
else -> return callElementRanges
}
val dotRanges = SAFE_ACCESS.mark(node, startOffset, endOffset, tree)
val dotRange = when (dotRanges.size) {
1 -> dotRanges.first()
else -> return dotRanges
}
return listOf(TextRange(dotRange.startOffset, callElementRange.endOffset))
}
}
}
fun KtSourceElement.hasValOrVar(): Boolean =
@@ -499,6 +499,25 @@ object PositioningStrategies {
}
}
@JvmField
val CALL_ELEMENT_WITH_DOT: PositioningStrategy<KtQualifiedExpression> = object : PositioningStrategy<KtQualifiedExpression>() {
override fun mark(element: KtQualifiedExpression): List<TextRange> {
val callElementRanges = SELECTOR_BY_QUALIFIED.mark(element)
val callElementRange = when (callElementRanges.size) {
1 -> callElementRanges.first()
else -> return callElementRanges
}
val dotRanges = SAFE_ACCESS.mark(element)
val dotRange = when (dotRanges.size) {
1 -> dotRanges.first()
else -> return dotRanges
}
return listOf(TextRange(dotRange.startOffset, callElementRange.endOffset))
}
}
@JvmField
val DECLARATION_WITH_BODY: PositioningStrategy<KtDeclarationWithBody> = object : PositioningStrategy<KtDeclarationWithBody>() {
override fun mark(element: KtDeclarationWithBody): List<TextRange> {
@@ -364,4 +364,9 @@ object SourceElementPositioningStrategies {
LightTreePositioningStrategies.DELEGATED_SUPERTYPE_BY_KEYWORD,
PositioningStrategies.DELEGATED_SUPERTYPE_BY_KEYWORD
)
val CALL_ELEMENT_WITH_DOT = SourceElementPositioningStrategy(
LightTreePositioningStrategies.CALL_ELEMENT_WITH_DOT,
PositioningStrategies.CALL_ELEMENT_WITH_DOT
)
}