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"),
DECLARATION_RETURN_TYPE("DECLARATION_RETURN_TYPE"),
OVERRIDE_MODIFIER("OVERRIDE_MODIFIER"),
DOT_BY_SELECTOR("DOT_BY_SELECTOR"),
DOT_BY_QUALIFIED("DOT_BY_QUALIFIED"),
OPEN_MODIFIER("OPEN_MODIFIER"),
WHEN_EXPRESSION("WHEN_EXPRESSION"),
IF_EXPRESSION("IF_EXPRESSION"),
@@ -361,7 +361,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
}
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")
}
val UNSAFE_IMPLICIT_INVOKE_CALL by error<FirSourceElement, PsiElement> {
@@ -234,7 +234,7 @@ object FirErrors {
val WRONG_IMPLIES_CONDITION by warning0<FirSourceElement, PsiElement>()
// 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_INFIX_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(
node: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> {
if (node.tokenType != KtNodeTypes.REFERENCE_EXPRESSION && node.tokenType != KtNodeTypes.CALL_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
if (node.tokenType != KtNodeTypes.DOT_QUALIFIED_EXPRESSION) {
return super.mark(node, startOffset, endOffset, tree)
}
val parentNode = tree.getParent(node) ?: return super.mark(node, startOffset, endOffset, tree)
if (parentNode.tokenType == KtNodeTypes.DOT_QUALIFIED_EXPRESSION) {
return markElement(tree.dotOperator(parentNode) ?: node, startOffset, endOffset, tree, node)
}
return super.mark(node, startOffset, endOffset, tree)
return markElement(tree.dotOperator(node) ?: node, startOffset, endOffset, tree, node)
}
}
@@ -98,9 +98,9 @@ object SourceElementPositioningStrategies {
PositioningStrategies.PARAMETER_VARARG_MODIFIER
)
val DOT_BY_SELECTOR = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DOT_BY_SELECTOR,
PositioningStrategies.DOT_BY_SELECTOR
val DOT_BY_QUALIFIED = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DOT_BY_QUALIFIED,
PositioningStrategies.DOT_BY_QUALIFIED
)
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> {
when (element) {
is KtNameReferenceExpression -> {
var parent = element
repeat(2) {
parent = parent.parent
(parent as? KtDotQualifiedExpression)?.operationTokenNode?.psi?.let { return mark(it) }
}
is KtDotQualifiedExpression -> {
return mark(element.operationTokenNode.psi)
}
}
return super.mark(element)