[FIR][LightTree] Pass source elements in FOR loop parts

This commit is contained in:
Andrey Zinovyev
2021-04-16 14:52:58 +03:00
committed by TeamCityServer
parent 8bbdc20809
commit 0d99b01dcb
2 changed files with 15 additions and 8 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.KtNodeTypes.*
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.builder.generateResolvedAccessExpression import org.jetbrains.kotlin.fir.builder.generateResolvedAccessExpression
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.fakeElement
import org.jetbrains.kotlin.fir.lightTree.fir.DestructuringDeclaration import org.jetbrains.kotlin.fir.lightTree.fir.DestructuringDeclaration
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtSingleValueToken
@@ -123,7 +125,9 @@ fun generateDestructuringBlock(
returnTypeRef = entry.returnTypeRef returnTypeRef = entry.returnTypeRef
name = entry.name name = entry.name
initializer = buildComponentCall { initializer = buildComponentCall {
explicitReceiver = generateResolvedAccessExpression(null, container) val componentCallSource = entry.source?.fakeElement(FirFakeSourceElementKind.DesugaredComponentFunctionCall)
source = componentCallSource
explicitReceiver = generateResolvedAccessExpression(componentCallSource, container)
componentIndex = index + 1 componentIndex = index + 1
} }
this.isVar = isVar this.isVar = isVar
@@ -259,7 +259,7 @@ class ExpressionsConverter(
buildFunctionCall { buildFunctionCall {
source = binaryExpression.toFirSourceElement() source = binaryExpression.toFirSourceElement()
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
source = this@buildFunctionCall.source source = operationReferenceSource ?: this@buildFunctionCall.source
name = conventionCallName ?: operationTokenName.nameAsSafeName() name = conventionCallName ?: operationTokenName.nameAsSafeName()
} }
explicitReceiver = leftArgAsFir explicitReceiver = leftArgAsFir
@@ -954,7 +954,9 @@ class ExpressionsConverter(
return buildBlock { return buildBlock {
source = fakeSource source = fakeSource
val iteratorVal = generateTemporaryVariable( val iteratorVal = generateTemporaryVariable(
this@ExpressionsConverter.baseSession, fakeSource, ITERATOR_NAME, this@ExpressionsConverter.baseSession,
rangeExpression.source,
ITERATOR_NAME,
buildFunctionCall { buildFunctionCall {
source = fakeSource source = fakeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
@@ -983,11 +985,12 @@ class ExpressionsConverter(
buildBlock block@{ buildBlock block@{
source = blockNode?.toFirSourceElement() source = blockNode?.toFirSourceElement()
statements += convertLoopBody(blockNode).statements statements += convertLoopBody(blockNode).statements
if (parameter == null) return@block val valueParameter = parameter ?: return@block
val multiDeclaration = parameter!!.destructuringDeclaration val multiDeclaration = valueParameter.destructuringDeclaration
val firLoopParameter = generateTemporaryVariable( val firLoopParameter = generateTemporaryVariable(
this@ExpressionsConverter.baseSession, null, this@ExpressionsConverter.baseSession,
if (multiDeclaration != null) DESTRUCTURING_NAME else parameter!!.firValueParameter.name, valueParameter.firValueParameter.source,
if (multiDeclaration != null) DESTRUCTURING_NAME else valueParameter.firValueParameter.name,
buildFunctionCall { buildFunctionCall {
source = fakeSource source = fakeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
@@ -996,7 +999,7 @@ class ExpressionsConverter(
} }
explicitReceiver = generateResolvedAccessExpression(fakeSource, iteratorVal) explicitReceiver = generateResolvedAccessExpression(fakeSource, iteratorVal)
}, },
parameter!!.firValueParameter.returnTypeRef valueParameter.firValueParameter.returnTypeRef
) )
if (multiDeclaration != null) { if (multiDeclaration != null) {
val destructuringBlock = generateDestructuringBlock( val destructuringBlock = generateDestructuringBlock(