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
@@ -43,10 +43,10 @@ class VariableStorage(private val session: FirSession) {
}
private fun FirElement.unwrapElement(): FirElement = when (this) {
is FirWhenSubjectExpression -> whenSubject.whenExpression.let { it.subjectVariable ?: it.subject }?.unwrapElement() ?: this
is FirWhenSubjectExpression -> whenRef.value.let { it.subjectVariable ?: it.subject }?.unwrapElement() ?: this
is FirExpressionWithSmartcast -> originalExpression.unwrapElement()
is FirSafeCallExpression -> regularQualifiedAccess.unwrapElement()
is FirCheckedSafeCallSubject -> originalReceiverReference.value.unwrapElement()
is FirCheckedSafeCallSubject -> originalReceiverRef.value.unwrapElement()
else -> this
}
@@ -71,7 +71,7 @@ class VariableStorage(private val session: FirSession) {
val isThisReference: Boolean
val expression: FirQualifiedAccess? = when (originalFir) {
is FirQualifiedAccessExpression -> originalFir
is FirWhenSubjectExpression -> originalFir.whenSubject.whenExpression.subject as? FirQualifiedAccessExpression
is FirWhenSubjectExpression -> originalFir.whenRef.value.subject as? FirQualifiedAccessExpression
is FirVariableAssignment -> originalFir
else -> null
}
@@ -122,7 +122,7 @@ internal val FirElement.symbol: AbstractFirBasedSymbol<*>?
get() = when (this) {
is FirResolvable -> symbol
is FirSymbolOwner<*> -> symbol
is FirWhenSubjectExpression -> whenSubject.whenExpression.subject?.symbol
is FirWhenSubjectExpression -> whenRef.value.subject?.symbol
is FirSafeCallExpression -> regularQualifiedAccess.symbol
else -> null
}?.takeIf { this is FirThisReceiverExpression || (it !is FirFunctionSymbol<*> && it !is FirAccessorSymbol) }
@@ -136,7 +136,7 @@ class IntegerLiteralTypeApproximationTransformer(
data: ConeKotlinType?
): CompositeTransformResult<FirStatement> {
val newReceiver =
checkedSafeCallSubject.originalReceiverReference.value.transform<FirExpression, ConeKotlinType?>(this, data).single
checkedSafeCallSubject.originalReceiverRef.value.transform<FirExpression, ConeKotlinType?>(this, data).single
checkedSafeCallSubject.propagateTypeFromOriginalReceiver(newReceiver, session)
return super.transformCheckedSafeCallSubject(checkedSafeCallSubject, data)
}
@@ -125,7 +125,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
whenSubjectExpression: FirWhenSubjectExpression,
data: ResolutionMode
): CompositeTransformResult<FirStatement> {
val parentWhen = whenSubjectExpression.whenSubject.whenExpression
val parentWhen = whenSubjectExpression.whenRef.value
val subjectType = parentWhen.subject?.resultType ?: parentWhen.subjectVariable?.returnTypeRef
if (subjectType != null) {
whenSubjectExpression.resultType = subjectType
@@ -177,7 +177,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
dataFlowAnalyzer.enterSafeCallAfterNullCheck(safeCallExpression)
safeCallExpression.apply {
checkedSubject.value.propagateTypeFromOriginalReceiver(receiver, components.session)
checkedSubjectRef.value.propagateTypeFromOriginalReceiver(receiver, components.session)
transformRegularQualifiedAccess(this@FirExpressionsResolveTransformer, data)
propagateTypeFromQualifiedAccessAfterNullCheck(receiver, session)
}