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:
+41
-1
@@ -19,6 +19,9 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
|||||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||||
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
||||||
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
|
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.fir.scopes.impl.FirPackageMemberScope
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -40,10 +43,15 @@ internal class KtFirPackageScope(
|
|||||||
FirPackageMemberScope(fqName, builder.rootSession)
|
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 {
|
hashSetOf<Name>().apply {
|
||||||
addAll(declarationsProvider.getFunctionsNamesInPackage(fqName))
|
addAll(declarationsProvider.getFunctionsNamesInPackage(fqName))
|
||||||
addAll(declarationsProvider.getPropertyNamesInPackage(fqName))
|
addAll(declarationsProvider.getPropertyNamesInPackage(fqName))
|
||||||
|
|
||||||
|
addAll(collectGeneratedTopLevelCallables())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,9 +64,41 @@ internal class KtFirPackageScope(
|
|||||||
.findPackage(fqName.asString())
|
.findPackage(fqName.asString())
|
||||||
?.getClasses(searchScope)
|
?.getClasses(searchScope)
|
||||||
?.mapNotNullTo(this) { it.name?.let(Name::identifier) }
|
?.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 {
|
override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence<KtCallableSymbol> = withValidityAssertion {
|
||||||
firScope.getCallableSymbols(getPossibleCallableNames().filter(nameFilter), builder)
|
firScope.getCallableSymbols(getPossibleCallableNames().filter(nameFilter), builder)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user