FIR: change DOT_BY_SELECTOR to DOT_BY_QUALIFIED strategy
This commit is contained in:
+1
-1
@@ -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"),
|
||||||
|
|||||||
+1
-1
@@ -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> {
|
||||||
|
|||||||
+1
-1
@@ -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>()
|
||||||
|
|||||||
+3
-9
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user