[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.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.applyIf import org.jetbrains.kotlin.utils.addToStdlib.applyIf
context(KtAnalysisSession) context(KtAnalysisSession)
@@ -49,22 +50,25 @@ internal open class SymbolLightClass(
} }
private val _modifierList: PsiModifierList? by lazyPub { private val _modifierList: PsiModifierList? by lazyPub {
val lazyModifiers = lazy {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel)) buildSet {
classOrObjectSymbol.computeSimpleModality()?.run { add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
modifiers.add(this) addIfNotNull(classOrObjectSymbol.computeSimpleModality())
} if (!isTopLevel && !classOrObjectSymbol.isInner) {
if (!isTopLevel && !classOrObjectSymbol.isInner) { add(PsiModifier.STATIC)
modifiers.add(PsiModifier.STATIC) }
}
} }
val annotations = classOrObjectSymbol.computeAnnotations( val lazyAnnotations = lazyPub {
parent = this@SymbolLightClass, classOrObjectSymbol.computeAnnotations(
nullability = NullabilityType.Unknown, parent = this@SymbolLightClass,
annotationUseSiteTarget = null, nullability = NullabilityType.Unknown,
) annotationUseSiteTarget = null,
)
}
SymbolLightClassModifierList(this@SymbolLightClass, modifiers, annotations) SymbolLightClassModifierList(this@SymbolLightClass, lazyModifiers, lazyAnnotations)
} }
override fun getModifierList(): PsiModifierList? = _modifierList override fun getModifierList(): PsiModifierList? = _modifierList
@@ -58,8 +58,8 @@ internal class SymbolLightClassForEnumEntry(
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList( SymbolLightClassModifierList(
containingDeclaration = this, containingDeclaration = this,
modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL), lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)),
annotations = emptyList() lazyAnnotations = lazyOf(emptyList())
) )
} }
@@ -66,18 +66,20 @@ class SymbolLightClassForFacade(
if (multiFileClass) if (multiFileClass)
return@lazyPub LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) 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 { val lazyAnnotations = lazyPub {
it.computeAnnotations( fileSymbols.flatMap {
this@SymbolLightClassForFacade, it.computeAnnotations(
NullabilityType.Unknown, this@SymbolLightClassForFacade,
AnnotationUseSiteTarget.FILE, NullabilityType.Unknown,
includeAnnotationsWithoutSite = false AnnotationUseSiteTarget.FILE,
) includeAnnotationsWithoutSite = false
)
}
} }
SymbolLightClassModifierList(this@SymbolLightClassForFacade, modifiers, annotations) SymbolLightClassModifierList(this@SymbolLightClassForFacade, lazyModifiers, lazyAnnotations)
} }
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
@@ -31,8 +31,9 @@ internal class SymbolLightClassForInterfaceDefaultImpls(
override fun getTypeParameters(): Array<PsiTypeParameter> = emptyArray() override fun getTypeParameters(): Array<PsiTypeParameter> = emptyArray()
private val _modifierList: PsiModifierList? by lazyPub { private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL) val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL))
SymbolLightClassModifierList(this@SymbolLightClassForInterfaceDefaultImpls, modifiers, emptyList()) val lazyAnnotations = lazyOf(emptyList<PsiAnnotation>())
SymbolLightClassModifierList(this@SymbolLightClassForInterfaceDefaultImpls, lazyModifiers, lazyAnnotations)
} }
override fun getModifierList(): PsiModifierList? = _modifierList override fun getModifierList(): PsiModifierList? = _modifierList
@@ -34,19 +34,25 @@ internal abstract class SymbolLightInterfaceOrAnnotationClass(
} }
private val _modifierList: PsiModifierList? by lazyPub { private val _modifierList: PsiModifierList? by lazyPub {
val lazyModifiers = lazy {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel), PsiModifier.ABSTRACT) buildSet {
if (!isTopLevel && !classOrObjectSymbol.isInner) { add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
modifiers.add(PsiModifier.STATIC) add(PsiModifier.ABSTRACT)
if (!isTopLevel && !classOrObjectSymbol.isInner) {
add(PsiModifier.STATIC)
}
}
} }
val annotations = classOrObjectSymbol.computeAnnotations( val lazyAnnotations = lazyPub {
parent = this@SymbolLightInterfaceOrAnnotationClass, classOrObjectSymbol.computeAnnotations(
nullability = NullabilityType.Unknown, parent = this@SymbolLightInterfaceOrAnnotationClass,
annotationUseSiteTarget = null, nullability = NullabilityType.Unknown,
) annotationUseSiteTarget = null,
)
}
SymbolLightClassModifierList(this@SymbolLightInterfaceOrAnnotationClass, modifiers, annotations) SymbolLightClassModifierList(this@SymbolLightInterfaceOrAnnotationClass, lazyModifiers, lazyAnnotations)
} }
override fun getModifierList(): PsiModifierList? = _modifierList 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.PsiAnnotation
import com.intellij.psi.PsiModifierListOwner 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.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
@@ -15,21 +16,20 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner
internal class SymbolLightClassModifierList<T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>>( internal class SymbolLightClassModifierList<T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>>(
containingDeclaration: T, containingDeclaration: T,
private val modifiers: Set<String>, private val lazyModifiers: Lazy<Set<String>>,
private val annotations: List<PsiAnnotation> lazyAnnotations: Lazy<List<PsiAnnotation>>
) : SymbolLightModifierList<T>(containingDeclaration) { ) : SymbolLightModifierList<T>(containingDeclaration) {
init { private val lazyAnnotations = lazy {
annotations.forEach { lazyAnnotations.value
(it as? KtLightElementBase)?.parent = this .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>? override val givenAnnotations: List<KtLightAbstractAnnotation>?
get() = invalidAccess() 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 findAnnotation(qualifiedName: String) = annotations.firstOrNull { it.qualifiedName == qualifiedName }
override fun equals(other: Any?): Boolean = this === other override fun equals(other: Any?): Boolean = this === other
@@ -44,7 +44,7 @@ internal class SymbolLightParameter(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(this, emptySet(), _annotations) SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations))
} }
override fun isVarArgs() = parameterSymbol.isVararg override fun isVarArgs() = parameterSymbol.isVararg
@@ -78,7 +78,7 @@ internal class SymbolLightParameterForReceiver private constructor(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(this, emptySet(), _annotations) SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations))
} }
private val _type: PsiType by lazyPub { private val _type: PsiType by lazyPub {
@@ -51,7 +51,7 @@ internal class SymbolLightSetterParameter(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(this, emptySet(), _annotations) SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations))
} }
override fun isVarArgs() = false override fun isVarArgs() = false
@@ -50,12 +50,14 @@ internal class SymbolLightSuspendContinuationParameter(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val annotations = val lazyAnnotations = lazy {
if (functionSymbol.visibility.isPrivateOrPrivateToThis()) emptyList() else if (functionSymbol.visibility.isPrivateOrPrivateToThis())
listOf( emptyList()
SymbolLightSimpleAnnotation(NotNull::class.java.name, this@SymbolLightSuspendContinuationParameter) else
) listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, this@SymbolLightSuspendContinuationParameter))
SymbolLightClassModifierList(this, emptySet(), annotations) }
SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyAnnotations)
} }
override fun hasModifierProperty(p0: String): Boolean = false override fun hasModifierProperty(p0: String): Boolean = false