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
@@ -45,8 +45,8 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
withCopy()
}
val qualifiedAccessBuilder by builder {
fields from qualifiedAccess without "calleeReference"
val qualifiedAccessExpressionBuilder by builder {
fields from qualifiedAccessExpression without "calleeReference"
}
val callBuilder by builder {
@@ -79,7 +79,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
}
val abstractFunctionCallBuilder by builder {
parents += qualifiedAccessBuilder
parents += qualifiedAccessExpressionBuilder
parents += callBuilder
fields from functionCall
}
@@ -152,12 +152,12 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
}
builder(propertyAccessExpression) {
parents += qualifiedAccessBuilder
parents += qualifiedAccessExpressionBuilder
defaultNoReceivers()
}
builder(callableReferenceAccess) {
parents += qualifiedAccessBuilder
parents += qualifiedAccessExpressionBuilder
defaultNull("explicitReceiver")
defaultNoReceivers()
defaultFalse("hasQuestionMarkAtLHS")
@@ -245,7 +245,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
}
builder(thisReceiverExpression) {
parents += qualifiedAccessBuilder
parents += qualifiedAccessExpressionBuilder
default("isImplicit", "false")
}
@@ -257,11 +257,6 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
default("contextReceiverNumber", "-1")
}
builder(variableAssignment) {
parents += qualifiedAccessBuilder
defaultNoReceivers()
}
builder(anonymousFunction) {
parents += functionBuilder
defaultNull("invocationKind", "label", "body", "controlFlowGraphReference")
@@ -108,7 +108,6 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val whenExpression by element(Expression, expression, resolvable)
val whenBranch by element(Expression)
val contextReceiverArgumentListOwner by element(Expression)
val qualifiedAccess by element(Expression, resolvable, statement, contextReceiverArgumentListOwner)
val checkNotNullCall by element(Expression, expression, call, resolvable)
val elvisExpression by element(Expression, expression, resolvable)
@@ -119,7 +118,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val errorFunction by element(Declaration, function, diagnosticHolder)
val errorProperty by element(Declaration, variable, diagnosticHolder)
val danglingModifierList by element(Declaration, declaration, diagnosticHolder)
val qualifiedAccessExpression by element(Expression, expression, qualifiedAccess)
val qualifiedAccessExpression by element(Expression, expression, resolvable, contextReceiverArgumentListOwner)
val qualifiedErrorAccessExpression by element(Expression, expression, diagnosticHolder)
val propertyAccessExpression by element(Expression, qualifiedAccessExpression)
val functionCall by element(Expression, qualifiedAccessExpression, call)
@@ -147,8 +146,9 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val returnExpression by element(Expression, jump)
val stringConcatenationCall by element(Expression, call, expression)
val throwExpression by element(Expression, expression)
val variableAssignment by element(Expression, qualifiedAccess)
val variableAssignment by element(Expression, statement)
val whenSubjectExpression by element(Expression, expression)
val desugaredAssignmentValueReferenceExpression by element(Expression, expression)
val wrappedDelegateExpression by element(Expression, wrappedExpression)
@@ -354,13 +354,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
publicImplementation()
}
impl(variableAssignment) {
default("lValue") {
value = "calleeReference"
customSetter = "calleeReference = value"
}
}
impl(anonymousFunction) {
default("resolvePhase", "FirResolvePhase.DECLARATIONS")
}
@@ -392,6 +385,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
useTypes(whenExpression)
}
impl(desugaredAssignmentValueReferenceExpression) {
useTypes(expression)
}
impl(wrappedDelegateExpression) {
default("typeRef") {
delegate = "expression"
@@ -205,7 +205,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+fieldList("contextReceiverArguments", expression, useMutableOrEmpty = true, withReplace = true)
}
qualifiedAccess.configure {
qualifiedAccessExpression.configure {
+typeArguments.withTransform()
+receivers
+field("source", sourceElementType, nullable = true, withReplace = true)
@@ -563,7 +563,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
checkedSafeCallSubject.configure {
+field("originalReceiverRef", safeCallOriginalReceiverReferenceType)
+field("originalReceiverRef", referenceToSimpleExpressionType)
}
callableReferenceAccess.configure {
@@ -611,8 +611,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
variableAssignment.configure {
+field("lValue", reference)
+field("lValueTypeRef", typeRef).withReplace()
+field("lValue", expression).withTransform().withReplace()
+field("rValue", expression).withTransform()
}
@@ -620,6 +619,10 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("whenRef", whenRefType)
}
desugaredAssignmentValueReferenceExpression.configure {
+field("expressionRef", referenceToSimpleExpressionType)
}
wrappedExpression.configure {
+field(expression).withReplace()
}
@@ -46,7 +46,7 @@ val coneKotlinTypeType = type(ConeKotlinType::class)
val coneSimpleKotlinTypeType = type(ConeSimpleKotlinType::class)
val whenRefType = generatedType("", "FirExpressionRef<FirWhenExpression>")
val safeCallOriginalReceiverReferenceType = generatedType("", "FirExpressionRef<FirExpression>")
val referenceToSimpleExpressionType = generatedType("", "FirExpressionRef<FirExpression>")
val safeCallCheckedSubjectReferenceType = generatedType("", "FirExpressionRef<FirCheckedSafeCallSubject>")
val firModuleDataType = type("fir", "FirModuleData")
@@ -106,7 +106,8 @@ fun SmartPrinter.printElement(element: Element) {
}
allFields.filter { it.withReplace }.forEach {
val override = overridenFields[it, it] && !(it.name == "source" && fullQualifiedName.endsWith("FirQualifiedAccess"))
val override = overridenFields[it, it] &&
!(it.name == "source" && fullQualifiedName.endsWith("FirQualifiedAccessExpression"))
it.replaceDeclaration(override, forceNullable = it.useNullableForReplace)
for (overridenType in it.overridenTypes) {
it.replaceDeclaration(true, overridenType)