FIR: change DOT_BY_SELECTOR to DOT_BY_QUALIFIED strategy

This commit is contained in:
Mikhail Glukhikh
2021-02-18 11:08:46 +03:00
parent 04caa5c612
commit 5ffa72f1fa
6 changed files with 12 additions and 22 deletions
@@ -36,7 +36,7 @@ enum class PositioningStrategy(private val strategy: String) {
PARAMETER_VARARG_MODIFIER("PARAMETER_VARARG_MODIFIER"), PARAMETER_VARARG_MODIFIER("PARAMETER_VARARG_MODIFIER"),
DECLARATION_RETURN_TYPE("DECLARATION_RETURN_TYPE"), DECLARATION_RETURN_TYPE("DECLARATION_RETURN_TYPE"),
OVERRIDE_MODIFIER("OVERRIDE_MODIFIER"), OVERRIDE_MODIFIER("OVERRIDE_MODIFIER"),
DOT_BY_SELECTOR("DOT_BY_SELECTOR"), DOT_BY_QUALIFIED("DOT_BY_QUALIFIED"),
OPEN_MODIFIER("OPEN_MODIFIER"), OPEN_MODIFIER("OPEN_MODIFIER"),
WHEN_EXPRESSION("WHEN_EXPRESSION"), WHEN_EXPRESSION("WHEN_EXPRESSION"),
IF_EXPRESSION("IF_EXPRESSION"), IF_EXPRESSION("IF_EXPRESSION"),
@@ -361,7 +361,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
} }
val NULLABILITY by object : DiagnosticGroup("Nullability") { val NULLABILITY by object : DiagnosticGroup("Nullability") {
val UNSAFE_CALL by error<FirSourceElement, PsiElement>(PositioningStrategy.DOT_BY_SELECTOR) { val UNSAFE_CALL by error<FirSourceElement, PsiElement>(PositioningStrategy.DOT_BY_QUALIFIED) {
parameter<ConeKotlinType>("receiverType") parameter<ConeKotlinType>("receiverType")
} }
val UNSAFE_IMPLICIT_INVOKE_CALL by error<FirSourceElement, PsiElement> { val UNSAFE_IMPLICIT_INVOKE_CALL by error<FirSourceElement, PsiElement> {
@@ -234,7 +234,7 @@ object FirErrors {
val WRONG_IMPLIES_CONDITION by warning0<FirSourceElement, PsiElement>() val WRONG_IMPLIES_CONDITION by warning0<FirSourceElement, PsiElement>()
// Nullability // Nullability
val UNSAFE_CALL by error1<FirSourceElement, PsiElement, ConeKotlinType>(SourceElementPositioningStrategies.DOT_BY_SELECTOR) val UNSAFE_CALL by error1<FirSourceElement, PsiElement, ConeKotlinType>(SourceElementPositioningStrategies.DOT_BY_QUALIFIED)
val UNSAFE_IMPLICIT_INVOKE_CALL by error1<FirSourceElement, PsiElement, ConeKotlinType>() val UNSAFE_IMPLICIT_INVOKE_CALL by error1<FirSourceElement, PsiElement, ConeKotlinType>()
val UNSAFE_INFIX_CALL by error3<FirSourceElement, KtExpression, FirExpression, String, FirExpression>() val UNSAFE_INFIX_CALL by error3<FirSourceElement, KtExpression, FirExpression, String, FirExpression>()
val UNSAFE_OPERATOR_CALL by error3<FirSourceElement, KtExpression, FirExpression, String, FirExpression>() val UNSAFE_OPERATOR_CALL by error3<FirSourceElement, KtExpression, FirExpression, String, FirExpression>()
@@ -315,23 +315,17 @@ object LightTreePositioningStrategies {
} }
} }
val DOT_BY_SELECTOR: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { val DOT_BY_QUALIFIED: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark( override fun mark(
node: LighterASTNode, node: LighterASTNode,
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode> tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> { ): List<TextRange> {
if (node.tokenType != KtNodeTypes.REFERENCE_EXPRESSION && node.tokenType != KtNodeTypes.CALL_EXPRESSION) { if (node.tokenType != KtNodeTypes.DOT_QUALIFIED_EXPRESSION) {
// TODO: normally CALL_EXPRESSION should not be here. In PSI we have REFERENCE_EXPRESSION even for x.bar() case
// Remove CALL_EXPRESSION from here and repeat code below twice (see PSI counterpart) when fixed
return super.mark(node, startOffset, endOffset, tree) return super.mark(node, startOffset, endOffset, tree)
} }
val parentNode = tree.getParent(node) ?: return super.mark(node, startOffset, endOffset, tree) return markElement(tree.dotOperator(node) ?: node, startOffset, endOffset, tree, node)
if (parentNode.tokenType == KtNodeTypes.DOT_QUALIFIED_EXPRESSION) {
return markElement(tree.dotOperator(parentNode) ?: node, startOffset, endOffset, tree, node)
}
return super.mark(node, startOffset, endOffset, tree)
} }
} }
@@ -98,9 +98,9 @@ object SourceElementPositioningStrategies {
PositioningStrategies.PARAMETER_VARARG_MODIFIER PositioningStrategies.PARAMETER_VARARG_MODIFIER
) )
val DOT_BY_SELECTOR = SourceElementPositioningStrategy( val DOT_BY_QUALIFIED = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DOT_BY_SELECTOR, LightTreePositioningStrategies.DOT_BY_QUALIFIED,
PositioningStrategies.DOT_BY_SELECTOR PositioningStrategies.DOT_BY_QUALIFIED
) )
val SELECTOR_BY_QUALIFIED = SourceElementPositioningStrategy( val SELECTOR_BY_QUALIFIED = SourceElementPositioningStrategy(
@@ -711,15 +711,11 @@ object PositioningStrategies {
} }
} }
val DOT_BY_SELECTOR: PositioningStrategy<PsiElement> = object : PositioningStrategy<PsiElement>() { val DOT_BY_QUALIFIED: PositioningStrategy<PsiElement> = object : PositioningStrategy<PsiElement>() {
override fun mark(element: PsiElement): List<TextRange> { override fun mark(element: PsiElement): List<TextRange> {
when (element) { when (element) {
is KtNameReferenceExpression -> { is KtDotQualifiedExpression -> {
var parent = element return mark(element.operationTokenNode.psi)
repeat(2) {
parent = parent.parent
(parent as? KtDotQualifiedExpression)?.operationTokenNode?.psi?.let { return mark(it) }
}
} }
} }
return super.mark(element) return super.mark(element)