FIR IDE: use withValidityAssertion instead of explicit check in FirAnalysisSession

This commit is contained in:
Ilya Kirillov
2020-06-27 00:15:13 +03:00
parent 8368284817
commit 66933ea2fe
@@ -54,22 +54,20 @@ class FirAnalysisSession(
assertIsValid() assertIsValid()
} }
override fun getSmartCastedToTypes(expression: KtExpression): Collection<KtType>? { override fun getSmartCastedToTypes(expression: KtExpression): Collection<KtType>? = withValidityAssertion {
assertIsValid()
// TODO filter out not used smartcasts // TODO filter out not used smartcasts
return expression.getOrBuildFirSafe<FirExpressionWithSmartcast>()?.typesFromSmartCast?.map { it.asTypeInfo() } expression.getOrBuildFirSafe<FirExpressionWithSmartcast>()?.typesFromSmartCast?.map { it.asTypeInfo() }
} }
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
override fun getImplicitReceiverSmartCasts(expression: KtExpression): Collection<ImplicitReceiverSmartCast> { override fun getImplicitReceiverSmartCasts(expression: KtExpression): Collection<ImplicitReceiverSmartCast> = withValidityAssertion {
assertIsValid()
// TODO filter out not used smartcasts // TODO filter out not used smartcasts
val qualifiedExpression = expression.getOrBuildFirSafe<FirQualifiedAccessExpression>() ?: return emptyList() val qualifiedExpression = expression.getOrBuildFirSafe<FirQualifiedAccessExpression>() ?: return emptyList()
if (qualifiedExpression.dispatchReceiver !is FirExpressionWithSmartcast if (qualifiedExpression.dispatchReceiver !is FirExpressionWithSmartcast
&& qualifiedExpression.extensionReceiver !is FirExpressionWithSmartcast && qualifiedExpression.extensionReceiver !is FirExpressionWithSmartcast
) return emptyList() ) return emptyList()
val session = expression.session val session = expression.session
return buildList { buildList {
(qualifiedExpression.dispatchReceiver as? FirExpressionWithSmartcast)?.let { smartCasted -> (qualifiedExpression.dispatchReceiver as? FirExpressionWithSmartcast)?.let { smartCasted ->
ImplicitReceiverSmartCast( ImplicitReceiverSmartCast(
smartCasted.typesFromSmartCast.map { it.asTypeInfo() }, smartCasted.typesFromSmartCast.map { it.asTypeInfo() },
@@ -86,15 +84,13 @@ class FirAnalysisSession(
} }
override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType { override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType = withValidityAssertion {
assertIsValid()
val firDeclaration = declaration.getOrBuildFirOfType<FirCallableDeclaration<*>>() val firDeclaration = declaration.getOrBuildFirOfType<FirCallableDeclaration<*>>()
return firDeclaration.returnTypeRef.coneType.asTypeInfo() firDeclaration.returnTypeRef.coneType.asTypeInfo()
} }
override fun getKtExpressionType(expression: KtExpression): KtType { override fun getKtExpressionType(expression: KtExpression): KtType = withValidityAssertion {
assertIsValid() expression.getOrBuildFirOfType<FirExpression>().typeRef.coneType.asTypeInfo()
return expression.getOrBuildFirOfType<FirExpression>().typeRef.coneType.asTypeInfo()
} }
override fun isSubclassOf(klass: KtClassOrObject, superClassId: ClassId): Boolean { override fun isSubclassOf(klass: KtClassOrObject, superClassId: ClassId): Boolean {
@@ -106,19 +102,16 @@ class FirAnalysisSession(
return result return result
} }
override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> { override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> = withValidityAssertion {
assertIsValid() LowLevelFirApiFacade.getDiagnosticsFor(element)
return LowLevelFirApiFacade.getDiagnosticsFor(element)
} }
override fun resolveCall(call: KtBinaryExpression): CallInfo? { override fun resolveCall(call: KtBinaryExpression): CallInfo? = withValidityAssertion {
assertIsValid()
val firCall = call.getOrBuildFirSafe<FirFunctionCall>() ?: return null val firCall = call.getOrBuildFirSafe<FirFunctionCall>() ?: return null
return resolveCall(firCall, call) resolveCall(firCall, call)
} }
override fun resolveCall(call: KtCallExpression): CallInfo? { override fun resolveCall(call: KtCallExpression): CallInfo? = withValidityAssertion {
assertIsValid()
val firCall = when (val fir = call.getOrBuildFir()) { val firCall = when (val fir = call.getOrBuildFir()) {
is FirFunctionCall -> fir is FirFunctionCall -> fir
is FirSafeCallExpression -> fir.regularQualifiedAccess as? FirFunctionCall is FirSafeCallExpression -> fir.regularQualifiedAccess as? FirFunctionCall