[SLC] migrate from ImmutableHashMap to PersistentHashMap

^KTIJ-23783
This commit is contained in:
Dmitrii Gridin
2022-12-05 16:51:07 +01:00
committed by Space Team
parent 9bc37d7f3f
commit a7390d027a
10 changed files with 43 additions and 50 deletions
@@ -15,6 +15,7 @@ dependencies {
implementation(project(":analysis:project-structure")) implementation(project(":analysis:project-structure"))
implementation(project(":analysis:decompiled:light-classes-for-decompiled")) implementation(project(":analysis:decompiled:light-classes-for-decompiled"))
implementation(intellijCore()) implementation(intellijCore())
implementation(kotlinxCollectionsImmutable())
testImplementation(project(":analysis:decompiled:decompiler-to-file-stubs")) testImplementation(project(":analysis:decompiled:decompiler-to-file-stubs"))
testImplementation(projectTests(":analysis:decompiled:decompiler-to-file-stubs")) testImplementation(projectTests(":analysis:decompiled:decompiler-to-file-stubs"))
@@ -25,8 +25,6 @@ import org.jetbrains.kotlin.light.classes.symbol.modifierLists.LazyModifiersBox
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.with import org.jetbrains.kotlin.light.classes.symbol.modifierLists.with
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForClass import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForClass
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
import org.jetbrains.kotlin.utils.addToStdlib.applyIf import org.jetbrains.kotlin.utils.addToStdlib.applyIf
abstract class SymbolLightClassForNamedClassLike : SymbolLightClassForClassLike<KtNamedClassOrObjectSymbol> { abstract class SymbolLightClassForNamedClassLike : SymbolLightClassForClassLike<KtNamedClassOrObjectSymbol> {
@@ -128,7 +126,7 @@ abstract class SymbolLightClassForNamedClassLike : SymbolLightClassForClassLike<
} }
} }
internal fun computeModifiers(modifier: String): ImmutableMap<String, Boolean>? = when (modifier) { internal fun computeModifiers(modifier: String): Map<String, Boolean>? = when (modifier) {
in LazyModifiersBox.VISIBILITY_MODIFIERS -> { in LazyModifiersBox.VISIBILITY_MODIFIERS -> {
val visibility = withClassOrObjectSymbol { it.toPsiVisibilityForClass(isNested = !isTopLevel) } val visibility = withClassOrObjectSymbol { it.toPsiVisibilityForClass(isNested = !isTopLevel) }
LazyModifiersBox.VISIBILITY_MODIFIERS_MAP.with(visibility) LazyModifiersBox.VISIBILITY_MODIFIERS_MAP.with(visibility)
@@ -137,7 +135,7 @@ abstract class SymbolLightClassForNamedClassLike : SymbolLightClassForClassLike<
in LazyModifiersBox.MODALITY_MODIFIERS -> LazyModifiersBox.computeSimpleModality(ktModule, classOrObjectSymbolPointer) in LazyModifiersBox.MODALITY_MODIFIERS -> LazyModifiersBox.computeSimpleModality(ktModule, classOrObjectSymbolPointer)
PsiModifier.STATIC -> { PsiModifier.STATIC -> {
val isStatic = !isTopLevel && !isInner val isStatic = !isTopLevel && !isInner
ImmutableHashMap.of(modifier, isStatic) mapOf(modifier to isStatic)
} }
else -> null else -> null
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.light.classes.symbol.modifierLists.with
import org.jetbrains.kotlin.light.classes.symbol.nonExistentType import org.jetbrains.kotlin.light.classes.symbol.nonExistentType
import org.jetbrains.kotlin.light.classes.symbol.withSymbol import org.jetbrains.kotlin.light.classes.symbol.withSymbol
import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
internal class SymbolLightFieldForObject private constructor( internal class SymbolLightFieldForObject private constructor(
containingClass: SymbolLightClassForClassLike<*>, containingClass: SymbolLightClassForClassLike<*>,
@@ -65,7 +64,7 @@ internal class SymbolLightFieldForObject private constructor(
} }
} }
private fun computeModifiers(modifier: String): ImmutableMap<String, Boolean>? { private fun computeModifiers(modifier: String): Map<String, Boolean>? {
if (modifier !in LazyModifiersBox.VISIBILITY_MODIFIERS) return null if (modifier !in LazyModifiersBox.VISIBILITY_MODIFIERS) return null
return LazyModifiersBox.computeVisibilityForMember(ktModule, objectSymbolPointer) return LazyModifiersBox.computeVisibilityForMember(ktModule, objectSymbolPointer)
} }
@@ -32,8 +32,6 @@ import org.jetbrains.kotlin.name.JvmNames.TRANSIENT_ANNOTATION_CLASS_ID
import org.jetbrains.kotlin.name.JvmNames.VOLATILE_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.name.JvmNames.VOLATILE_ANNOTATION_CLASS_ID
import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtCallableDeclaration
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
internal class SymbolLightFieldForProperty private constructor( internal class SymbolLightFieldForProperty private constructor(
private val propertySymbolPointer: KtSymbolPointer<KtPropertySymbol>, private val propertySymbolPointer: KtSymbolPointer<KtPropertySymbol>,
@@ -95,7 +93,7 @@ internal class SymbolLightFieldForProperty private constructor(
override fun getName(): String = fieldName override fun getName(): String = fieldName
private fun computeModifiers(modifier: String): ImmutableMap<String, Boolean>? = when (modifier) { private fun computeModifiers(modifier: String): Map<String, Boolean>? = when (modifier) {
in LazyModifiersBox.VISIBILITY_MODIFIERS -> LazyModifiersBox.computeVisibilityForMember(ktModule, propertySymbolPointer) in LazyModifiersBox.VISIBILITY_MODIFIERS -> LazyModifiersBox.computeVisibilityForMember(ktModule, propertySymbolPointer)
in LazyModifiersBox.MODALITY_MODIFIERS -> { in LazyModifiersBox.MODALITY_MODIFIERS -> {
val modality = withPropertySymbol { propertySymbol -> val modality = withPropertySymbol { propertySymbol ->
@@ -113,17 +111,17 @@ internal class SymbolLightFieldForProperty private constructor(
PsiModifier.STATIC -> { PsiModifier.STATIC -> {
val isStatic = forceStatic || isTopLevel val isStatic = forceStatic || isTopLevel
ImmutableHashMap.of(modifier, isStatic) mapOf(modifier to isStatic)
} }
PsiModifier.VOLATILE -> withPropertySymbol { propertySymbol -> PsiModifier.VOLATILE -> withPropertySymbol { propertySymbol ->
val hasAnnotation = propertySymbol.hasAnnotation(VOLATILE_ANNOTATION_CLASS_ID, null) val hasAnnotation = propertySymbol.hasAnnotation(VOLATILE_ANNOTATION_CLASS_ID, null)
ImmutableHashMap.of(modifier, hasAnnotation) mapOf(modifier to hasAnnotation)
} }
PsiModifier.TRANSIENT -> withPropertySymbol { propertySymbol -> PsiModifier.TRANSIENT -> withPropertySymbol { propertySymbol ->
val hasAnnotation = propertySymbol.hasAnnotation(TRANSIENT_ANNOTATION_CLASS_ID, null) val hasAnnotation = propertySymbol.hasAnnotation(TRANSIENT_ANNOTATION_CLASS_ID, null)
ImmutableHashMap.of(modifier, hasAnnotation) mapOf(modifier to hasAnnotation)
} }
else -> null else -> null
@@ -131,7 +129,7 @@ internal class SymbolLightFieldForProperty private constructor(
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val initializerValue = if (takePropertyVisibility) { val initializerValue = if (takePropertyVisibility) {
ImmutableHashMap.empty() emptyMap()
} else { } else {
LazyModifiersBox.VISIBILITY_MODIFIERS_MAP.with(PsiModifier.PRIVATE) LazyModifiersBox.VISIBILITY_MODIFIERS_MAP.with(PsiModifier.PRIVATE)
} }
@@ -39,8 +39,6 @@ import org.jetbrains.kotlin.psi.KtCallableDeclaration
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyAccessor
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
internal class SymbolLightAccessorMethod private constructor( internal class SymbolLightAccessorMethod private constructor(
@@ -157,7 +155,7 @@ internal class SymbolLightAccessorMethod private constructor(
annotationsFromProperty + annotationsFromAccessor annotationsFromProperty + annotationsFromAccessor
} }
private fun computeModifiers(modifier: String): ImmutableMap<String, Boolean>? { private fun computeModifiers(modifier: String): Map<String, Boolean>? {
return when (modifier) { return when (modifier) {
in LazyModifiersBox.VISIBILITY_MODIFIERS -> LazyModifiersBox.computeVisibilityForMember(ktModule, propertyAccessorSymbolPointer) in LazyModifiersBox.VISIBILITY_MODIFIERS -> LazyModifiersBox.computeVisibilityForMember(ktModule, propertyAccessorSymbolPointer)
@@ -176,7 +174,7 @@ internal class SymbolLightAccessorMethod private constructor(
isTopLevel || hasJvmStaticAnnotation() isTopLevel || hasJvmStaticAnnotation()
} }
ImmutableHashMap.of(modifier, isStatic) mapOf(modifier to isStatic)
} }
else -> null else -> null
@@ -16,8 +16,6 @@ import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForEnum
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.LazyModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.LazyModifiersBox
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.with import org.jetbrains.kotlin.light.classes.symbol.modifierLists.with
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
import java.util.* import java.util.*
internal class SymbolLightConstructor( internal class SymbolLightConstructor(
@@ -48,7 +46,7 @@ internal class SymbolLightConstructor(
val initialValue = if (containingClass is SymbolLightClassForEnumEntry) { val initialValue = if (containingClass is SymbolLightClassForEnumEntry) {
LazyModifiersBox.VISIBILITY_MODIFIERS_MAP.with(PsiModifier.PACKAGE_LOCAL) LazyModifiersBox.VISIBILITY_MODIFIERS_MAP.with(PsiModifier.PACKAGE_LOCAL)
} else { } else {
ImmutableHashMap.empty() emptyMap()
} }
SymbolLightMemberModifierList( SymbolLightMemberModifierList(
@@ -66,7 +64,7 @@ internal class SymbolLightConstructor(
} }
} }
private fun computeModifiers(modifier: String): ImmutableMap<String, Boolean>? { private fun computeModifiers(modifier: String): Map<String, Boolean>? {
if (modifier !in LazyModifiersBox.VISIBILITY_MODIFIERS) return null if (modifier !in LazyModifiersBox.VISIBILITY_MODIFIERS) return null
return LazyModifiersBox.computeVisibilityForMember(ktModule, functionSymbolPointer) return LazyModifiersBox.computeVisibilityForMember(ktModule, functionSymbolPointer)
} }
@@ -25,8 +25,6 @@ import org.jetbrains.kotlin.light.classes.symbol.modifierLists.with
import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightTypeParameterList import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightTypeParameterList
import org.jetbrains.kotlin.name.JvmNames.STRICTFP_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.name.JvmNames.STRICTFP_ANNOTATION_CLASS_ID
import org.jetbrains.kotlin.name.JvmNames.SYNCHRONIZED_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.name.JvmNames.SYNCHRONIZED_ANNOTATION_CLASS_ID
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
import java.util.* import java.util.*
@@ -90,7 +88,7 @@ internal class SymbolLightSimpleMethod(
) )
} }
private fun computeModifiers(modifier: String): ImmutableMap<String, Boolean>? = when (modifier) { private fun computeModifiers(modifier: String): Map<String, Boolean>? = when (modifier) {
in LazyModifiersBox.MODALITY_MODIFIERS -> { in LazyModifiersBox.MODALITY_MODIFIERS -> {
ifInlineOnly { return modifiersForInlineOnlyCase() } ifInlineOnly { return modifiersForInlineOnlyCase() }
val modality = if (isTopLevel) PsiModifier.FINAL else withFunctionSymbol { it.computeSimpleModality() } val modality = if (isTopLevel) PsiModifier.FINAL else withFunctionSymbol { it.computeSimpleModality() }
@@ -110,25 +108,25 @@ internal class SymbolLightSimpleMethod(
isTopLevel || withFunctionSymbol { it.hasJvmStaticAnnotation() } isTopLevel || withFunctionSymbol { it.hasJvmStaticAnnotation() }
} }
ImmutableHashMap.of(modifier, isStatic) mapOf(modifier to isStatic)
} }
PsiModifier.NATIVE -> { PsiModifier.NATIVE -> {
ifInlineOnly { return null } ifInlineOnly { return null }
val isExternal = functionDeclaration?.hasModifier(KtTokens.EXTERNAL_KEYWORD) ?: withFunctionSymbol { it.isExternal } val isExternal = functionDeclaration?.hasModifier(KtTokens.EXTERNAL_KEYWORD) ?: withFunctionSymbol { it.isExternal }
ImmutableHashMap.of(modifier, isExternal) mapOf(modifier to isExternal)
} }
PsiModifier.STRICTFP -> { PsiModifier.STRICTFP -> {
ifInlineOnly { return null } ifInlineOnly { return null }
val hasAnnotation = withFunctionSymbol { it.hasAnnotation(STRICTFP_ANNOTATION_CLASS_ID, null) } val hasAnnotation = withFunctionSymbol { it.hasAnnotation(STRICTFP_ANNOTATION_CLASS_ID, null) }
ImmutableHashMap.of(modifier, hasAnnotation) mapOf(modifier to hasAnnotation)
} }
PsiModifier.SYNCHRONIZED -> { PsiModifier.SYNCHRONIZED -> {
ifInlineOnly { return null } ifInlineOnly { return null }
val hasAnnotation = withFunctionSymbol { it.hasAnnotation(SYNCHRONIZED_ANNOTATION_CLASS_ID, null) } val hasAnnotation = withFunctionSymbol { it.hasAnnotation(SYNCHRONIZED_ANNOTATION_CLASS_ID, null) }
ImmutableHashMap.of(modifier, hasAnnotation) mapOf(modifier to hasAnnotation)
} }
else -> null else -> null
@@ -140,8 +138,8 @@ internal class SymbolLightSimpleMethod(
} }
} }
private fun modifiersForInlineOnlyCase(): ImmutableMap<String, Boolean> = private fun modifiersForInlineOnlyCase(): Map<String, Boolean> =
LazyModifiersBox.MODALITY_MODIFIERS_MAP.merge(LazyModifiersBox.VISIBILITY_MODIFIERS_MAP) LazyModifiersBox.MODALITY_MODIFIERS_MAP.putAll(LazyModifiersBox.VISIBILITY_MODIFIERS_MAP)
.with(PsiModifier.FINAL) .with(PsiModifier.FINAL)
.with(PsiModifier.PRIVATE) .with(PsiModifier.PRIVATE)
@@ -10,12 +10,11 @@ import com.intellij.psi.PsiModifierList
import com.intellij.psi.PsiModifierListOwner import com.intellij.psi.PsiModifierListOwner
import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
internal class SymbolLightClassModifierList<T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>> : SymbolLightModifierList<T> { internal class SymbolLightClassModifierList<T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>> : SymbolLightModifierList<T> {
constructor( constructor(
containingDeclaration: T, containingDeclaration: T,
initialValue: ImmutableHashMap<String, Boolean> = ImmutableHashMap.empty(), initialValue: Map<String, Boolean> = emptyMap(),
lazyModifiersComputer: LazyModifiersComputer, lazyModifiersComputer: LazyModifiersComputer,
annotationsComputer: ((PsiModifierList) -> List<PsiAnnotation>)?, annotationsComputer: ((PsiModifierList) -> List<PsiAnnotation>)?,
) : super(containingDeclaration, initialValue, lazyModifiersComputer, annotationsComputer) ) : super(containingDeclaration, initialValue, lazyModifiersComputer, annotationsComputer)
@@ -14,12 +14,11 @@ import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase
import org.jetbrains.kotlin.psi.KtModifierList import org.jetbrains.kotlin.psi.KtModifierList
import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyAccessor
import org.jetbrains.kotlin.psi.psiUtil.hasBody import org.jetbrains.kotlin.psi.psiUtil.hasBody
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
internal class SymbolLightMemberModifierList<T : KtLightMember<*>> : SymbolLightModifierList<T> { internal class SymbolLightMemberModifierList<T : KtLightMember<*>> : SymbolLightModifierList<T> {
constructor( constructor(
containingDeclaration: T, containingDeclaration: T,
initialValue: ImmutableHashMap<String, Boolean> = ImmutableHashMap.empty(), initialValue: Map<String, Boolean> = emptyMap(),
lazyModifiersComputer: LazyModifiersComputer, lazyModifiersComputer: LazyModifiersComputer,
annotationsComputer: ((PsiModifierList) -> List<PsiAnnotation>)?, annotationsComputer: ((PsiModifierList) -> List<PsiAnnotation>)?,
) : super(containingDeclaration, initialValue, lazyModifiersComputer, annotationsComputer) ) : super(containingDeclaration, initialValue, lazyModifiersComputer, annotationsComputer)
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.light.classes.symbol.modifierLists
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.util.IncorrectOperationException import com.intellij.util.IncorrectOperationException
import kotlinx.collections.immutable.PersistentMap
import kotlinx.collections.immutable.toPersistentHashMap
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
@@ -19,9 +21,6 @@ import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
import org.jetbrains.kotlin.light.classes.symbol.* import org.jetbrains.kotlin.light.classes.symbol.*
import org.jetbrains.kotlin.psi.KtModifierList import org.jetbrains.kotlin.psi.KtModifierList
import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
import org.jetbrains.kotlin.util.javaslang.getOrNull
import org.jetbrains.kotlin.utils.keysToMap import org.jetbrains.kotlin.utils.keysToMap
import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.atomic.AtomicReference
@@ -34,7 +33,7 @@ internal open class SymbolLightModifierList<out T : KtLightElement<KtModifierLis
constructor( constructor(
owner: T, owner: T,
initialValue: ImmutableHashMap<String, Boolean>, initialValue: Map<String, Boolean>,
lazyModifiersComputer: LazyModifiersComputer, lazyModifiersComputer: LazyModifiersComputer,
annotationsComputer: ((PsiModifierList) -> List<PsiAnnotation>)?, annotationsComputer: ((PsiModifierList) -> List<PsiAnnotation>)?,
) : super(owner) { ) : super(owner) {
@@ -81,41 +80,47 @@ internal open class SymbolLightModifierList<out T : KtLightElement<KtModifierLis
staticModifiers?.contains(name) == true || lazyModifiersBox?.hasModifier(name) == true staticModifiers?.contains(name) == true || lazyModifiersBox?.hasModifier(name) == true
} }
internal typealias LazyModifiersComputer = (modifier: String) -> ImmutableMap<String, Boolean>? internal typealias LazyModifiersComputer = (modifier: String) -> Map<String, Boolean>?
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
internal inline fun ImmutableHashMap<String, Boolean>.with(modifier: String?): ImmutableHashMap<String, Boolean> { internal inline fun PersistentMap<String, Boolean>.with(modifier: String?): PersistentMap<String, Boolean> {
return modifier?.let { put(modifier, true) } ?: this return modifier?.let { put(modifier, true) } ?: this
} }
internal class LazyModifiersBox( internal class LazyModifiersBox(
initialValue: ImmutableHashMap<String, Boolean>, initialValue: Map<String, Boolean>,
private val computer: LazyModifiersComputer, private val computer: LazyModifiersComputer,
) { ) {
private val modifiersMapReference: AtomicReference<ImmutableHashMap<String, Boolean>> = AtomicReference(initialValue) private val modifiersMapReference: AtomicReference<PersistentMap<String, Boolean>> = AtomicReference(initialValue.toPersistentHashMap())
fun hasModifier(modifier: String): Boolean { fun hasModifier(modifier: String): Boolean {
modifiersMapReference.get().getOrNull(modifier)?.let { return it } modifiersMapReference.get()[modifier]?.let { return it }
val newValues = computer(modifier) ?: ImmutableHashMap.of(modifier, false) val newValues = computer(modifier) ?: mapOf(modifier to false)
do { do {
val currentMap = modifiersMapReference.get() val currentMap = modifiersMapReference.get()
val newMap = currentMap.merge(newValues) val newMap = currentMap.putAll(newValues)
} while (!modifiersMapReference.compareAndSet(currentMap, newMap)) } while (!modifiersMapReference.compareAndSet(currentMap, newMap))
return newValues.getOrNull(modifier) ?: error("Inconsistent state: $modifier") return newValues[modifier] ?: error("Inconsistent state: $modifier")
} }
companion object { companion object {
internal val VISIBILITY_MODIFIERS = setOf(PsiModifier.PUBLIC, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PRIVATE) internal val VISIBILITY_MODIFIERS = setOf(PsiModifier.PUBLIC, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PRIVATE)
internal val VISIBILITY_MODIFIERS_MAP = ImmutableHashMap.ofAll(VISIBILITY_MODIFIERS.keysToMap { false }) internal val VISIBILITY_MODIFIERS_MAP: PersistentMap<String, Boolean> =
VISIBILITY_MODIFIERS.keysToMap {
false
}.toPersistentHashMap()
internal val MODALITY_MODIFIERS = setOf(PsiModifier.FINAL, PsiModifier.ABSTRACT) internal val MODALITY_MODIFIERS = setOf(PsiModifier.FINAL, PsiModifier.ABSTRACT)
internal val MODALITY_MODIFIERS_MAP = ImmutableHashMap.ofAll(MODALITY_MODIFIERS.keysToMap { false }) internal val MODALITY_MODIFIERS_MAP: PersistentMap<String, Boolean> =
MODALITY_MODIFIERS.keysToMap {
false
}.toPersistentHashMap()
internal fun computeVisibilityForMember( internal fun computeVisibilityForMember(
ktModule: KtModule, ktModule: KtModule,
declarationPointer: KtSymbolPointer<KtSymbolWithVisibility>, declarationPointer: KtSymbolPointer<KtSymbolWithVisibility>,
): ImmutableMap<String, Boolean> { ): PersistentMap<String, Boolean> {
val visibility = analyzeForLightClasses(ktModule) { val visibility = analyzeForLightClasses(ktModule) {
declarationPointer.restoreSymbolOrThrowIfDisposed().toPsiVisibilityForMember() declarationPointer.restoreSymbolOrThrowIfDisposed().toPsiVisibilityForMember()
} }
@@ -126,7 +131,7 @@ internal class LazyModifiersBox(
internal fun computeSimpleModality( internal fun computeSimpleModality(
ktModule: KtModule, ktModule: KtModule,
declarationPointer: KtSymbolPointer<KtSymbolWithModality>, declarationPointer: KtSymbolPointer<KtSymbolWithModality>,
): ImmutableMap<String, Boolean> { ): PersistentMap<String, Boolean> {
val visibility = analyzeForLightClasses(ktModule) { val visibility = analyzeForLightClasses(ktModule) {
declarationPointer.restoreSymbolOrThrowIfDisposed().computeSimpleModality() declarationPointer.restoreSymbolOrThrowIfDisposed().computeSimpleModality()
} }