[Analysis API] improve getClassOrObjectSymbolByClassId/getTopLevelCallableSymbols
add kdocs, use better names
This commit is contained in:
+1
-1
@@ -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()
|
||||||
|
|||||||
+1
-1
@@ -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 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -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)
|
||||||
|
|||||||
+4
-2
@@ -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? {
|
||||||
|
|||||||
+3
-3
@@ -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 }
|
||||||
|
|||||||
+11
-5
@@ -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.
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user