[FIR JS] KT-51740: Alter positioning of NO_VALUE_FOR_PARAMETER

This commit is contained in:
Nikolay Lunyak
2022-09-23 12:20:09 +03:00
parent 418c530820
commit fcd3e4f4c5
101 changed files with 340 additions and 248 deletions
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.KtParameter.VAL_VAR_TOKEN_SET
import org.jetbrains.kotlin.psi.KtValueArgument
import org.jetbrains.kotlin.psi.stubs.elements.KtClassElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtStringTemplateExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
@@ -542,14 +544,31 @@ object LightTreePositioningStrategies {
}
}
val nodeToStart = when (node.tokenType) {
in KtTokens.QUALIFIED_ACCESS -> tree.findLastChildByType(node, KtNodeTypes.CALL_EXPRESSION) ?: node
in QUALIFIED_ACCESS -> tree.findLastChildByType(node, KtNodeTypes.CALL_EXPRESSION) ?: node
KtNodeTypes.CLASS -> tree.findLastChildByType(node, KtNodeTypes.SUPER_TYPE_LIST) ?: 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)
val argumentList = nodeToStart.takeIf { nodeToStart.tokenType == KtNodeTypes.VALUE_ARGUMENT_LIST }
?: tree.findChildByType(nodeToStart, KtNodeTypes.VALUE_ARGUMENT_LIST)
return when {
argumentList != null -> {
val rightParenthesis = tree.findLastChildByType(argumentList, RPAR)
?: return markElement(nodeToStart, startOffset, endOffset, tree, node)
val lastArgument = tree.findLastChildByType(argumentList, KtNodeTypes.VALUE_ARGUMENT)
if (lastArgument != null) {
markRange(lastArgument, rightParenthesis, startOffset, endOffset, tree, node)
} else {
markRange(nodeToStart, rightParenthesis, startOffset, endOffset, tree, node)
}
}
} ?: markElement(nodeToStart, startOffset, endOffset, tree, node)
nodeToStart.tokenType == KtNodeTypes.CALL_EXPRESSION -> markElement(
tree.findChildByType(nodeToStart, KtNodeTypes.REFERENCE_EXPRESSION) ?: nodeToStart,
startOffset, endOffset, tree, node,
)
else -> markElement(nodeToStart, startOffset, endOffset, tree, node)
}
}
}
@@ -644,9 +644,28 @@ object PositioningStrategies {
}
val qualifiedAccess = when (element) {
is KtQualifiedExpression -> element.selectorExpression ?: element
is KtClassOrObject -> element.getSuperTypeList() ?: element
else -> element
}
return markElement(qualifiedAccess.findDescendantOfType<KtValueArgumentList>()?.rightParenthesis ?: qualifiedAccess)
val argumentList = qualifiedAccess as? KtValueArgumentList
?: qualifiedAccess.getChildOfType()
return when {
argumentList != null -> {
val rightParenthesis = argumentList.rightParenthesis ?: return markElement(qualifiedAccess)
val lastArgument = argumentList.children.findLast { it is KtValueArgument }
if (lastArgument != null) {
markRange(lastArgument, rightParenthesis)
} else {
markRange(qualifiedAccess, rightParenthesis)
}
}
qualifiedAccess is KtCallExpression -> markElement(
qualifiedAccess.getChildOfType<KtNameReferenceExpression>() ?: qualifiedAccess
)
else -> markElement(qualifiedAccess)
}
}
}