KT-62695 [AA] Refactor KDocReferenceResolver.findParentSymbol

Avoid traversing parents when there are none
This commit is contained in:
Roman Golyshev
2024-01-25 16:44:47 +01:00
committed by Space Team
parent d45662c2c3
commit f9348c69ba
@@ -100,15 +100,27 @@ internal object KDocReferenceResolver {
private fun findParentSymbol(symbol: KtSymbol, goBackSteps: Int, selectedFqName: FqName): KtSymbol? {
if (symbol !is KtDeclarationSymbol && symbol !is KtPackageSymbol) return null
var currentSymbol = symbol as? KtDeclarationSymbol
repeat(goBackSteps) {
currentSymbol = currentSymbol?.getContainingSymbol() as? KtClassOrObjectSymbol
if (symbol is KtDeclarationSymbol) {
symbol.goToNthParent(goBackSteps)?.let { return it }
}
currentSymbol?.let { return it }
return getPackageSymbolIfPackageExists(selectedFqName)
}
/**
* N.B. Works only for [KtClassOrObjectSymbol] parents chain.
*/
context(KtAnalysisSession)
private fun KtDeclarationSymbol.goToNthParent(steps: Int): KtDeclarationSymbol? {
var currentSymbol = this
repeat(steps) {
currentSymbol = currentSymbol.getContainingSymbol() as? KtClassOrObjectSymbol ?: return null
}
return currentSymbol
}
context(KtAnalysisSession)
private fun resolveKdocFqName(fqName: FqName, contextElement: KtElement): Collection<ResolveResult> {
getExtensionReceiverSymbolByThisQualifier(fqName, contextElement).ifNotEmpty { return this }