FIR: Make LHS of FirVariableAssignment a FirExpression

This way references can even be resolved for erroneous assignments
(e.g. function call, if expression, ... on LHS)

^KT-54648 Fixed
This commit is contained in:
Kirill Rakhman
2023-01-16 09:54:31 +01:00
committed by Space Team
parent e9b8d6db80
commit ace47c06a5
128 changed files with 950 additions and 935 deletions
@@ -950,33 +950,6 @@ object LightTreePositioningStrategies {
}
}
val ASSIGNMENT_LHS: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> {
if ((node.tokenType == KtNodeTypes.BINARY_EXPRESSION &&
tree.findDescendantByTypes(node, KtTokens.ALL_ASSIGNMENTS) != null) ||
((node.tokenType == KtNodeTypes.PREFIX_EXPRESSION || node.tokenType == KtNodeTypes.POSTFIX_EXPRESSION) &&
tree.findDescendantByTypes(node, KtTokens.INCREMENT_AND_DECREMENT) != null)
) {
val lhs = if (node.tokenType == KtNodeTypes.PREFIX_EXPRESSION) {
tree.lastChildExpression(node)
} else {
tree.firstChildExpression(node)
}
lhs?.let {
tree.unwrapParenthesesLabelsAndAnnotations(it).let { unwrapped ->
return markElement(unwrapped, startOffset, endOffset, tree, node)
}
}
}
return super.mark(node, startOffset, endOffset, tree)
}
}
val ANNOTATION_USE_SITE: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
@@ -1426,7 +1399,7 @@ fun FlyweightCapableTreeStructure<LighterASTNode>.selector(node: LighterASTNode)
dotOrDoubleColonFound = true
continue
}
if (dotOrDoubleColonFound && (tokenType == KtNodeTypes.CALL_EXPRESSION || tokenType == KtNodeTypes.REFERENCE_EXPRESSION)) {
if (dotOrDoubleColonFound && child.isExpression()) {
return child
}
}
@@ -944,18 +944,6 @@ object PositioningStrategies {
}
}
val ASSIGNMENT_LHS: PositioningStrategy<PsiElement> = object : PositioningStrategy<PsiElement>() {
override fun mark(element: PsiElement): List<TextRange> {
if (element is KtBinaryExpression && element.operationToken in KtTokens.ALL_ASSIGNMENTS) {
element.left.let { left -> left.unwrapParenthesesLabelsAndAnnotations()?.let { return markElement(it) } }
}
if (element is KtUnaryExpression && element.operationToken in KtTokens.INCREMENT_AND_DECREMENT) {
element.baseExpression.let { arg -> arg.unwrapParenthesesLabelsAndAnnotations()?.let { return markElement(it) } }
}
return super.mark(element)
}
}
val IMPORT_LAST_NAME: PositioningStrategy<PsiElement> = object : PositioningStrategy<PsiElement>() {
override fun isValid(element: PsiElement): Boolean {
@@ -263,11 +263,6 @@ object SourceElementPositioningStrategies {
PositioningStrategies.ANNOTATION_USE_SITE
)
val ASSIGNMENT_LHS = SourceElementPositioningStrategy(
LightTreePositioningStrategies.ASSIGNMENT_LHS,
PositioningStrategies.ASSIGNMENT_LHS
)
val IMPORT_LAST_NAME = SourceElementPositioningStrategy(
LightTreePositioningStrategies.IMPORT_LAST_NAME,
PositioningStrategies.IMPORT_LAST_NAME