From f27611939ef47228340050bcbb1c315aa0bfdf30 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 16 Jan 2020 13:20:40 +0300 Subject: [PATCH] Raw FIR builder: fix situation with explicit type of for parameter Before this commit we omitted for parameter type, even if it was stated explicitly. This also fixes PSI consistency test --- .../fir/lightTree/converter/ExpressionsConverter.kt | 3 ++- .../org/jetbrains/kotlin/fir/builder/ConversionUtils.kt | 4 ++-- .../org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 3 ++- .../fir/psi2fir/testData/rawBuilder/expressions/for.kt | 6 ++++++ .../fir/psi2fir/testData/rawBuilder/expressions/for.txt | 9 +++++++++ .../fir/builder/RawFirBuilderTotalKotlinTestCase.kt | 2 +- 6 files changed, 22 insertions(+), 5 deletions(-) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 60885e50fd5..d93496598e7 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -776,7 +776,8 @@ class ExpressionsConverter( FirFunctionCallImpl(null).apply { calleeReference = FirSimpleNamedReference(null, Name.identifier("next"), null) explicitReceiver = generateResolvedAccessExpression(null, iteratorVal) - } + }, + parameter!!.firValueParameter.returnTypeRef ) if (multiDeclaration != null) { val destructuringBlock = generateDestructuringBlock( diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index ad0611911b0..3cad6817461 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -291,12 +291,12 @@ internal fun generateDestructuringBlock( } fun generateTemporaryVariable( - session: FirSession, source: FirSourceElement?, name: Name, initializer: FirExpression + session: FirSession, source: FirSourceElement?, name: Name, initializer: FirExpression, typeRef: FirTypeRef? = null ): FirVariable<*> = FirPropertyImpl( source, session, - FirImplicitTypeRefImpl(source), + typeRef ?: FirImplicitTypeRefImpl(source), null, name, initializer, diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index fc0cfe28faa..0e349ed74d9 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1189,7 +1189,8 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va FirFunctionCallImpl(loopSource).apply { calleeReference = FirSimpleNamedReference(loopSource, Name.identifier("next"), null) explicitReceiver = generateResolvedAccessExpression(loopSource, iteratorVal) - } + }, + parameter.typeReference.toFirOrImplicitType() ) if (multiDeclaration != null) { val destructuringBlock = generateDestructuringBlock( diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.kt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.kt index b2940c2d127..a9505c4fe76 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.kt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.kt @@ -18,3 +18,9 @@ fun baz(set: Set) { println("x = $x y = $y") } } + +fun withParameter(list: List) { + for (s: Some in list) { + println(s) + } +} diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt index a81070669d8..d943b736bc8 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt @@ -58,3 +58,12 @@ FILE: for.kt } } + public? final? fun withParameter(list: List): R|kotlin/Unit| { + lval : = list# + lval : = R|/|.iterator#() + while(R|/|.hasNext#()) { + lval s: Some = R|/|.next#() + println#(s#) + } + + } diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt index e3c201e3d90..bda5f2aaa8f 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt @@ -267,7 +267,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() { println("Not traversed ${element.javaClass}: ${element.text}") val traversedParent = element.parents.firstOrNull { it in psiSetViaFir } if (traversedParent != null) { - println("(traversed parent: ${traversedParent.javaClass})") + println("(traversed parent: ${traversedParent.javaClass} ${traversedParent.text})") } } println(firFile.render())