FIR: Prepare tree structure for safe-call refactoring

^KT-38444 In Progress
This commit is contained in:
Denis Zharkov
2020-06-01 15:06:18 +03:00
parent 14a41d91f6
commit cb1c3f87f0
16 changed files with 381 additions and 4 deletions
@@ -280,7 +280,9 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
resolvedQualifier,
resolvedReifiedParameterReference,
expression to "FirExpressionStub",
varargArgumentsExpression
varargArgumentsExpression,
checkedSafeCallSubject,
safeCallExpression
)
elementsWithDefaultTypeRef.forEach {
val (element, name) = when (it) {
@@ -375,4 +377,4 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
}
}
}
}
@@ -102,6 +102,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val callableReferenceAccess = element("CallableReferenceAccess", Expression, qualifiedAccessExpression)
val thisReceiverExpression = element("ThisReceiverExpression", Expression, qualifiedAccessExpression)
val expressionWithSmartcast = element("ExpressionWithSmartcast", Expression, qualifiedAccessExpression)
val safeCallExpression = element("SafeCallExpression", Expression, expression)
val checkedSafeCallSubject = element("CheckedSafeCallSubject", Expression, expression)
val getClassCall = element("GetClassCall", Expression, expression, call)
val wrappedExpression = element("WrappedExpression", Expression, expression)
val wrappedArgumentExpression = element("WrappedArgumentExpression", Expression, wrappedExpression)
@@ -481,6 +481,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
"FirResolvedReifiedParameterReferenceImpl",
"FirExpressionStub",
"FirVarargArgumentsExpressionImpl",
"FirSafeCallExpressionImpl",
"FirCheckedSafeCallSubjectImpl",
)
configureFieldInAllImplementations(
field = "typeRef",
@@ -439,6 +439,18 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("originalType", typeRef)
}
safeCallExpression.configure {
+field("receiver", expression).withTransform()
// Special node that might be used as a reference to receiver of a safe call after null check
+field("checkedSubject", safeCallCheckedSubjectReferenceType)
// One that uses checkedReceiver as a receiver
+field("regularQualifiedAccess", qualifiedAccess, withReplace = true).withTransform()
}
checkedSafeCallSubject.configure {
+field("originalReceiverReference", safeCallReceiverReferenceType)
}
callableReferenceAccess.configure {
+field("calleeReference", namedReference, withReplace = true).withTransform()
}
@@ -6,7 +6,10 @@
package org.jetbrains.kotlin.fir.tree.generator
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.tree.generator.context.generatedType
import org.jetbrains.kotlin.fir.tree.generator.context.type
@@ -35,6 +38,8 @@ val annotationUseSiteTargetType = type(AnnotationUseSiteTarget::class)
val operationKindType = type("fir.expressions", "LogicOperationKind")
val coneKotlinTypeType = type(ConeKotlinType::class)
val whenSubjectType = type("fir", "FirWhenSubject")
val safeCallReceiverReferenceType = type("fir", "FirSafeCallOriginalReceiverReference")
val safeCallCheckedSubjectReferenceType = type("fir", "FirSafeCallCheckedSubjectReference")
val firSessionType = type("fir", "FirSession")
val emptyCfgReferenceType = generatedType("references.impl", "FirEmptyControlFlowGraphReference")
val noReceiverExpressionType = generatedType("expressions.impl", "FirNoReceiverExpression")
@@ -71,4 +76,4 @@ val coneStubDiagnosticType = generatedType("diagnostics", "ConeStubDiagnostic")
val dslBuilderAnnotationType = generatedType("builder", "FirBuilderDsl")
val firImplementationDetailType = generatedType("FirImplementationDetail")
val declarationOriginType = generatedType("declarations", "FirDeclarationOrigin")
val declarationAttributesType = generatedType("declarations", "FirDeclarationAttributes")
val declarationAttributesType = generatedType("declarations", "FirDeclarationAttributes")