[FIR] Refactor transform*UsingSmartcastInfo
This commit is contained in:
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
|
||||||
|
|||||||
Reference in New Issue
Block a user