From df54540a81e899820df2a064d657746a8757e6a9 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Wed, 13 Sep 2023 21:40:33 +0200 Subject: [PATCH] [AA] Update usages of declared member scopes - Now that non-static declared member scopes don't contain static callables anymore, we have to update some usages in the Analysis API. - In symbol light classes, many usages of `getDeclaredMemberScope` can be kept as-is because Kotlin classes/objects generally cannot declare static callables (and we do not need to create symbol light classes for Java classes). The only exception are enum classes, which implicitly declare some static callables. ^KT-61800 --- .../analysis/api/fir/components/KtFirInheritorsProvider.kt | 2 +- .../kotlin/analysis/api/impl/base/test/SymbolByFqName.kt | 4 ++-- .../bodies/KtRendererBodyMemberScopeProvider.kt | 4 ++-- .../symbol/classes/SymbolLightClassForClassOrObject.kt | 5 +++-- .../light/classes/symbol/classes/symbolLightClassUtils.kt | 4 ++-- .../kotlin/light/classes/symbol/symbolLightUtils.kt | 6 +++--- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt index 2810b384232..9879c14ec13 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt @@ -35,7 +35,7 @@ internal class KtFirInheritorsProvider( override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List { require(classSymbol.classKind == KtClassKind.ENUM_CLASS) return with(analysisSession) { - classSymbol.getDeclaredMemberScope().getCallableSymbols().filterIsInstance().toList() + classSymbol.getStaticDeclaredMemberScope().getCallableSymbols().filterIsInstance().toList() } } diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt index ec6265060c2..5d138fd6123 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt @@ -9,8 +9,8 @@ import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol -import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -75,7 +75,7 @@ sealed class SymbolData { val classSymbol = getClassOrObjectSymbolByClassId(classId) ?: error("Class $classId is not found") - classSymbol.getDeclaredMemberScope().getCallableSymbols(callableId.callableName) + classSymbol.getCombinedDeclaredMemberScope().getCallableSymbols(callableId.callableName) .toList() } if (symbols.isEmpty()) { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtRendererBodyMemberScopeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtRendererBodyMemberScopeProvider.kt index 7590b42ac4f..30744f3be4d 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtRendererBodyMemberScopeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtRendererBodyMemberScopeProvider.kt @@ -16,14 +16,14 @@ public interface KtRendererBodyMemberScopeProvider { public object ALL : KtRendererBodyMemberScopeProvider { context(KtAnalysisSession) override fun getMemberScope(symbol: KtSymbolWithMembers): List { - return symbol.getDeclaredMemberScope().getAllSymbols().toList() + return symbol.getCombinedDeclaredMemberScope().getAllSymbols().toList() } } public object ALL_DECLARED : KtRendererBodyMemberScopeProvider { context(KtAnalysisSession) override fun getMemberScope(symbol: KtSymbolWithMembers): List { - return symbol.getDeclaredMemberScope().getAllSymbols() + return symbol.getCombinedDeclaredMemberScope().getAllSymbols() .filter { member -> val origin = member.origin origin != KtSymbolOrigin.DELEGATED && 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 6c5fd045025..23e67d58ddf 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 @@ -109,7 +109,8 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC withClassOrObjectSymbol { classOrObjectSymbol -> val result = mutableListOf() - val declaredMemberScope = classOrObjectSymbol.getDeclaredMemberScope() + // We should use the combined declared member scope here because an enum class may contain static callables. + val declaredMemberScope = classOrObjectSymbol.getCombinedDeclaredMemberScope() val visibleDeclarations = declaredMemberScope.getCallableSymbols() .applyIf(classKind().isObject) { @@ -263,7 +264,7 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC private fun addFieldsForEnumEntries(result: MutableList, classOrObjectSymbol: KtNamedClassOrObjectSymbol) { if (!isEnum) return - classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() + classOrObjectSymbol.getStaticDeclaredMemberScope().getCallableSymbols() .filterIsInstance() .mapNotNullTo(result) { val enumEntry = it.psiSafe() diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt index e2326060579..905fc362da2 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt @@ -541,7 +541,7 @@ internal fun KtSymbolWithMembers.createInnerClasses( // inner classes with null names can't be searched for and can't be used from java anyway // we can't prohibit creating light classes with null names either since they can contain members - getDeclaredMemberScope().getClassifierSymbols().filterIsInstance().mapTo(result) { + getStaticDeclaredMemberScope().getClassifierSymbols().filterIsInstance().mapTo(result) { val classOrObjectDeclaration = it.psiSafe() if (classOrObjectDeclaration != null) { createLightClassNoCache(classOrObjectDeclaration, containingClass.ktModule) @@ -622,7 +622,7 @@ internal fun SymbolLightClassBase.addPropertyBackingFields( symbolWithMembers: KtSymbolWithMembers, forceIsStaticTo: Boolean? = null, ) { - val propertySymbols = symbolWithMembers.getDeclaredMemberScope().getCallableSymbols() + val propertySymbols = symbolWithMembers.getCombinedDeclaredMemberScope().getCallableSymbols() .filterIsInstance() .applyIf(symbolWithMembers is KtClassOrObjectSymbol && symbolWithMembers.classKind == KtClassKind.COMPANION_OBJECT) { // All fields for companion object of classes are generated to the containing class diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt index 7a56b56f11b..fa3f1ff785a 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.* import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker -import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightMember import org.jetbrains.kotlin.asJava.elements.psiType @@ -39,6 +38,7 @@ import org.jetbrains.kotlin.light.classes.symbol.classes.modificationTrackerForC import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.KtTypeParameterListOwner +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import java.util.* internal fun L.invalidAccess(): Nothing = @@ -87,7 +87,7 @@ internal fun KtClassOrObjectSymbol.enumClassModality(): String? { return PsiModifier.ABSTRACT } - if (getDeclaredMemberScope().getCallableSymbols().none { it is KtEnumEntrySymbol && it.requiresSubClass() }) { + if (getStaticDeclaredMemberScope().getCallableSymbols().none { it is KtEnumEntrySymbol && it.requiresSubClass() }) { return PsiModifier.FINAL } @@ -97,7 +97,7 @@ internal fun KtClassOrObjectSymbol.enumClassModality(): String? { context(KtAnalysisSession) private fun KtEnumEntrySymbol.requiresSubClass(): Boolean { val initializer = enumEntryInitializer ?: return false - return initializer.getDeclaredMemberScope().getAllSymbols().any { it !is KtConstructorSymbol } + return initializer.getCombinedDeclaredMemberScope().getAllSymbols().any { it !is KtConstructorSymbol } } internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(): String = visibility.toPsiVisibilityForMember()