[Analysis API] improve getClassOrObjectSymbolByClassId/getTopLevelCallableSymbols

add kdocs, use better names
This commit is contained in:
Ilya Kirillov
2022-09-13 18:12:02 +02:00
parent 1b17dbff09
commit 1bdde25dc7
8 changed files with 26 additions and 18 deletions
@@ -120,7 +120,7 @@ internal class KtFe10SymbolProvider(
return descriptor.toKtClassSymbol(analysisContext) return descriptor.toKtClassSymbol(analysisContext)
} }
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> { override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtCallableSymbol> {
val packageViewDescriptor = analysisContext.resolveSession.moduleDescriptor.getPackage(packageFqName) val packageViewDescriptor = analysisContext.resolveSession.moduleDescriptor.getPackage(packageFqName)
return packageViewDescriptor.memberScope.getContributedDescriptors(DescriptorKindFilter.ALL, nameFilter = { it == name }) return packageViewDescriptor.memberScope.getContributedDescriptors(DescriptorKindFilter.ALL, nameFilter = { it == name })
.asSequence() .asSequence()
@@ -28,7 +28,7 @@ internal class KtFirInheritorsProvider(
val inheritorClassIds = classSymbol.firSymbol.fir.getSealedClassInheritors(analysisSession.useSiteSession) val inheritorClassIds = classSymbol.firSymbol.fir.getSealedClassInheritors(analysisSession.useSiteSession)
return with(analysisSession) { return with(analysisSession) {
inheritorClassIds.mapNotNull { it.getCorrespondingToplevelClassOrObjectSymbol() as? KtNamedClassOrObjectSymbol } inheritorClassIds.mapNotNull { getClassOrObjectSymbolByClassId(it) as? KtNamedClassOrObjectSymbol }
} }
} }
@@ -39,7 +39,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
val classId = symbol.callableIdIfNonLocal?.classId val classId = symbol.callableIdIfNonLocal?.classId
if (classId != null) { if (classId != null) {
with(analysisSession) { with(analysisSession) {
return classId.getCorrespondingToplevelClassOrObjectSymbol() return getClassOrObjectSymbolByClassId(classId)
} }
} }
} }
@@ -160,7 +160,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
} }
else -> error("We should not have a ${symbol::class} from a library") else -> error("We should not have a ${symbol::class} from a library")
} ?: error("outerClassId should not be null for member declaration") } ?: error("outerClassId should not be null for member declaration")
val containingClass = containingClassId.getCorrespondingToplevelClassOrObjectSymbol() val containingClass = getClassOrObjectSymbolByClassId(containingClassId)
return containingClass ?: error("Class by class id should exists") return containingClass ?: error("Class by class id should exists")
} }
} }
@@ -107,18 +107,18 @@ internal object KDocReferenceResolver {
context(KtAnalysisSession) context(KtAnalysisSession)
private fun MutableCollection<KtSymbol>.collectSymbolsByClassId(classId: ClassId) { private fun MutableCollection<KtSymbol>.collectSymbolsByClassId(classId: ClassId) {
classId.getCorrespondingToplevelClassOrObjectSymbol()?.let(::add) getClassOrObjectSymbolByClassId(classId)?.let(::add)
} }
context(KtAnalysisSession) context(KtAnalysisSession)
private fun MutableCollection<KtSymbol>.collectSymbolsByFqNameInterpretationAsCallableId(callableId: CallableId) { private fun MutableCollection<KtSymbol>.collectSymbolsByFqNameInterpretationAsCallableId(callableId: CallableId) {
when (val classId = callableId.classId) { when (val classId = callableId.classId) {
null -> { null -> {
addAll(callableId.packageName.getContainingCallableSymbolsWithName(callableId.callableName)) addAll(getTopLevelCallableSymbols(callableId.packageName, callableId.callableName))
} }
else -> { else -> {
classId.getCorrespondingToplevelClassOrObjectSymbol() getClassOrObjectSymbolByClassId(classId)
?.getDeclaredMemberScope() ?.getDeclaredMemberScope()
?.getCallableSymbols { it == callableId.callableName } ?.getCallableSymbols { it == callableId.callableName }
?.let(::addAll) ?.let(::addAll)
@@ -161,9 +161,11 @@ internal class KtFirSymbolProvider(
return firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol) return firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol)
} }
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> { override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtCallableSymbol> {
val firs = firSymbolProvider.getTopLevelCallableSymbols(packageFqName, name) val firs = firSymbolProvider.getTopLevelCallableSymbols(packageFqName, name)
return firs.asSequence().map { firSymbol -> firSymbolBuilder.buildSymbol(firSymbol) } return firs.asSequence().map { firSymbol ->
firSymbolBuilder.buildSymbol(firSymbol) as KtCallableSymbol
}
} }
override fun getPackageSymbolIfPackageExists(packageFqName: FqName): KtPackageSymbol? { override fun getPackageSymbolIfPackageExists(packageFqName: FqName): KtPackageSymbol? {
@@ -45,7 +45,7 @@ sealed class SymbolData {
data class ClassData(val classId: ClassId) : SymbolData() { data class ClassData(val classId: ClassId) : SymbolData() {
override fun KtAnalysisSession.toSymbols(): List<KtSymbol> { override fun KtAnalysisSession.toSymbols(): List<KtSymbol> {
val symbol = classId.getCorrespondingToplevelClassOrObjectSymbol() ?: error("Class $classId is not found") val symbol = getClassOrObjectSymbolByClassId(classId) ?: error("Class $classId is not found")
return listOf(symbol) return listOf(symbol)
} }
} }
@@ -54,10 +54,10 @@ sealed class SymbolData {
override fun KtAnalysisSession.toSymbols(): List<KtSymbol> { override fun KtAnalysisSession.toSymbols(): List<KtSymbol> {
val classId = callableId.classId val classId = callableId.classId
val symbols = if (classId == null) { val symbols = if (classId == null) {
callableId.packageName.getContainingCallableSymbolsWithName(callableId.callableName).toList() getTopLevelCallableSymbols(callableId.packageName, callableId.callableName).toList()
} else { } else {
val classSymbol = val classSymbol =
classId.getCorrespondingToplevelClassOrObjectSymbol() getClassOrObjectSymbolByClassId(classId)
?: error("Class $classId is not found") ?: error("Class $classId is not found")
classSymbol.getDeclaredMemberScope().getCallableSymbols() classSymbol.getDeclaredMemberScope().getCallableSymbols()
.filter { (it as? KtNamedSymbol)?.name == callableId.callableName } .filter { (it as? KtNamedSymbol)?.name == callableId.callableName }
@@ -55,7 +55,7 @@ public abstract class KtSymbolProvider : KtAnalysisSessionComponent() {
public abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? public abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol?
public abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> public abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtCallableSymbol>
@Suppress("PropertyName") @Suppress("PropertyName")
public abstract val ROOT_PACKAGE_SYMBOL: KtPackageSymbol public abstract val ROOT_PACKAGE_SYMBOL: KtPackageSymbol
@@ -138,11 +138,17 @@ public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn {
/** /**
* @return symbol with specified [this@getClassOrObjectSymbolByClassId] or `null` in case such symbol is not found * @return symbol with specified [this@getClassOrObjectSymbolByClassId] or `null` in case such symbol is not found
*/ */
public fun ClassId.getCorrespondingToplevelClassOrObjectSymbol(): KtClassOrObjectSymbol? = public fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? =
withValidityAssertion { analysisSession.symbolProvider.getClassOrObjectSymbolByClassId(this) } withValidityAssertion { analysisSession.symbolProvider.getClassOrObjectSymbolByClassId(classId) }
public fun FqName.getContainingCallableSymbolsWithName(name: Name): Sequence<KtSymbol> = /**
withValidityAssertion { analysisSession.symbolProvider.getTopLevelCallableSymbols(this, name) } * @return list of top-level functions and properties which are visible from current use-site module
*
* @param packageFqName package name in which callable symbols should be declared
* @param name callable symbol name
*/
public fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtCallableSymbol> =
withValidityAssertion { analysisSession.symbolProvider.getTopLevelCallableSymbols(packageFqName, name) }
/** /**
* @return symbol corresponding to the local variable introduced by individual destructuring declaration entries. * @return symbol corresponding to the local variable introduced by individual destructuring declaration entries.
@@ -473,7 +473,7 @@ internal fun KtClassOrObject.checkIsInheritor(superClassOrigin: KtClassOrObject,
is KtEnumEntry -> { is KtEnumEntry -> {
val enumEntrySymbol = this.getEnumEntrySymbol() val enumEntrySymbol = this.getEnumEntrySymbol()
val classId = enumEntrySymbol.containingEnumClassIdIfNonLocal ?: return false val classId = enumEntrySymbol.containingEnumClassIdIfNonLocal ?: return false
val enumClassSymbol = classId.getCorrespondingToplevelClassOrObjectSymbol() ?: return false val enumClassSymbol = getClassOrObjectSymbolByClassId(classId) ?: return false
if (enumClassSymbol == superClassSymbol) return true if (enumClassSymbol == superClassSymbol) return true
return if (checkDeep) { return if (checkDeep) {
enumClassSymbol.isSubClassOf(superClassSymbol) enumClassSymbol.isSubClassOf(superClassSymbol)