[SLC] extract LazyModifiersBox to separate file
^KT-56046
This commit is contained in:
committed by
Space Team
parent
16caeafa98
commit
f2a33bf4b0
+81
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 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.light.classes.symbol.modifierLists
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiModifier
|
||||||
|
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.KtSymbolWithVisibility
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.analyzeForLightClasses
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.computeSimpleModality
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.restoreSymbolOrThrowIfDisposed
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember
|
||||||
|
import org.jetbrains.kotlin.utils.keysToMap
|
||||||
|
import java.util.concurrent.atomic.AtomicReference
|
||||||
|
|
||||||
|
internal typealias LazyModifiersComputer = (modifier: String) -> Map<String, Boolean>?
|
||||||
|
|
||||||
|
internal class LazyModifiersBox(
|
||||||
|
initialValue: Map<String, Boolean>,
|
||||||
|
private val computer: LazyModifiersComputer,
|
||||||
|
) {
|
||||||
|
private val modifiersMapReference: AtomicReference<PersistentMap<String, Boolean>> = AtomicReference(initialValue.toPersistentHashMap())
|
||||||
|
|
||||||
|
fun hasModifier(modifier: String): Boolean {
|
||||||
|
modifiersMapReference.get()[modifier]?.let { return it }
|
||||||
|
val newValues = computer(modifier) ?: mapOf(modifier to false)
|
||||||
|
modifiersMapReference.updateAndGet {
|
||||||
|
it.putAll(newValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
return newValues[modifier] ?: error("Inconsistent state: $modifier")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
internal val VISIBILITY_MODIFIERS = setOf(PsiModifier.PUBLIC, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PRIVATE)
|
||||||
|
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_MAP: PersistentMap<String, Boolean> =
|
||||||
|
MODALITY_MODIFIERS.keysToMap {
|
||||||
|
false
|
||||||
|
}.toPersistentHashMap()
|
||||||
|
|
||||||
|
internal fun computeVisibilityForMember(
|
||||||
|
ktModule: KtModule,
|
||||||
|
declarationPointer: KtSymbolPointer<KtSymbolWithVisibility>,
|
||||||
|
): PersistentMap<String, Boolean> {
|
||||||
|
val visibility = analyzeForLightClasses(ktModule) {
|
||||||
|
declarationPointer.restoreSymbolOrThrowIfDisposed().toPsiVisibilityForMember()
|
||||||
|
}
|
||||||
|
|
||||||
|
return VISIBILITY_MODIFIERS_MAP.with(visibility)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun computeSimpleModality(
|
||||||
|
ktModule: KtModule,
|
||||||
|
declarationPointer: KtSymbolPointer<KtSymbolWithModality>,
|
||||||
|
): PersistentMap<String, Boolean> {
|
||||||
|
val modality = analyzeForLightClasses(ktModule) {
|
||||||
|
declarationPointer.restoreSymbolOrThrowIfDisposed().computeSimpleModality()
|
||||||
|
}
|
||||||
|
|
||||||
|
return MODALITY_MODIFIERS_MAP.with(modality)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
internal inline fun PersistentMap<String, Boolean>.with(modifier: String?): PersistentMap<String, Boolean> {
|
||||||
|
return modifier?.let { put(modifier, true) } ?: this
|
||||||
|
}
|
||||||
+1
-69
@@ -7,22 +7,14 @@ 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.KtSymbolWithVisibility
|
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
|
||||||
import org.jetbrains.kotlin.asJava.classes.cannotModify
|
import org.jetbrains.kotlin.asJava.classes.cannotModify
|
||||||
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
|
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
|
import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.*
|
import org.jetbrains.kotlin.light.classes.symbol.invalidAccess
|
||||||
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.utils.keysToMap
|
|
||||||
import java.util.concurrent.atomic.AtomicReference
|
|
||||||
|
|
||||||
internal sealed class SymbolLightModifierList<out T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>> :
|
internal sealed class SymbolLightModifierList<out T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>> :
|
||||||
KtLightElementBase, PsiModifierList, KtLightElement<KtModifierList, PsiModifierListOwner> {
|
KtLightElementBase, PsiModifierList, KtLightElement<KtModifierList, PsiModifierListOwner> {
|
||||||
@@ -88,63 +80,3 @@ internal sealed class SymbolLightModifierList<out T : KtLightElement<KtModifierL
|
|||||||
override fun hasModifierProperty(name: String): Boolean =
|
override fun hasModifierProperty(name: String): Boolean =
|
||||||
staticModifiers?.contains(name) == true || lazyModifiersBox?.hasModifier(name) == true
|
staticModifiers?.contains(name) == true || lazyModifiersBox?.hasModifier(name) == true
|
||||||
}
|
}
|
||||||
|
|
||||||
internal typealias LazyModifiersComputer = (modifier: String) -> Map<String, Boolean>?
|
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
|
||||||
internal inline fun PersistentMap<String, Boolean>.with(modifier: String?): PersistentMap<String, Boolean> {
|
|
||||||
return modifier?.let { put(modifier, true) } ?: this
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class LazyModifiersBox(
|
|
||||||
initialValue: Map<String, Boolean>,
|
|
||||||
private val computer: LazyModifiersComputer,
|
|
||||||
) {
|
|
||||||
private val modifiersMapReference: AtomicReference<PersistentMap<String, Boolean>> = AtomicReference(initialValue.toPersistentHashMap())
|
|
||||||
|
|
||||||
fun hasModifier(modifier: String): Boolean {
|
|
||||||
modifiersMapReference.get()[modifier]?.let { return it }
|
|
||||||
val newValues = computer(modifier) ?: mapOf(modifier to false)
|
|
||||||
modifiersMapReference.updateAndGet {
|
|
||||||
it.putAll(newValues)
|
|
||||||
}
|
|
||||||
|
|
||||||
return newValues[modifier] ?: error("Inconsistent state: $modifier")
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
internal val VISIBILITY_MODIFIERS = setOf(PsiModifier.PUBLIC, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PRIVATE)
|
|
||||||
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_MAP: PersistentMap<String, Boolean> =
|
|
||||||
MODALITY_MODIFIERS.keysToMap {
|
|
||||||
false
|
|
||||||
}.toPersistentHashMap()
|
|
||||||
|
|
||||||
internal fun computeVisibilityForMember(
|
|
||||||
ktModule: KtModule,
|
|
||||||
declarationPointer: KtSymbolPointer<KtSymbolWithVisibility>,
|
|
||||||
): PersistentMap<String, Boolean> {
|
|
||||||
val visibility = analyzeForLightClasses(ktModule) {
|
|
||||||
declarationPointer.restoreSymbolOrThrowIfDisposed().toPsiVisibilityForMember()
|
|
||||||
}
|
|
||||||
|
|
||||||
return VISIBILITY_MODIFIERS_MAP.with(visibility)
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun computeSimpleModality(
|
|
||||||
ktModule: KtModule,
|
|
||||||
declarationPointer: KtSymbolPointer<KtSymbolWithModality>,
|
|
||||||
): PersistentMap<String, Boolean> {
|
|
||||||
val modality = analyzeForLightClasses(ktModule) {
|
|
||||||
declarationPointer.restoreSymbolOrThrowIfDisposed().computeSimpleModality()
|
|
||||||
}
|
|
||||||
|
|
||||||
return MODALITY_MODIFIERS_MAP.with(modality)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user