[LC] Compute modifiers/annotations lazily (KTIJ-23442)
This commit is contained in:
+17
-13
@@ -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
|
||||
|
||||
+2
-2
@@ -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())
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+11
-9
@@ -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
|
||||
|
||||
+3
-2
@@ -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
|
||||
|
||||
+16
-10
@@ -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
|
||||
|
||||
+8
-8
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+8
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user