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 {
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 =
@@ -508,7 +508,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
statements += generateResolvedAccessExpression(desugaredSource, resultVar)
} else {
appendAssignment()
statements += generateAccessExpression(desugaredSource, unwrappedArgument.getReferencedNameAsName())
statements += generateAccessExpression(desugaredSource, desugaredSource, unwrappedArgument.getReferencedNameAsName())
}
} else {
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 {
this.source = source
this.source = qualifiedSource
calleeReference = buildSimpleNamedReference {
this.source = source
this.source = calleReferenceSource
this.name = name
}
}
@@ -389,7 +389,12 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
calleeReference = when {
lhsIsVar -> lhsReference!!
else -> buildErrorNamedReference {
source = assignmentOperatorStatement.leftArgument.source
source = when (leftArgument) {
is FirFunctionCall -> leftArgument.source
is FirQualifiedAccess ->
leftArgument.calleeReference.source
else -> leftArgument.source
}
diagnostic = ConeVariableExpectedError()
}
}