[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> {
require(classSymbol.classKind == KtClassKind.ENUM_CLASS)
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.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()) {
@@ -16,14 +16,14 @@ public interface KtRendererBodyMemberScopeProvider {
public object ALL : KtRendererBodyMemberScopeProvider {
context(KtAnalysisSession)
override fun getMemberScope(symbol: KtSymbolWithMembers): List<KtDeclarationSymbol> {
return symbol.getDeclaredMemberScope().getAllSymbols().toList()
return symbol.getCombinedDeclaredMemberScope().getAllSymbols().toList()
}
}
public object ALL_DECLARED : KtRendererBodyMemberScopeProvider {
context(KtAnalysisSession)
override fun getMemberScope(symbol: KtSymbolWithMembers): List<KtDeclarationSymbol> {
return symbol.getDeclaredMemberScope().getAllSymbols()
return symbol.getCombinedDeclaredMemberScope().getAllSymbols()
.filter { member ->
val origin = member.origin
origin != KtSymbolOrigin.DELEGATED &&
@@ -109,7 +109,8 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC
withClassOrObjectSymbol { classOrObjectSymbol ->
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()
.applyIf(classKind().isObject) {
@@ -263,7 +264,7 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC
private fun addFieldsForEnumEntries(result: MutableList<KtLightField>, classOrObjectSymbol: KtNamedClassOrObjectSymbol) {
if (!isEnum) return
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
classOrObjectSymbol.getStaticDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtEnumEntrySymbol>()
.mapNotNullTo(result) {
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
// 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>()
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<KtPropertySymbol>()
.applyIf(symbolWithMembers is KtClassOrObjectSymbol && symbolWithMembers.classKind == KtClassKind.COMPANION_OBJECT) {
// 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.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 : Any> 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()