FIR: Unify all references to FIR nodes from non-parents

This commit is contained in:
Denis Zharkov
2020-06-02 17:40:09 +03:00
parent 4a4dce1766
commit 7a22827af4
28 changed files with 133 additions and 109 deletions
@@ -269,6 +269,18 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
defaultFalse("isNullableLHSForCallableReference")
}
// builder(safeCallExpression) {
// useTypes(safeCallCheckedSubjectType)
// }
//
// builder(checkedSafeCallSubject) {
// useTypes(expressionType)
// }
//
// builder(whenSubjectExpression) {
// useTypes(whenExpressionType)
// }
val elementsWithDefaultTypeRef = listOf(
thisReceiverExpression,
callableReferenceAccess,
@@ -286,9 +286,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(whenSubjectExpression) {
default("typeRef") {
value = "whenSubject.whenExpression.subject!!.typeRef"
value = "whenRef.value.subject!!.typeRef"
withGetter = true
}
useTypes(whenExpressionType)
}
impl(wrappedDelegateExpression) {
@@ -443,6 +444,14 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
}
}
impl(safeCallExpression) {
useTypes(safeCallCheckedSubjectType)
}
impl(checkedSafeCallSubject) {
useTypes(expressionType)
}
noImpl(userTypeRef)
}
@@ -441,13 +441,13 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
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)
+field("checkedSubjectRef", safeCallCheckedSubjectReferenceType)
// One that uses checkedReceiver as a receiver
+field("regularQualifiedAccess", qualifiedAccess, withReplace = true).withTransform()
}
checkedSafeCallSubject.configure {
+field("originalReceiverReference", safeCallReceiverReferenceType)
+field("originalReceiverRef", safeCallOriginalReceiverReferenceType)
}
callableReferenceAccess.configure {
@@ -498,7 +498,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
whenSubjectExpression.configure {
+field("whenSubject", whenSubjectType)
+field("whenRef", whenRefType)
}
wrappedExpression.configure {
@@ -37,9 +37,15 @@ val classIdType = type(ClassId::class)
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 whenExpressionType = generatedType("expressions", "FirWhenExpression")
val expressionType = generatedType("expressions", "FirExpression")
val safeCallCheckedSubjectType = generatedType("expressions", "FirCheckedSafeCallSubject")
val whenRefType = generatedType("", "FirExpressionRef<FirWhenExpression>")
val safeCallOriginalReceiverReferenceType = generatedType("", "FirExpressionRef<FirExpression>")
val safeCallCheckedSubjectReferenceType = generatedType("", "FirExpressionRef<FirCheckedSafeCallSubject>")
val firSessionType = type("fir", "FirSession")
val emptyCfgReferenceType = generatedType("references.impl", "FirEmptyControlFlowGraphReference")
val noReceiverExpressionType = generatedType("expressions.impl", "FirNoReceiverExpression")