diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt index ca757bf3d16..f2c785dcca5 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt @@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.argumentMapping import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -40,12 +41,12 @@ internal class KtFirExpressionTypeProvider( } override fun getKtExpressionType(expression: KtExpression): KtType = withValidityAssertion { - val coneType = when (val fir = expression.getOrBuildFir(firResolveState)) { - is FirExpression -> fir.typeRef.coneType - is FirNamedReference -> fir.getReferencedElementType() + when (val fir = expression.getOrBuildFir(firResolveState)) { + is FirExpression -> fir.typeRef.coneType.asKtType() + is FirNamedReference -> fir.getReferencedElementType().asKtType() + is FirLoop -> with(analysisSession) { builtinTypes.UNIT } else -> error("Unexpected ${fir::class}") } - coneType.asKtType() } private fun FirNamedReference.getReferencedElementType(): ConeKotlinType { diff --git a/idea/idea-frontend-fir/testData/components/expressionType/forExpression.kt b/idea/idea-frontend-fir/testData/components/expressionType/forExpression.kt new file mode 100644 index 00000000000..60c61653d7c --- /dev/null +++ b/idea/idea-frontend-fir/testData/components/expressionType/forExpression.kt @@ -0,0 +1,8 @@ +fun x(): Int { + for(i in 1..2) {} +} +// RESULT + +// expression: for(i in 1..2) {} +// type: kotlin.Unit + diff --git a/idea/idea-frontend-fir/testData/components/expressionType/whileExpression.kt b/idea/idea-frontend-fir/testData/components/expressionType/whileExpression.kt new file mode 100644 index 00000000000..938ae5b08c7 --- /dev/null +++ b/idea/idea-frontend-fir/testData/components/expressionType/whileExpression.kt @@ -0,0 +1,8 @@ +fun x(): Int { + while(true) {} +} +// RESULT + +// expression: while(true) {} +// type: kotlin.Unit + diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/components/HLExpressionTypeTestGenerated.java b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/components/HLExpressionTypeTestGenerated.java index d9d06e6d401..f4a24990067 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/components/HLExpressionTypeTestGenerated.java +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/components/HLExpressionTypeTestGenerated.java @@ -33,4 +33,15 @@ public class HLExpressionTypeTestGenerated extends AbstractHLExpressionTypeTest public void testAssignmentExpressionTarget() throws Exception { runTest("idea/idea-frontend-fir/testData/components/expressionType/assignmentExpressionTarget.kt"); } + + @TestMetadata("forExpression.kt") + public void testForExpression() throws Exception { + runTest("idea/idea-frontend-fir/testData/components/expressionType/forExpression.kt"); + } + + + @TestMetadata("whileExpression.kt") + public void testWhileExpression() throws Exception { + runTest("idea/idea-frontend-fir/testData/components/expressionType/whileExpression.kt"); + } }