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:
committed by
TeamCityServer
parent
3aa6cb25ba
commit
030749eaeb
+10
-1
@@ -35,7 +35,7 @@ internal class KtFirExpressionTypeProvider(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getKtExpressionType(expression: KtExpression): KtType = withValidityAssertion {
|
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 FirExpression -> fir.typeRef.coneType.asKtType()
|
||||||
is FirNamedReference -> fir.getReferencedElementType().asKtType()
|
is FirNamedReference -> fir.getReferencedElementType().asKtType()
|
||||||
is FirStatement -> with(analysisSession) { builtinTypes.UNIT }
|
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? {
|
override fun getExpectedType(expression: PsiElement): KtType? {
|
||||||
val expectedType = getExpectedTypeByReturnExpression(expression)
|
val expectedType = getExpectedTypeByReturnExpression(expression)
|
||||||
?: getExpressionTypeByIfOrBooleanCondition(expression)
|
?: getExpressionTypeByIfOrBooleanCondition(expression)
|
||||||
|
|||||||
Reference in New Issue
Block a user