[FIR] Refactor transform*UsingSmartcastInfo

This commit is contained in:
Kirill Rakhman
2023-03-17 14:42:57 +01:00
committed by Space Team
parent 45d2424ad8
commit a434b73fc8
@@ -114,7 +114,7 @@ fun FirFunction.constructFunctionType(kind: FunctionTypeKind? = null): ConeLooku
fun FirAnonymousFunction.constructFunctionTypeRef(session: FirSession, kind: FunctionTypeKind? = null): FirResolvedTypeRef { fun FirAnonymousFunction.constructFunctionTypeRef(session: FirSession, kind: FunctionTypeKind? = null): FirResolvedTypeRef {
var diagnostic: ConeDiagnostic? = null var diagnostic: ConeDiagnostic? = null
val kinds = session.functionTypeService.extractAllSpecialKindsForFunction(symbol) val kinds = session.functionTypeService.extractAllSpecialKindsForFunction(symbol)
val kindFromDeclaration = when(kinds.size) { val kindFromDeclaration = when (kinds.size) {
0 -> null 0 -> null
1 -> kinds.single() 1 -> kinds.single()
else -> { else -> {
@@ -370,35 +370,28 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: FirBasedSymbol<*>, make
fun BodyResolveComponents.transformQualifiedAccessUsingSmartcastInfo( fun BodyResolveComponents.transformQualifiedAccessUsingSmartcastInfo(
qualifiedAccessExpression: FirQualifiedAccessExpression qualifiedAccessExpression: FirQualifiedAccessExpression
): FirExpression { ): FirExpression {
val (stability, typesFromSmartCast) = val (stability, typesFromSmartCast) = dataFlowAnalyzer.getTypeUsingSmartcastInfo(qualifiedAccessExpression)
dataFlowAnalyzer.getTypeUsingSmartcastInfo(qualifiedAccessExpression) ?: return qualifiedAccessExpression
?: return qualifiedAccessExpression
val builder = transformExpressionUsingSmartcastInfo( return transformExpressionUsingSmartcastInfo(qualifiedAccessExpression, stability, typesFromSmartCast) ?: qualifiedAccessExpression
qualifiedAccessExpression,
stability, typesFromSmartCast
) ?: return qualifiedAccessExpression
return builder.build()
} }
fun BodyResolveComponents.transformWhenSubjectExpressionUsingSmartcastInfo( fun BodyResolveComponents.transformWhenSubjectExpressionUsingSmartcastInfo(
whenSubjectExpression: FirWhenSubjectExpression whenSubjectExpression: FirWhenSubjectExpression
): FirExpression { ): FirExpression {
val (stability, typesFromSmartCast) = dataFlowAnalyzer.getTypeUsingSmartcastInfo(whenSubjectExpression) ?: return whenSubjectExpression val (stability, typesFromSmartCast) = dataFlowAnalyzer.getTypeUsingSmartcastInfo(whenSubjectExpression)
val builder = transformExpressionUsingSmartcastInfo( ?: return whenSubjectExpression
whenSubjectExpression,
stability, typesFromSmartCast return transformExpressionUsingSmartcastInfo(whenSubjectExpression, stability, typesFromSmartCast) ?: whenSubjectExpression
) ?: return whenSubjectExpression
return builder.build()
} }
fun BodyResolveComponents.transformDesugaredAssignmentValueUsingSmartcastInfo( fun BodyResolveComponents.transformDesugaredAssignmentValueUsingSmartcastInfo(
expression: FirDesugaredAssignmentValueReferenceExpression expression: FirDesugaredAssignmentValueReferenceExpression
): FirExpression { ): FirExpression {
val (stability, typesFromSmartCast) = dataFlowAnalyzer.getTypeUsingSmartcastInfo(expression.expressionRef.value) ?: return expression val (stability, typesFromSmartCast) = dataFlowAnalyzer.getTypeUsingSmartcastInfo(expression.expressionRef.value)
val builder = transformExpressionUsingSmartcastInfo( ?: return expression
expression, stability, typesFromSmartCast
) ?: return expression return transformExpressionUsingSmartcastInfo(expression, stability, typesFromSmartCast) ?: expression
return builder.build()
} }
private val ConeKotlinType.isKindOfNothing private val ConeKotlinType.isKindOfNothing
@@ -416,7 +409,7 @@ private fun <T : FirExpression> BodyResolveComponents.transformExpressionUsingSm
expression: T, expression: T,
stability: PropertyStability, stability: PropertyStability,
typesFromSmartCast: MutableList<ConeKotlinType> typesFromSmartCast: MutableList<ConeKotlinType>
): FirSmartCastExpressionBuilder? { ): FirSmartCastExpression? {
val smartcastStability = stability.impliedSmartcastStability val smartcastStability = stability.impliedSmartcastStability
?: if (dataFlowAnalyzer.isAccessToUnstableLocalVariable(expression)) { ?: if (dataFlowAnalyzer.isAccessToUnstableLocalVariable(expression)) {
SmartcastStability.CAPTURED_VARIABLE SmartcastStability.CAPTURED_VARIABLE
@@ -458,7 +451,7 @@ private fun <T : FirExpression> BodyResolveComponents.transformExpressionUsingSm
annotations += expression.resultType.annotations annotations += expression.resultType.annotations
delegatedTypeRef = expression.resultType delegatedTypeRef = expression.resultType
} }
return FirSmartCastExpressionBuilder().apply { return buildSmartCastExpression {
originalExpression = expression originalExpression = expression
source = originalExpression.source?.fakeElement(KtFakeSourceElementKind.SmartCastExpression) source = originalExpression.source?.fakeElement(KtFakeSourceElementKind.SmartCastExpression)
smartcastType = intersectedTypeRef smartcastType = intersectedTypeRef
@@ -469,7 +462,7 @@ private fun <T : FirExpression> BodyResolveComponents.transformExpressionUsingSm
} }
} }
return FirSmartCastExpressionBuilder().apply { return buildSmartCastExpression {
originalExpression = expression originalExpression = expression
source = originalExpression.source?.fakeElement(KtFakeSourceElementKind.SmartCastExpression) source = originalExpression.source?.fakeElement(KtFakeSourceElementKind.SmartCastExpression)
smartcastType = intersectedTypeRef smartcastType = intersectedTypeRef