FIR: fix VALUE_ARGUMENTS position strategy

This commit is contained in:
Tianyu Geng
2021-05-22 00:07:37 -07:00
committed by TeamCityServer
parent 3bd6bf1432
commit 61475c48e2
6 changed files with 18 additions and 9 deletions
@@ -409,12 +409,15 @@ object LightTreePositioningStrategies {
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> {
//PSI counterpart simply search for first RPAR descendant, but this one is more correct
return tree.findDescendantByType(node, KtNodeTypes.VALUE_ARGUMENT_LIST)?.let { valueArgumentList ->
val nodeToStart = when (node.tokenType) {
in KtTokens.QUALIFIED_ACCESS -> tree.findLastChildByType(node, KtNodeTypes.CALL_EXPRESSION) ?: node
else -> node
}
return tree.findDescendantByType(nodeToStart, KtNodeTypes.VALUE_ARGUMENT_LIST)?.let { valueArgumentList ->
tree.findLastChildByType(valueArgumentList, KtTokens.RPAR)?.let { rpar ->
markElement(rpar, startOffset, endOffset, tree, node)
}
} ?: markElement(node, startOffset, endOffset, tree, node)
} ?: markElement(nodeToStart, startOffset, endOffset, tree, node)
}
}
@@ -454,7 +457,7 @@ object LightTreePositioningStrategies {
return markElement(it, startOffset, endOffset, tree, node)
}
}
if (node.tokenType != KtNodeTypes.DOT_QUALIFIED_EXPRESSION && node.tokenType != KtNodeTypes.SAFE_ACCESS_EXPRESSION) {
if (node.tokenType !in KtTokens.QUALIFIED_ACCESS) {
return super.mark(node, startOffset, endOffset, tree)
}
val selector = tree.selector(node)
@@ -40,8 +40,6 @@ private val expressionSet = listOf(
FUN
)
val qualifiedAccessTokens = TokenSet.create(DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION)
fun String?.nameAsSafeName(defaultName: String = ""): Name {
return when {
this != null -> Name.identifier(this.replace("`", ""))
@@ -86,7 +86,7 @@ class ExpressionsConverter(
ANNOTATED_EXPRESSION -> convertAnnotatedExpression(expression)
CLASS_LITERAL_EXPRESSION -> convertClassLiteralExpression(expression)
CALLABLE_REFERENCE_EXPRESSION -> convertCallableReferenceExpression(expression)
in qualifiedAccessTokens -> convertQualifiedExpression(expression)
in QUALIFIED_ACCESS -> convertQualifiedExpression(expression)
CALL_EXPRESSION -> convertCallExpression(expression)
WHEN -> convertWhenExpression(expression)
ARRAY_ACCESS_EXPRESSION -> convertArrayAccessExpression(expression)
@@ -614,7 +614,11 @@ object PositioningStrategies {
@JvmField
val VALUE_ARGUMENTS: PositioningStrategy<KtElement> = object : PositioningStrategy<KtElement>() {
override fun mark(element: KtElement): List<TextRange> {
return markElement(element.findDescendantOfType<KtValueArgumentList>()?.rightParenthesis ?: element)
val qualifiedAccess = when (element) {
is KtQualifiedExpression -> element.selectorExpression ?: element
else -> element
}
return markElement(qualifiedAccess.findDescendantOfType<KtValueArgumentList>()?.rightParenthesis ?: qualifiedAccess)
}
}
@@ -22,6 +22,9 @@ import com.intellij.psi.tree.TokenSet;
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens;
import org.jetbrains.kotlin.psi.KtPsiUtil;
import static org.jetbrains.kotlin.KtNodeTypes.DOT_QUALIFIED_EXPRESSION;
import static org.jetbrains.kotlin.KtNodeTypes.SAFE_ACCESS_EXPRESSION;
public interface KtTokens {
KtToken EOF = new KtToken("EOF");
@@ -266,4 +269,5 @@ public interface KtTokens {
TokenSet AUGMENTED_ASSIGNMENTS = TokenSet.create(PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ);
TokenSet ALL_ASSIGNMENTS = TokenSet.create(EQ, PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ);
TokenSet INCREMENT_AND_DECREMENT = TokenSet.create(PLUSPLUS, MINUSMINUS);
TokenSet QUALIFIED_ACCESS = TokenSet.create(DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION);
}
@@ -21,7 +21,7 @@ class KotlinSubSubClass : KotlinSubClass() {
fun viaRealOverride() = KotlinSubSubClass().foo(kotlinName = 3)
fun unresolvedParameter() = JavaSuperClass(<!NO_VALUE_FOR_PARAMETER!>)<!>.foo(<!NAMED_PARAMETER_NOT_FOUND!>nonexistentName<!> = 4)
fun unresolvedParameter() = JavaSuperClass().foo(<!NAMED_PARAMETER_NOT_FOUND!>nonexistentName<!> = 4<!NO_VALUE_FOR_PARAMETER!>)<!>
fun multipleParameters() = JavaSuperClass().multipleParameters(<!NAMED_ARGUMENTS_NOT_ALLOWED!>first<!> = 1, <!NAMED_ARGUMENTS_NOT_ALLOWED!>second<!> = 2L, <!NAMED_ARGUMENTS_NOT_ALLOWED!>third<!> = "3")