[FIR] Fix exponential analysis of augmented array access calls

^KT-50861 Fixed
This commit is contained in:
Dmitriy Novozhilov
2022-03-07 10:40:14 +03:00
committed by teamcity
parent c4735f9f29
commit ade2307345
40 changed files with 919 additions and 288 deletions
@@ -21,7 +21,6 @@ abstract class FirAugmentedArraySetCall : FirPureAbstractElement(), FirStatement
abstract override val annotations: List<FirAnnotation>
abstract val lhsGetCall: FirFunctionCall
abstract val rhs: FirExpression
abstract val rhs2: FirExpression
abstract val operation: FirOperation
abstract val calleeReference: FirReference
abstract val arrayAccessSource: KtSourceElement?
@@ -30,7 +30,6 @@ class FirAugmentedArraySetCallBuilder : FirAnnotationContainerBuilder {
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var lhsGetCall: FirFunctionCall
lateinit var rhs: FirExpression
lateinit var rhs2: FirExpression
lateinit var operation: FirOperation
var calleeReference: FirReference = FirStubReference
var arrayAccessSource: KtSourceElement? = null
@@ -41,7 +40,6 @@ class FirAugmentedArraySetCallBuilder : FirAnnotationContainerBuilder {
annotations,
lhsGetCall,
rhs,
rhs2,
operation,
calleeReference,
arrayAccessSource,
@@ -24,7 +24,6 @@ internal class FirAugmentedArraySetCallImpl(
override val annotations: MutableList<FirAnnotation>,
override var lhsGetCall: FirFunctionCall,
override var rhs: FirExpression,
override var rhs2: FirExpression,
override val operation: FirOperation,
override var calleeReference: FirReference,
override val arrayAccessSource: KtSourceElement?,
@@ -33,7 +32,6 @@ internal class FirAugmentedArraySetCallImpl(
annotations.forEach { it.accept(visitor, data) }
lhsGetCall.accept(visitor, data)
rhs.accept(visitor, data)
rhs2.accept(visitor, data)
calleeReference.accept(visitor, data)
}
@@ -41,7 +39,6 @@ internal class FirAugmentedArraySetCallImpl(
transformAnnotations(transformer, data)
lhsGetCall = lhsGetCall.transform(transformer, data)
rhs = rhs.transform(transformer, data)
rhs2 = rhs2.transform(transformer, data)
calleeReference = calleeReference.transform(transformer, data)
return this
}
@@ -11,6 +11,7 @@ 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.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
@@ -25,11 +26,14 @@ import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
import org.jetbrains.kotlin.name.Name
fun FirVariable.toQualifiedAccess(): FirQualifiedAccessExpression = buildPropertyAccessExpression {
val fakeSource = this@toQualifiedAccess.source?.fakeElement(KtFakeSourceElementKind.ReferenceInAtomicQualifiedAccess)
source = fakeSource
calleeReference = buildResolvedNamedReference {
source = this@toQualifiedAccess.source?.fakeElement(KtFakeSourceElementKind.ReferenceInAtomicQualifiedAccess)
source = fakeSource
name = this@toQualifiedAccess.name
resolvedSymbol = this@toQualifiedAccess.symbol
}
typeRef = this@toQualifiedAccess.returnTypeRef
}
fun generateTemporaryVariable(
@@ -39,7 +43,7 @@ fun generateTemporaryVariable(
initializer: FirExpression,
typeRef: FirTypeRef? = null,
extractedAnnotations: Collection<FirAnnotation>? = null,
): FirVariable =
): FirProperty =
buildProperty {
this.source = source
this.moduleData = moduleData
@@ -66,7 +70,7 @@ fun generateTemporaryVariable(
specialName: String,
initializer: FirExpression,
extractedAnnotations: Collection<FirAnnotation>? = null,
): FirVariable =
): FirProperty =
generateTemporaryVariable(
moduleData,
source,
@@ -463,7 +463,6 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
augmentedArraySetCall.configure {
+field("lhsGetCall", functionCall)
+field("rhs", expression)
+field("rhs2", expression)
+field("operation", operationType)
// Used for resolution errors reporting in case
+field("calleeReference", reference, withReplace = true)