FIR: Rework processing AugmentedArraySetCall
Previously (few commits earlier), it contained two versions of receiver (lhs) generated separately for each desugaring version that looked a bit redundant. Now, at FIR building stage we just don't create desugaring sub-trees, instead they are being built during bodies transformation and that seems to be much convenient there, since we don't need to reverse-engineer get-set-operator version to check if containing calls are successful (as we just built those calls and retain them) Semantically, this changes may only change how data flow works for such statements (see changed compatibilityResolveWithVarargAndOperatorCall.kt) ^KT-50861 Relates
This commit is contained in:
+4
-2
@@ -19,10 +19,12 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
abstract class FirAugmentedArraySetCall : FirPureAbstractElement(), FirStatement {
|
||||
abstract override val source: KtSourceElement?
|
||||
abstract override val annotations: List<FirAnnotation>
|
||||
abstract val assignCall: FirFunctionCall
|
||||
abstract val setGetBlock: FirBlock
|
||||
abstract val lhsGetCall: FirFunctionCall
|
||||
abstract val rhs: FirExpression
|
||||
abstract val rhs2: FirExpression
|
||||
abstract val operation: FirOperation
|
||||
abstract val calleeReference: FirReference
|
||||
abstract val arrayAccessSource: KtSourceElement?
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAugmentedArraySetCall(this, data)
|
||||
|
||||
|
||||
+9
-5
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAugmentedArraySetCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirOperation
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirAugmentedArraySetCallImpl
|
||||
@@ -28,19 +28,23 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
class FirAugmentedArraySetCallBuilder : FirAnnotationContainerBuilder {
|
||||
override var source: KtSourceElement? = null
|
||||
override val annotations: MutableList<FirAnnotation> = mutableListOf()
|
||||
lateinit var assignCall: FirFunctionCall
|
||||
lateinit var setGetBlock: FirBlock
|
||||
lateinit var lhsGetCall: FirFunctionCall
|
||||
lateinit var rhs: FirExpression
|
||||
lateinit var rhs2: FirExpression
|
||||
lateinit var operation: FirOperation
|
||||
var calleeReference: FirReference = FirStubReference
|
||||
var arrayAccessSource: KtSourceElement? = null
|
||||
|
||||
override fun build(): FirAugmentedArraySetCall {
|
||||
return FirAugmentedArraySetCallImpl(
|
||||
source,
|
||||
annotations,
|
||||
assignCall,
|
||||
setGetBlock,
|
||||
lhsGetCall,
|
||||
rhs,
|
||||
rhs2,
|
||||
operation,
|
||||
calleeReference,
|
||||
arrayAccessSource,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+11
-7
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
|
||||
import org.jetbrains.kotlin.KtSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAugmentedArraySetCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirOperation
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
@@ -22,22 +22,26 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
internal class FirAugmentedArraySetCallImpl(
|
||||
override val source: KtSourceElement?,
|
||||
override val annotations: MutableList<FirAnnotation>,
|
||||
override var assignCall: FirFunctionCall,
|
||||
override var setGetBlock: FirBlock,
|
||||
override var lhsGetCall: FirFunctionCall,
|
||||
override var rhs: FirExpression,
|
||||
override var rhs2: FirExpression,
|
||||
override val operation: FirOperation,
|
||||
override var calleeReference: FirReference,
|
||||
override val arrayAccessSource: KtSourceElement?,
|
||||
) : FirAugmentedArraySetCall() {
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
annotations.forEach { it.accept(visitor, data) }
|
||||
assignCall.accept(visitor, data)
|
||||
setGetBlock.accept(visitor, data)
|
||||
lhsGetCall.accept(visitor, data)
|
||||
rhs.accept(visitor, data)
|
||||
rhs2.accept(visitor, data)
|
||||
calleeReference.accept(visitor, data)
|
||||
}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAugmentedArraySetCallImpl {
|
||||
transformAnnotations(transformer, data)
|
||||
assignCall = assignCall.transform(transformer, data)
|
||||
setGetBlock = setGetBlock.transform(transformer, data)
|
||||
lhsGetCall = lhsGetCall.transform(transformer, data)
|
||||
rhs = rhs.transform(transformer, data)
|
||||
rhs2 = rhs2.transform(transformer, data)
|
||||
calleeReference = calleeReference.transform(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir
|
||||
|
||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.KtSourceElement
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fakeElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
fun FirVariable.toQualifiedAccess(): FirQualifiedAccessExpression = buildPropertyAccessExpression {
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
source = this@toQualifiedAccess.source?.fakeElement(KtFakeSourceElementKind.ReferenceInAtomicQualifiedAccess)
|
||||
name = this@toQualifiedAccess.name
|
||||
resolvedSymbol = this@toQualifiedAccess.symbol
|
||||
}
|
||||
}
|
||||
|
||||
fun generateTemporaryVariable(
|
||||
moduleData: FirModuleData,
|
||||
source: KtSourceElement?,
|
||||
name: Name,
|
||||
initializer: FirExpression,
|
||||
typeRef: FirTypeRef? = null,
|
||||
extractedAnnotations: Collection<FirAnnotation>? = null,
|
||||
): FirVariable =
|
||||
buildProperty {
|
||||
this.source = source
|
||||
this.moduleData = moduleData
|
||||
origin = FirDeclarationOrigin.Source
|
||||
returnTypeRef = typeRef ?: buildImplicitTypeRef {
|
||||
this.source = source
|
||||
}
|
||||
this.name = name
|
||||
this.initializer = initializer
|
||||
symbol = FirPropertySymbol(name)
|
||||
isVar = false
|
||||
isLocal = true
|
||||
status = FirDeclarationStatusImpl(Visibilities.Local, Modality.FINAL)
|
||||
if (extractedAnnotations != null) {
|
||||
// LT extracts annotations ahead.
|
||||
// PSI extracts annotations on demand. Use a similar util in [PsiConversionUtils]
|
||||
annotations.addAll(extractedAnnotations)
|
||||
}
|
||||
}
|
||||
|
||||
fun generateTemporaryVariable(
|
||||
moduleData: FirModuleData,
|
||||
source: KtSourceElement?,
|
||||
specialName: String,
|
||||
initializer: FirExpression,
|
||||
extractedAnnotations: Collection<FirAnnotation>? = null,
|
||||
): FirVariable =
|
||||
generateTemporaryVariable(
|
||||
moduleData,
|
||||
source,
|
||||
Name.special("<$specialName>"),
|
||||
initializer,
|
||||
null,
|
||||
extractedAnnotations,
|
||||
)
|
||||
@@ -20,7 +20,10 @@ import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.references.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -1302,7 +1305,11 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
|
||||
override fun visitAugmentedArraySetCall(augmentedArraySetCall: FirAugmentedArraySetCall) {
|
||||
augmentedArraySetCall.annotations.renderAnnotations()
|
||||
print("ArraySet:[")
|
||||
augmentedArraySetCall.assignCall.accept(this)
|
||||
augmentedArraySetCall.lhsGetCall.accept(this)
|
||||
print(" ")
|
||||
print(augmentedArraySetCall.operation.operator)
|
||||
print(" ")
|
||||
augmentedArraySetCall.rhs.accept(this)
|
||||
print("]")
|
||||
}
|
||||
|
||||
|
||||
+5
-2
@@ -461,10 +461,13 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
}
|
||||
|
||||
augmentedArraySetCall.configure {
|
||||
+field("assignCall", functionCall)
|
||||
+field("setGetBlock", block)
|
||||
+field("lhsGetCall", functionCall)
|
||||
+field("rhs", expression)
|
||||
+field("rhs2", expression)
|
||||
+field("operation", operationType)
|
||||
// Used for resolution errors reporting in case
|
||||
+field("calleeReference", reference, withReplace = true)
|
||||
+field("arrayAccessSource", sourceElementType, nullable = true)
|
||||
}
|
||||
|
||||
classReferenceExpression.configure {
|
||||
|
||||
Reference in New Issue
Block a user