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:
committed by
Space Team
parent
e9b8d6db80
commit
ace47c06a5
+6
-11
@@ -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")
|
||||
|
||||
+3
-3
@@ -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)
|
||||
|
||||
|
||||
+4
-7
@@ -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"
|
||||
|
||||
+7
-4
@@ -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()
|
||||
}
|
||||
|
||||
+1
-1
@@ -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")
|
||||
|
||||
+2
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user