From 6d0570739d89c406310613830d232787f25364be Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 25 Jan 2023 12:35:30 +0100 Subject: [PATCH] [SLC] migrate SymbolLightModifierList to ModifiersBox and AnnotationsBox LazyAnnotationsBox is unused now Will be migrated to it in the next steps ^KT-56046 --- .../SymbolLightClassForClassOrObject.kt | 8 ++- .../classes/SymbolLightClassForEnumEntry.kt | 4 +- .../classes/SymbolLightClassForFacade.kt | 33 +++++----- ...ymbolLightClassForInterfaceDefaultImpls.kt | 4 +- ...LightClassForInterfaceOrAnnotationClass.kt | 26 ++++---- ...htClassForRepeatableAnnotationContainer.kt | 8 ++- .../fields/SymbolLightFieldForEnumEntry.kt | 23 ++++--- .../fields/SymbolLightFieldForObject.kt | 18 +++--- .../methods/SymbolLightAccessorMethod.kt | 4 +- .../symbol/methods/SymbolLightConstructor.kt | 26 ++++---- .../symbol/modifierLists/LazyModifiersBox.kt | 2 +- .../modifierLists/SimpleModifiersBox.kt | 1 + .../SymbolLightClassModifierList.kt | 23 +++---- .../SymbolLightMemberModifierList.kt | 23 +++---- .../modifierLists/SymbolLightModifierList.kt | 62 +++++-------------- .../symbol/parameters/SymbolLightParameter.kt | 31 +++++----- .../SymbolLightParameterForReceiver.kt | 19 +++--- .../parameters/SymbolLightSetterParameter.kt | 35 ++++++----- ...SymbolLightSuspendContinuationParameter.kt | 15 ++--- 19 files changed, 173 insertions(+), 192 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt index 7f1dabcb499..7c7e3bc2963 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassOrObject.kt @@ -26,10 +26,12 @@ import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.light.classes.symbol.NullabilityType +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForEnumEntry import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForObject import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightSimpleMethod +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.LazyModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name @@ -83,11 +85,11 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC manager = manager, ) - private val _modifierList: PsiModifierList? by lazyPub { + private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - lazyModifiersComputer = ::computeModifiers, - annotationsComputer = { modifierList -> + modifiersBox = LazyModifiersBox(computer = ::computeModifiers), + annotationsBox = SimpleAnnotationsBox { modifierList -> withClassOrObjectSymbol { classOrObjectSymbol -> classOrObjectSymbol.computeAnnotations( modifierList = modifierList, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt index b5b55f3c5a6..1132c448a6f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.light.classes.symbol.codeReferences.SymbolLightPsiJavaCodeReferenceElementWithNoReference import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForEnumEntry import org.jetbrains.kotlin.light.classes.symbol.isOriginEquivalentTo +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SimpleModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.psi.KtEnumEntry @@ -52,8 +53,7 @@ internal class SymbolLightClassForEnumEntry( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL), - annotationsComputer = null, + modifiersBox = SimpleModifiersBox(PsiModifier.STATIC, PsiModifier.FINAL), ) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt index 63699874c36..cbc71ba1dc0 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt @@ -27,10 +27,12 @@ import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.light.classes.symbol.NullabilityType import org.jetbrains.kotlin.light.classes.symbol.analyzeForLightClasses +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.annotations.hasInlineOnlyAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmFieldAnnotation import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightField +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SimpleModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind @@ -64,23 +66,24 @@ class SymbolLightClassForFacade( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - staticModifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL), - ) { modifierList -> - if (multiFileClass) { - emptyList() - } else { - withFileSymbols { fileSymbols -> - fileSymbols.flatMap { - it.computeAnnotations( - modifierList = modifierList, - nullability = NullabilityType.Unknown, - annotationUseSiteTarget = AnnotationUseSiteTarget.FILE, - includeAnnotationsWithoutSite = false, - ) + modifiersBox = SimpleModifiersBox(PsiModifier.PUBLIC, PsiModifier.FINAL), + annotationsBox = SimpleAnnotationsBox { modifierList -> + if (multiFileClass) { + emptyList() + } else { + withFileSymbols { fileSymbols -> + fileSymbols.flatMap { + it.computeAnnotations( + modifierList = modifierList, + nullability = NullabilityType.Unknown, + annotationUseSiteTarget = AnnotationUseSiteTarget.FILE, + includeAnnotationsWithoutSite = false, + ) + } } } - } - } + }, + ) } override fun getModifierList(): PsiModifierList = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt index bff01a6605e..af2a47f9f31 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.light.classes.symbol.classes import com.intellij.psi.* import com.intellij.util.IncorrectOperationException +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SimpleModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.load.java.JvmAbi @@ -38,8 +39,7 @@ internal class SymbolLightClassForInterfaceDefaultImpls(private val containingCl override fun computeModifierList(): PsiModifierList = SymbolLightClassModifierList( containingDeclaration = this, - staticModifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL), - annotationsComputer = null, + modifiersBox = SimpleModifiersBox(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL), ) override fun isInterface(): Boolean = false diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt index 61e36339ba8..4a078dcedbd 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.light.classes.symbol.NullabilityType +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.modifierLists.LazyModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList @@ -67,17 +68,20 @@ internal abstract class SymbolLightClassForInterfaceOrAnnotationClass : SymbolLi protected open fun computeModifierList(): PsiModifierList? = SymbolLightClassModifierList( containingDeclaration = this, - initialValue = LazyModifiersBox.MODALITY_MODIFIERS_MAP.with(PsiModifier.ABSTRACT), - lazyModifiersComputer = ::computeModifiers - ) { modifierList -> - withClassOrObjectSymbol { classOrObjectSymbol -> - classOrObjectSymbol.computeAnnotations( - modifierList = modifierList, - nullability = NullabilityType.Unknown, - annotationUseSiteTarget = null, - ) - } - } + modifiersBox = LazyModifiersBox( + initialValue = LazyModifiersBox.MODALITY_MODIFIERS_MAP.with(PsiModifier.ABSTRACT), + computer = ::computeModifiers + ), + annotationsBox = SimpleAnnotationsBox { modifierList -> + withClassOrObjectSymbol { classOrObjectSymbol -> + classOrObjectSymbol.computeAnnotations( + modifierList = modifierList, + nullability = NullabilityType.Unknown, + annotationUseSiteTarget = null, + ) + } + }, + ) private val _modifierList: PsiModifierList? by lazyPub { computeModifierList() diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForRepeatableAnnotationContainer.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForRepeatableAnnotationContainer.kt index b814cfaaeb5..e8259fcf252 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForRepeatableAnnotationContainer.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForRepeatableAnnotationContainer.kt @@ -11,9 +11,11 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.light.classes.symbol.NullabilityType +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightRepeatableAnnotationContainerMethod +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SimpleModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.load.java.JvmAbi @@ -39,9 +41,9 @@ internal class SymbolLightClassForRepeatableAnnotationContainer(private val cont override fun computeModifierList(): PsiModifierList = SymbolLightClassModifierList( containingDeclaration = this, // It is marked as Abstract because all the annotation classes are marked as Abstract - // It is marked as Static because all nested interfaces marked as Static - staticModifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.ABSTRACT), - annotationsComputer = { psiModifierList -> + // It is marked as Static because all nested interfaces are marked as Static + modifiersBox = SimpleModifiersBox(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.ABSTRACT), + annotationsBox = SimpleAnnotationsBox { psiModifierList -> val annotations = withClassOrObjectSymbol { classOrObjectSymbol -> classOrObjectSymbol.computeAnnotations( modifierList = psiModifierList, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt index 0e73be514cd..8b4dafa25f6 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt @@ -13,10 +13,12 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.light.classes.symbol.NullabilityType import org.jetbrains.kotlin.light.classes.symbol.analyzeForLightClasses +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForClassOrObject import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForEnumEntry import org.jetbrains.kotlin.light.classes.symbol.isOriginEquivalentTo +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SimpleModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList import org.jetbrains.kotlin.light.classes.symbol.nonExistentType import org.jetbrains.kotlin.psi.KtEnumEntry @@ -35,16 +37,17 @@ internal class SymbolLightFieldForEnumEntry( private val _modifierList by lazyPub { SymbolLightMemberModifierList( containingDeclaration = this, - staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC), - ) { modifierList -> - withEnumEntrySymbol { enumEntrySymbol -> - enumEntrySymbol.computeAnnotations( - modifierList, - nullability = NullabilityType.Unknown, // there is no need to add nullability annotations on enum entries - annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD, - ) - } - } + modifiersBox = SimpleModifiersBox(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC), + annotationsBox = SimpleAnnotationsBox { modifierList -> + withEnumEntrySymbol { enumEntrySymbol -> + enumEntrySymbol.computeAnnotations( + modifierList, + nullability = NullabilityType.Unknown, // there is no need to add nullability annotations on enum entries + annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD, + ) + } + }, + ) } override fun isEquivalentTo(another: PsiElement?): Boolean { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt index e6033276181..2f2db059961 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.classes.lazyPub +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForClassLike @@ -57,14 +58,17 @@ internal class SymbolLightFieldForObject private constructor( private val _modifierList: PsiModifierList by lazyPub { SymbolLightMemberModifierList( containingDeclaration = this, - initialValue = LazyModifiersBox.MODALITY_MODIFIERS_MAP.mutate { - it[PsiModifier.FINAL] = true - it[PsiModifier.STATIC] = true + modifiersBox = LazyModifiersBox( + initialValue = LazyModifiersBox.MODALITY_MODIFIERS_MAP.mutate { + it[PsiModifier.FINAL] = true + it[PsiModifier.STATIC] = true + }, + computer = ::computeModifiers, + ), + annotationsBox = SimpleAnnotationsBox { modifierList -> + listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList)) }, - lazyModifiersComputer = ::computeModifiers, - ) { modifierList -> - listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList)) - } + ) } private fun computeModifiers(modifier: String): Map? { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt index b8c9cd1a68e..6e8352be856 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt @@ -204,8 +204,8 @@ internal class SymbolLightAccessorMethod private constructor( private val _modifierList: PsiModifierList by lazyPub { SymbolLightMemberModifierList( containingDeclaration = this, - lazyModifiersComputer = ::computeModifiers, - annotationsComputer = ::computeAnnotations, + modifiersBox = LazyModifiersBox(computer = ::computeModifiers), + annotationsBox = SimpleAnnotationsBox(::computeAnnotations), ) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt index 4dbffc17c45..3750ae8fdf0 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.light.classes.symbol.NullabilityType +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForEnumEntry @@ -52,17 +53,20 @@ internal class SymbolLightConstructor( SymbolLightMemberModifierList( containingDeclaration = this, - initialValue = initialValue, - lazyModifiersComputer = ::computeModifiers, - ) { modifierList -> - withFunctionSymbol { constructorSymbol -> - constructorSymbol.computeAnnotations( - modifierList = modifierList, - nullability = NullabilityType.Unknown, - annotationUseSiteTarget = null, - ) - } - } + modifiersBox = LazyModifiersBox( + initialValue = initialValue, + computer = ::computeModifiers, + ), + annotationsBox = SimpleAnnotationsBox { modifierList -> + withFunctionSymbol { constructorSymbol -> + constructorSymbol.computeAnnotations( + modifierList = modifierList, + nullability = NullabilityType.Unknown, + annotationUseSiteTarget = null, + ) + } + }, + ) } private fun computeModifiers(modifier: String): Map? { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/LazyModifiersBox.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/LazyModifiersBox.kt index f536296a95c..e37ad04ed08 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/LazyModifiersBox.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/LazyModifiersBox.kt @@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicReference internal typealias LazyModifiersComputer = (modifier: String) -> Map? internal class LazyModifiersBox( - initialValue: Map, + initialValue: Map = emptyMap(), private val computer: LazyModifiersComputer, ) : ModifiersBox { private val modifiersMapReference: AtomicReference> = AtomicReference(initialValue.toPersistentHashMap()) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SimpleModifiersBox.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SimpleModifiersBox.kt index 284065801c6..726cbb644ad 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SimpleModifiersBox.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SimpleModifiersBox.kt @@ -6,5 +6,6 @@ package org.jetbrains.kotlin.light.classes.symbol.modifierLists internal class SimpleModifiersBox(private val modifiers: Set) : ModifiersBox { + constructor(vararg modifiers: String) : this(modifiers.toSet()) override fun hasModifier(modifier: String): Boolean = modifier in modifiers } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt index 4abb53e6022..9552af165a6 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt @@ -5,23 +5,14 @@ package org.jetbrains.kotlin.light.classes.symbol.modifierLists -import com.intellij.psi.PsiAnnotation -import com.intellij.psi.PsiModifierList import com.intellij.psi.PsiModifierListOwner import org.jetbrains.kotlin.asJava.elements.KtLightElement +import org.jetbrains.kotlin.light.classes.symbol.annotations.AnnotationsBox +import org.jetbrains.kotlin.light.classes.symbol.annotations.EmptyAnnotationsBox import org.jetbrains.kotlin.psi.KtModifierListOwner -internal class SymbolLightClassModifierList> : SymbolLightModifierList { - constructor( - containingDeclaration: T, - initialValue: Map = emptyMap(), - lazyModifiersComputer: LazyModifiersComputer, - annotationsComputer: ((PsiModifierList) -> List)?, - ) : super(containingDeclaration, initialValue, lazyModifiersComputer, annotationsComputer) - - constructor( - containingDeclaration: T, - staticModifiers: Set, - annotationsComputer: ((PsiModifierList) -> List)?, - ) : super(containingDeclaration, staticModifiers, annotationsComputer) -} +internal class SymbolLightClassModifierList>( + containingDeclaration: T, + modifiersBox: ModifiersBox = EmptyModifiersBox, + annotationsBox: AnnotationsBox = EmptyAnnotationsBox, +) : SymbolLightModifierList(containingDeclaration, modifiersBox, annotationsBox) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt index bd64645897a..1aace0f7c83 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt @@ -6,29 +6,20 @@ package org.jetbrains.kotlin.light.classes.symbol.modifierLists import com.intellij.openapi.util.TextRange -import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiModifier -import com.intellij.psi.PsiModifierList import org.jetbrains.kotlin.asJava.elements.KtLightMember +import org.jetbrains.kotlin.light.classes.symbol.annotations.AnnotationsBox +import org.jetbrains.kotlin.light.classes.symbol.annotations.EmptyAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase import org.jetbrains.kotlin.psi.KtModifierList import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.psiUtil.hasBody -internal class SymbolLightMemberModifierList> : SymbolLightModifierList { - constructor( - containingDeclaration: T, - initialValue: Map = emptyMap(), - lazyModifiersComputer: LazyModifiersComputer, - annotationsComputer: ((PsiModifierList) -> List)?, - ) : super(containingDeclaration, initialValue, lazyModifiersComputer, annotationsComputer) - - constructor( - containingDeclaration: T, - staticModifiers: Set, - annotationsComputer: ((PsiModifierList) -> List)?, - ) : super(containingDeclaration, staticModifiers, annotationsComputer) - +internal class SymbolLightMemberModifierList>( + containingDeclaration: T, + modifiersBox: ModifiersBox = EmptyModifiersBox, + annotationsBox: AnnotationsBox = EmptyAnnotationsBox, +) : SymbolLightModifierList(containingDeclaration, modifiersBox, annotationsBox) { override fun hasModifierProperty(name: String): Boolean = when { name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false // Pretend this method behaves like a `default` method diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt index 33205b34e2d..53092a7d30c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt @@ -8,46 +8,21 @@ package org.jetbrains.kotlin.light.classes.symbol.modifierLists import com.intellij.psi.* import com.intellij.util.IncorrectOperationException import org.jetbrains.kotlin.asJava.classes.cannotModify -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 +import org.jetbrains.kotlin.light.classes.symbol.annotations.AnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.invalidAccess import org.jetbrains.kotlin.psi.KtModifierList import org.jetbrains.kotlin.psi.KtModifierListOwner -internal sealed class SymbolLightModifierList> : - KtLightElementBase, PsiModifierList, KtLightElement { - protected val owner: T - private val staticModifiers: Set? - private val lazyModifiersBox: LazyModifiersBox? - private val lazyAnnotations: Lazy>? - - constructor( - owner: T, - initialValue: Map, - lazyModifiersComputer: LazyModifiersComputer, - annotationsComputer: ((PsiModifierList) -> List)?, - ) : super(owner) { - this.owner = owner - this.lazyAnnotations = annotationsComputer?.let { lazyPub { annotationsComputer(this) } } - - this.lazyModifiersBox = LazyModifiersBox(initialValue, lazyModifiersComputer) - this.staticModifiers = null - } - - constructor( - owner: T, - staticModifiers: Set, - annotationsComputer: ((PsiModifierList) -> List)?, - ) : super(owner) { - this.owner = owner - this.lazyAnnotations = annotationsComputer?.let { lazyPub { annotationsComputer(this) } } - - this.lazyModifiersBox = null - this.staticModifiers = staticModifiers - } - +internal sealed class SymbolLightModifierList>( + protected val owner: T, + private val modifiersBox: ModifiersBox, + private val annotationsBox: AnnotationsBox, +) : KtLightElementBase(owner), + PsiModifierList, + KtLightElement { override fun accept(visitor: PsiElementVisitor) { if (visitor is JavaElementVisitor) { visitor.visitModifierList(this) @@ -58,25 +33,22 @@ internal sealed class SymbolLightModifierList = annotations override fun isEquivalentTo(another: PsiElement?) = another is SymbolLightModifierList<*> && owner == another.owner override fun isWritable() = false override fun toString() = "Light modifier list of $owner" - override val givenAnnotations: List get() = invalidAccess() - override fun getAnnotations(): Array = lazyAnnotations?.value?.toTypedArray() ?: PsiAnnotation.EMPTY_ARRAY - override fun findAnnotation(qualifiedName: String): PsiAnnotation? = - lazyAnnotations?.value?.firstOrNull { it.qualifiedName == qualifiedName } - override fun equals(other: Any?): Boolean = this === other || other is SymbolLightModifierList<*> && other.kotlinOrigin == kotlinOrigin - override fun hashCode(): Int = kotlinOrigin.hashCode() + override fun setModifierProperty(name: String, value: Boolean) = cannotModify() + override fun checkSetModifierProperty(name: String, value: Boolean) = throw IncorrectOperationException() override fun hasExplicitModifier(name: String) = hasModifierProperty(name) - override fun hasModifierProperty(name: String): Boolean = - staticModifiers?.contains(name) == true || lazyModifiersBox?.hasModifier(name) == true + override fun hasModifierProperty(name: String): Boolean = modifiersBox.hasModifier(name) + + override fun getAnnotations(): Array = annotationsBox.annotations(this) + override fun getApplicableAnnotations(): Array = annotations + override fun findAnnotation(qualifiedName: String): PsiAnnotation? = annotationsBox.findAnnotation(this, qualifiedName) + override fun hasAnnotation(qualifiedName: String): Boolean = annotationsBox.hasAnnotation(this, qualifiedName) + override fun addAnnotation(qualifiedName: String): PsiAnnotation = throw UnsupportedOperationException() } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt index 3a8c0938102..537e87722d3 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.light.classes.symbol.NullabilityType +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList @@ -29,22 +30,22 @@ internal class SymbolLightParameter( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - staticModifiers = emptySet(), - ) { modifierList -> - val annotationSite = isConstructorParameterSymbol.ifTrue { - AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER - } + annotationsBox = SimpleAnnotationsBox { modifierList -> + val annotationSite = isConstructorParameterSymbol.ifTrue { + AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER + } - parameterSymbolPointer.withSymbol(ktModule) { parameterSymbol -> - val nullability = if (parameterSymbol.isVararg) NullabilityType.NotNull else super.nullabilityType - parameterSymbol.computeAnnotations( - modifierList = modifierList, - nullability = nullability, - annotationUseSiteTarget = annotationSite, - includeAnnotationsWithoutSite = true, - ) - } - } + parameterSymbolPointer.withSymbol(ktModule) { parameterSymbol -> + val nullability = if (parameterSymbol.isVararg) NullabilityType.NotNull else super.nullabilityType + parameterSymbol.computeAnnotations( + modifierList = modifierList, + nullability = nullability, + annotationUseSiteTarget = annotationSite, + includeAnnotationsWithoutSite = true, + ) + } + }, + ) } private val isVararg: Boolean by lazyPub { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt index 652ad0d4329..329689990d2 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.light.classes.symbol.* +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightAnnotationForAnnotationCall import org.jetbrains.kotlin.light.classes.symbol.annotations.computeNullabilityAnnotation import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase @@ -70,17 +71,17 @@ internal class SymbolLightParameterForReceiver private constructor( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - staticModifiers = emptySet(), - ) { modifierList -> - withReceiverSymbol { receiver -> - buildList { - receiver.type.nullabilityType.computeNullabilityAnnotation(modifierList)?.let(::add) - receiver.annotations.mapTo(this) { - SymbolLightAnnotationForAnnotationCall(it, modifierList) + annotationsBox = SimpleAnnotationsBox { modifierList -> + withReceiverSymbol { receiver -> + buildList { + receiver.type.nullabilityType.computeNullabilityAnnotation(modifierList)?.let(::add) + receiver.annotations.mapTo(this) { + SymbolLightAnnotationForAnnotationCall(it, modifierList) + } } } - } - } + }, + ) } private val _type: PsiType by lazyPub { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt index 15cc163fb35..4b56f54e688 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.light.classes.symbol.NullabilityType import org.jetbrains.kotlin.light.classes.symbol.analyzeForLightClasses +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList @@ -43,25 +44,25 @@ internal class SymbolLightSetterParameter( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - staticModifiers = emptySet(), - ) { modifierList -> - analyzeForLightClasses(ktModule) { - val annotationsFromSetter = parameterSymbolPointer.restoreSymbolOrThrowIfDisposed().computeAnnotations( - modifierList = modifierList, - nullability = NullabilityType.Unknown, - annotationUseSiteTarget = AnnotationUseSiteTarget.SETTER_PARAMETER, - ) + annotationsBox = SimpleAnnotationsBox { modifierList -> + analyzeForLightClasses(ktModule) { + val annotationsFromSetter = parameterSymbolPointer.restoreSymbolOrThrowIfDisposed().computeAnnotations( + modifierList = modifierList, + nullability = NullabilityType.Unknown, + annotationUseSiteTarget = AnnotationUseSiteTarget.SETTER_PARAMETER, + ) - val annotationsFromProperty = containingPropertySymbolPointer.restoreSymbolOrThrowIfDisposed().computeAnnotations( - modifierList = modifierList, - nullability = nullabilityType, - annotationUseSiteTarget = AnnotationUseSiteTarget.SETTER_PARAMETER, - includeAnnotationsWithoutSite = false, - ) + val annotationsFromProperty = containingPropertySymbolPointer.restoreSymbolOrThrowIfDisposed().computeAnnotations( + modifierList = modifierList, + nullability = nullabilityType, + annotationUseSiteTarget = AnnotationUseSiteTarget.SETTER_PARAMETER, + includeAnnotationsWithoutSite = false, + ) - annotationsFromSetter + annotationsFromProperty - } - } + annotationsFromSetter + annotationsFromProperty + } + }, + ) } override fun isVarArgs() = false diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt index f196a60d7e5..5346ddc1a4f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.isPrivateOrPrivateToThi import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.codegen.coroutines.SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME +import org.jetbrains.kotlin.light.classes.symbol.annotations.SimpleAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation import org.jetbrains.kotlin.light.classes.symbol.isValid import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase @@ -54,13 +55,13 @@ internal class SymbolLightSuspendContinuationParameter( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - staticModifiers = emptySet(), - ) { modifierList -> - if (withFunctionSymbol { it.visibility.isPrivateOrPrivateToThis() }) - emptyList() - else - listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList)) - } + annotationsBox = SimpleAnnotationsBox { modifierList -> + if (withFunctionSymbol { it.visibility.isPrivateOrPrivateToThis() }) + emptyList() + else + listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList)) + }, + ) } override fun hasModifierProperty(p0: String): Boolean = false