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");
+ }
}