[LC] Compute modifiers/annotations lazily (KTIJ-23442)

This commit is contained in:
Yan Zhulanow
2022-10-27 23:30:26 +09:00
committed by teamcity
parent 48fbb62658
commit 04ccd3710f
10 changed files with 68 additions and 53 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.DataClassResolver
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
context(KtAnalysisSession)
@@ -49,22 +50,25 @@ internal open class SymbolLightClass(
}
private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
classOrObjectSymbol.computeSimpleModality()?.run {
modifiers.add(this)
}
if (!isTopLevel && !classOrObjectSymbol.isInner) {
modifiers.add(PsiModifier.STATIC)
val lazyModifiers = lazy {
buildSet {
add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
addIfNotNull(classOrObjectSymbol.computeSimpleModality())
if (!isTopLevel && !classOrObjectSymbol.isInner) {
add(PsiModifier.STATIC)
}
}
}
val annotations = classOrObjectSymbol.computeAnnotations(
parent = this@SymbolLightClass,
nullability = NullabilityType.Unknown,
annotationUseSiteTarget = null,
)
val lazyAnnotations = lazyPub {
classOrObjectSymbol.computeAnnotations(
parent = this@SymbolLightClass,
nullability = NullabilityType.Unknown,
annotationUseSiteTarget = null,
)
}
SymbolLightClassModifierList(this@SymbolLightClass, modifiers, annotations)
SymbolLightClassModifierList(this@SymbolLightClass, lazyModifiers, lazyAnnotations)
}
override fun getModifierList(): PsiModifierList? = _modifierList
@@ -58,8 +58,8 @@ internal class SymbolLightClassForEnumEntry(
private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(
containingDeclaration = this,
modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL),
annotations = emptyList()
lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)),
lazyAnnotations = lazyOf(emptyList())
)
}
@@ -66,18 +66,20 @@ class SymbolLightClassForFacade(
if (multiFileClass)
return@lazyPub LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL)
val modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)
val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.FINAL))
val annotations = fileSymbols.flatMap {
it.computeAnnotations(
this@SymbolLightClassForFacade,
NullabilityType.Unknown,
AnnotationUseSiteTarget.FILE,
includeAnnotationsWithoutSite = false
)
val lazyAnnotations = lazyPub {
fileSymbols.flatMap {
it.computeAnnotations(
this@SymbolLightClassForFacade,
NullabilityType.Unknown,
AnnotationUseSiteTarget.FILE,
includeAnnotationsWithoutSite = false
)
}
}
SymbolLightClassModifierList(this@SymbolLightClassForFacade, modifiers, annotations)
SymbolLightClassModifierList(this@SymbolLightClassForFacade, lazyModifiers, lazyAnnotations)
}
override fun getModifierList(): PsiModifierList = _modifierList
@@ -31,8 +31,9 @@ internal class SymbolLightClassForInterfaceDefaultImpls(
override fun getTypeParameters(): Array<PsiTypeParameter> = emptyArray()
private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)
SymbolLightClassModifierList(this@SymbolLightClassForInterfaceDefaultImpls, modifiers, emptyList())
val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL))
val lazyAnnotations = lazyOf(emptyList<PsiAnnotation>())
SymbolLightClassModifierList(this@SymbolLightClassForInterfaceDefaultImpls, lazyModifiers, lazyAnnotations)
}
override fun getModifierList(): PsiModifierList? = _modifierList
@@ -34,19 +34,25 @@ internal abstract class SymbolLightInterfaceOrAnnotationClass(
}
private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel), PsiModifier.ABSTRACT)
if (!isTopLevel && !classOrObjectSymbol.isInner) {
modifiers.add(PsiModifier.STATIC)
val lazyModifiers = lazy {
buildSet {
add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
add(PsiModifier.ABSTRACT)
if (!isTopLevel && !classOrObjectSymbol.isInner) {
add(PsiModifier.STATIC)
}
}
}
val annotations = classOrObjectSymbol.computeAnnotations(
parent = this@SymbolLightInterfaceOrAnnotationClass,
nullability = NullabilityType.Unknown,
annotationUseSiteTarget = null,
)
val lazyAnnotations = lazyPub {
classOrObjectSymbol.computeAnnotations(
parent = this@SymbolLightInterfaceOrAnnotationClass,
nullability = NullabilityType.Unknown,
annotationUseSiteTarget = null,
)
}
SymbolLightClassModifierList(this@SymbolLightInterfaceOrAnnotationClass, modifiers, annotations)
SymbolLightClassModifierList(this@SymbolLightInterfaceOrAnnotationClass, lazyModifiers, lazyAnnotations)
}
override fun getModifierList(): PsiModifierList? = _modifierList
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.light.classes.symbol.modifierLists
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiModifierListOwner
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
@@ -15,21 +16,20 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner
internal class SymbolLightClassModifierList<T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>>(
containingDeclaration: T,
private val modifiers: Set<String>,
private val annotations: List<PsiAnnotation>
private val lazyModifiers: Lazy<Set<String>>,
lazyAnnotations: Lazy<List<PsiAnnotation>>
) : SymbolLightModifierList<T>(containingDeclaration) {
init {
annotations.forEach {
(it as? KtLightElementBase)?.parent = this
}
private val lazyAnnotations = lazy {
lazyAnnotations.value
.onEach { (it as? KtLightElementBase)?.parent = this }
}
override fun hasModifierProperty(name: String): Boolean = name in modifiers
override fun hasModifierProperty(name: String): Boolean = name in lazyModifiers.value
override val givenAnnotations: List<KtLightAbstractAnnotation>?
get() = invalidAccess()
override fun getAnnotations(): Array<out PsiAnnotation> = annotations.toTypedArray()
override fun getAnnotations(): Array<out PsiAnnotation> = lazyAnnotations.value.toTypedArray()
override fun findAnnotation(qualifiedName: String) = annotations.firstOrNull { it.qualifiedName == qualifiedName }
override fun equals(other: Any?): Boolean = this === other
@@ -44,7 +44,7 @@ internal class SymbolLightParameter(
override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(this, emptySet(), _annotations)
SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations))
}
override fun isVarArgs() = parameterSymbol.isVararg
@@ -78,7 +78,7 @@ internal class SymbolLightParameterForReceiver private constructor(
override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(this, emptySet(), _annotations)
SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations))
}
private val _type: PsiType by lazyPub {
@@ -51,7 +51,7 @@ internal class SymbolLightSetterParameter(
override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(this, emptySet(), _annotations)
SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations))
}
override fun isVarArgs() = false
@@ -50,12 +50,14 @@ internal class SymbolLightSuspendContinuationParameter(
override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub {
val annotations =
if (functionSymbol.visibility.isPrivateOrPrivateToThis()) emptyList() else
listOf(
SymbolLightSimpleAnnotation(NotNull::class.java.name, this@SymbolLightSuspendContinuationParameter)
)
SymbolLightClassModifierList(this, emptySet(), annotations)
val lazyAnnotations = lazy {
if (functionSymbol.visibility.isPrivateOrPrivateToThis())
emptyList()
else
listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, this@SymbolLightSuspendContinuationParameter))
}
SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyAnnotations)
}
override fun hasModifierProperty(p0: String): Boolean = false