FIR: fix source element of FirQualifiedAccessExpression

This commit is contained in:
Ilya Kirillov
2020-09-16 13:04:48 +03:00
parent c6de983476
commit 551864d8c1
4 changed files with 19 additions and 6 deletions
@@ -1430,7 +1430,11 @@ class RawFirBuilder(
} }
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression, data: Unit): FirElement { override fun visitSimpleNameExpression(expression: KtSimpleNameExpression, data: Unit): FirElement {
return generateAccessExpression(expression.toFirSourceElement(), expression.getReferencedNameAsName()) val qualifiedSource = when {
expression.getQualifiedExpressionForSelector() != null -> expression.parent
else -> expression
}.toFirSourceElement()
return generateAccessExpression(qualifiedSource, expression.toFirSourceElement(), expression.getReferencedNameAsName())
} }
override fun visitConstantExpression(expression: KtConstantExpression, data: Unit): FirElement = override fun visitConstantExpression(expression: KtConstantExpression, data: Unit): FirElement =
@@ -508,7 +508,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
statements += generateResolvedAccessExpression(desugaredSource, resultVar) statements += generateResolvedAccessExpression(desugaredSource, resultVar)
} else { } else {
appendAssignment() appendAssignment()
statements += generateAccessExpression(desugaredSource, unwrappedArgument.getReferencedNameAsName()) statements += generateAccessExpression(desugaredSource, desugaredSource, unwrappedArgument.getReferencedNameAsName())
} }
} else { } else {
statements += initialValueVar statements += initialValueVar
@@ -227,11 +227,15 @@ private fun FirExpression.createConventionCall(
} }
} }
fun generateAccessExpression(source: FirSourceElement?, name: Name): FirQualifiedAccessExpression = fun generateAccessExpression(
qualifiedSource: FirSourceElement?,
calleReferenceSource: FirSourceElement?,
name: Name
): FirQualifiedAccessExpression =
buildQualifiedAccessExpression { buildQualifiedAccessExpression {
this.source = source this.source = qualifiedSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
this.source = source this.source = calleReferenceSource
this.name = name this.name = name
} }
} }
@@ -389,7 +389,12 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
calleeReference = when { calleeReference = when {
lhsIsVar -> lhsReference!! lhsIsVar -> lhsReference!!
else -> buildErrorNamedReference { else -> buildErrorNamedReference {
source = assignmentOperatorStatement.leftArgument.source source = when (leftArgument) {
is FirFunctionCall -> leftArgument.source
is FirQualifiedAccess ->
leftArgument.calleeReference.source
else -> leftArgument.source
}
diagnostic = ConeVariableExpectedError() diagnostic = ConeVariableExpectedError()
} }
} }