From 50711d5003d1c3bebab4bb068dea9edc7b750e4e Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 1 Feb 2023 20:42:11 +0100 Subject: [PATCH] [SLC] SymbolPsiArrayInitializerMemberValue: cached computed values ^KT-56046 --- .../annotations/SymbolAnnotationValues.kt | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationValues.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationValues.kt index 4560666e778..3896b73a8c9 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationValues.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationValues.kt @@ -7,22 +7,41 @@ package org.jetbrains.kotlin.light.classes.symbol.annotations import com.intellij.psi.* import org.jetbrains.kotlin.asJava.elements.KtLightElementBase +import org.jetbrains.kotlin.light.classes.symbol.toArrayIfNotEmptyOrDefault import org.jetbrains.kotlin.psi.KtElement +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater internal class SymbolPsiArrayInitializerMemberValue( override val kotlinOrigin: KtElement?, private val lightParent: PsiElement, private val arguments: (SymbolPsiArrayInitializerMemberValue) -> List ) : KtLightElementBase(lightParent), PsiArrayInitializerMemberValue { - override fun getInitializers(): Array { + @Volatile + private var cachedArguments: List? = null + + override fun getInitializers(): Array = + getOrCompareArguments().toArrayIfNotEmptyOrDefault(PsiAnnotationMemberValue.EMPTY_ARRAY) + + private fun getOrCompareArguments(): List { + cachedArguments?.let { return it } + val memberValues = arguments(this) - return if (memberValues.isEmpty()) PsiAnnotationMemberValue.EMPTY_ARRAY else memberValues.toTypedArray() + fieldUpdater.compareAndSet(this, null, memberValues) + return getOrCompareArguments() } override fun getParent(): PsiElement = lightParent override fun isPhysical(): Boolean = false - override fun getText(): String = "{" + initializers.joinToString { it.text } + "}" + override fun getText(): String = "{" + getOrCompareArguments().joinToString { it.text } + "}" + + companion object { + private val fieldUpdater = AtomicReferenceFieldUpdater.newUpdater( + /* tclass = */ SymbolPsiArrayInitializerMemberValue::class.java, + /* vclass = */ List::class.java, + /* fieldName = */ "cachedArguments", + ) + } } internal abstract class SymbolPsiAnnotationMemberValue(