FIR IDE: make KtExpressionTypeProvider work for more cases

Currently it doesn't work for the following

* labeled expression
* annotated expressions
* object literal expressions
This commit is contained in:
Tianyu Geng
2021-06-15 14:24:03 -07:00
committed by TeamCityServer
parent 3aa6cb25ba
commit 030749eaeb
@@ -35,7 +35,7 @@ internal class KtFirExpressionTypeProvider(
}
override fun getKtExpressionType(expression: KtExpression): KtType = withValidityAssertion {
when (val fir = expression.getOrBuildFir(firResolveState)) {
when (val fir = expression.unwrap().getOrBuildFir(firResolveState)) {
is FirExpression -> fir.typeRef.coneType.asKtType()
is FirNamedReference -> fir.getReferencedElementType().asKtType()
is FirStatement -> with(analysisSession) { builtinTypes.UNIT }
@@ -43,6 +43,15 @@ internal class KtFirExpressionTypeProvider(
}
}
private fun KtExpression.unwrap(): KtExpression {
return when (this) {
is KtLabeledExpression -> baseExpression?.unwrap()
is KtAnnotatedExpression -> baseExpression?.unwrap()
is KtObjectLiteralExpression -> objectDeclaration
else -> null
} ?: this
}
override fun getExpectedType(expression: PsiElement): KtType? {
val expectedType = getExpectedTypeByReturnExpression(expression)
?: getExpressionTypeByIfOrBooleanCondition(expression)