[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
This commit is contained in:
Marco Pennekamp
2023-09-13 21:40:33 +02:00
committed by Space Team
parent 21efd6aff3
commit df54540a81
6 changed files with 13 additions and 12 deletions
@@ -35,7 +35,7 @@ internal class KtFirInheritorsProvider(
override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List<KtEnumEntrySymbol> { override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List<KtEnumEntrySymbol> {
require(classSymbol.classKind == KtClassKind.ENUM_CLASS) require(classSymbol.classKind == KtClassKind.ENUM_CLASS)
return with(analysisSession) { return with(analysisSession) {
classSymbol.getDeclaredMemberScope().getCallableSymbols().filterIsInstance<KtEnumEntrySymbol>().toList() classSymbol.getStaticDeclaredMemberScope().getCallableSymbols().filterIsInstance<KtEnumEntrySymbol>().toList()
} }
} }
@@ -9,8 +9,8 @@ import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol 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.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -75,7 +75,7 @@ sealed class SymbolData {
val classSymbol = val classSymbol =
getClassOrObjectSymbolByClassId(classId) getClassOrObjectSymbolByClassId(classId)
?: error("Class $classId is not found") ?: error("Class $classId is not found")
classSymbol.getDeclaredMemberScope().getCallableSymbols(callableId.callableName) classSymbol.getCombinedDeclaredMemberScope().getCallableSymbols(callableId.callableName)
.toList() .toList()
} }
if (symbols.isEmpty()) { if (symbols.isEmpty()) {
@@ -16,14 +16,14 @@ public interface KtRendererBodyMemberScopeProvider {
public object ALL : KtRendererBodyMemberScopeProvider { public object ALL : KtRendererBodyMemberScopeProvider {
context(KtAnalysisSession) context(KtAnalysisSession)
override fun getMemberScope(symbol: KtSymbolWithMembers): List<KtDeclarationSymbol> { override fun getMemberScope(symbol: KtSymbolWithMembers): List<KtDeclarationSymbol> {
return symbol.getDeclaredMemberScope().getAllSymbols().toList() return symbol.getCombinedDeclaredMemberScope().getAllSymbols().toList()
} }
} }
public object ALL_DECLARED : KtRendererBodyMemberScopeProvider { public object ALL_DECLARED : KtRendererBodyMemberScopeProvider {
context(KtAnalysisSession) context(KtAnalysisSession)
override fun getMemberScope(symbol: KtSymbolWithMembers): List<KtDeclarationSymbol> { override fun getMemberScope(symbol: KtSymbolWithMembers): List<KtDeclarationSymbol> {
return symbol.getDeclaredMemberScope().getAllSymbols() return symbol.getCombinedDeclaredMemberScope().getAllSymbols()
.filter { member -> .filter { member ->
val origin = member.origin val origin = member.origin
origin != KtSymbolOrigin.DELEGATED && origin != KtSymbolOrigin.DELEGATED &&
@@ -109,7 +109,8 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC
withClassOrObjectSymbol { classOrObjectSymbol -> withClassOrObjectSymbol { classOrObjectSymbol ->
val result = mutableListOf<KtLightMethod>() val result = mutableListOf<KtLightMethod>()
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() val visibleDeclarations = declaredMemberScope.getCallableSymbols()
.applyIf(classKind().isObject) { .applyIf(classKind().isObject) {
@@ -263,7 +264,7 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC
private fun addFieldsForEnumEntries(result: MutableList<KtLightField>, classOrObjectSymbol: KtNamedClassOrObjectSymbol) { private fun addFieldsForEnumEntries(result: MutableList<KtLightField>, classOrObjectSymbol: KtNamedClassOrObjectSymbol) {
if (!isEnum) return if (!isEnum) return
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() classOrObjectSymbol.getStaticDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtEnumEntrySymbol>() .filterIsInstance<KtEnumEntrySymbol>()
.mapNotNullTo(result) { .mapNotNullTo(result) {
val enumEntry = it.psiSafe<KtEnumEntry>() val enumEntry = it.psiSafe<KtEnumEntry>()
@@ -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 // 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 // we can't prohibit creating light classes with null names either since they can contain members
getDeclaredMemberScope().getClassifierSymbols().filterIsInstance<KtNamedClassOrObjectSymbol>().mapTo(result) { getStaticDeclaredMemberScope().getClassifierSymbols().filterIsInstance<KtNamedClassOrObjectSymbol>().mapTo(result) {
val classOrObjectDeclaration = it.psiSafe<KtClassOrObject>() val classOrObjectDeclaration = it.psiSafe<KtClassOrObject>()
if (classOrObjectDeclaration != null) { if (classOrObjectDeclaration != null) {
createLightClassNoCache(classOrObjectDeclaration, containingClass.ktModule) createLightClassNoCache(classOrObjectDeclaration, containingClass.ktModule)
@@ -622,7 +622,7 @@ internal fun SymbolLightClassBase.addPropertyBackingFields(
symbolWithMembers: KtSymbolWithMembers, symbolWithMembers: KtSymbolWithMembers,
forceIsStaticTo: Boolean? = null, forceIsStaticTo: Boolean? = null,
) { ) {
val propertySymbols = symbolWithMembers.getDeclaredMemberScope().getCallableSymbols() val propertySymbols = symbolWithMembers.getCombinedDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>() .filterIsInstance<KtPropertySymbol>()
.applyIf(symbolWithMembers is KtClassOrObjectSymbol && symbolWithMembers.classKind == KtClassKind.COMPANION_OBJECT) { .applyIf(symbolWithMembers is KtClassOrObjectSymbol && symbolWithMembers.classKind == KtClassKind.COMPANION_OBJECT) {
// All fields for companion object of classes are generated to the containing class // All fields for companion object of classes are generated to the containing class
@@ -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.api.types.*
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker 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.KtLightElement
import org.jetbrains.kotlin.asJava.elements.KtLightMember import org.jetbrains.kotlin.asJava.elements.KtLightMember
import org.jetbrains.kotlin.asJava.elements.psiType 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.ClassId
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.KtTypeParameterListOwner import org.jetbrains.kotlin.psi.KtTypeParameterListOwner
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import java.util.* import java.util.*
internal fun <L : Any> L.invalidAccess(): Nothing = internal fun <L : Any> L.invalidAccess(): Nothing =
@@ -87,7 +87,7 @@ internal fun KtClassOrObjectSymbol.enumClassModality(): String? {
return PsiModifier.ABSTRACT return PsiModifier.ABSTRACT
} }
if (getDeclaredMemberScope().getCallableSymbols().none { it is KtEnumEntrySymbol && it.requiresSubClass() }) { if (getStaticDeclaredMemberScope().getCallableSymbols().none { it is KtEnumEntrySymbol && it.requiresSubClass() }) {
return PsiModifier.FINAL return PsiModifier.FINAL
} }
@@ -97,7 +97,7 @@ internal fun KtClassOrObjectSymbol.enumClassModality(): String? {
context(KtAnalysisSession) context(KtAnalysisSession)
private fun KtEnumEntrySymbol.requiresSubClass(): Boolean { private fun KtEnumEntrySymbol.requiresSubClass(): Boolean {
val initializer = enumEntryInitializer ?: return false 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() internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(): String = visibility.toPsiVisibilityForMember()