FIR: Prepare tree structure for safe-call refactoring
^KT-38444 In Progress
This commit is contained in:
+4
-2
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+2
@@ -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)
|
||||
|
||||
+2
@@ -481,6 +481,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
"FirResolvedReifiedParameterReferenceImpl",
|
||||
"FirExpressionStub",
|
||||
"FirVarargArgumentsExpressionImpl",
|
||||
"FirSafeCallExpressionImpl",
|
||||
"FirCheckedSafeCallSubjectImpl",
|
||||
)
|
||||
configureFieldInAllImplementations(
|
||||
field = "typeRef",
|
||||
|
||||
+12
@@ -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()
|
||||
}
|
||||
|
||||
+7
-2
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user