FIR IDE: Consider generated names in KtFirPackageScope

If scope doesn't return generated names from `getPossibleCallableNames`,
it's impossible to query them from the scope, since you have to know the
name of callable/classifier to query it
This commit is contained in:
Roman Golyshev
2022-02-06 12:28:30 +03:00
parent 13cc0ddf97
commit 6d6a3fbe21
@@ -19,6 +19,9 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionService
import org.jetbrains.kotlin.fir.extensions.declarationGenerators
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -40,10 +43,15 @@ internal class KtFirPackageScope(
FirPackageMemberScope(fqName, builder.rootSession)
}
override fun getPossibleCallableNames() = withValidityAssertion {
private val firExtensionService: FirExtensionService
get() = firScope.session.extensionService
override fun getPossibleCallableNames(): Set<Name> = withValidityAssertion {
hashSetOf<Name>().apply {
addAll(declarationsProvider.getFunctionsNamesInPackage(fqName))
addAll(declarationsProvider.getPropertyNamesInPackage(fqName))
addAll(collectGeneratedTopLevelCallables())
}
}
@@ -56,9 +64,41 @@ internal class KtFirPackageScope(
.findPackage(fqName.asString())
?.getClasses(searchScope)
?.mapNotNullTo(this) { it.name?.let(Name::identifier) }
addAll(collectGeneratedTopLevelClassifiers())
}
}
private fun collectGeneratedTopLevelCallables(): Set<Name> {
val generators = firExtensionService.declarationGenerators
val generatedTopLevelDeclarations = generators
.asSequence()
.flatMap {
// FIXME this function should be called only once during plugin's lifetime, so this usage is not really correct (1)
it.getTopLevelCallableIds()
}
.filter { it.packageName == fqName }
.map { it.callableName }
return generatedTopLevelDeclarations.toSet()
}
private fun collectGeneratedTopLevelClassifiers(): Set<Name> {
val declarationGenerators = firExtensionService.declarationGenerators
val generatedTopLevelClassifiers = declarationGenerators
.asSequence()
.flatMap {
// FIXME this function should be called only once during plugin's lifetime, so this usage is not really correct (2)
it.getTopLevelClassIds()
}
.filter { it.packageFqName == fqName }
.map { it.shortClassName }
return generatedTopLevelClassifiers.toSet()
}
override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence<KtCallableSymbol> = withValidityAssertion {
firScope.getCallableSymbols(getPossibleCallableNames().filter(nameFilter), builder)
}