[AA] Add KtResolveExtensionInfoProvider to AA.

This provider is responsible for answering queries related to resolve
extensions. At the moment, this includes retrieving a KtScope with all REx
top-level declarations (moved from KtSymbolFromResolveExtensionProvider), and
retrieving information necessary to supply a GeneratedSourcesFilter for REx
generated code. Future REx-related functions can be added to this interface.

^KT-59329
This commit is contained in:
Justin Paupore
2023-06-14 23:57:38 -07:00
committed by Ilya Kirillov
parent fa0209a322
commit 9f85739599
24 changed files with 1133 additions and 81 deletions
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisAllowanceManager
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtension
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionFile
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionProvider
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionReferencePsiTargetsProvider
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionNavigationTargetsProvider
import org.jetbrains.kotlin.analysis.providers.impl.declarationProviders.FileBasedKotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.project.structure.KtModule
@@ -271,9 +271,12 @@ class LLFirResolveExtensionToolDeclarationProvider internal constructor(
markGenerated = true,
eventSystemEnabled = true // so every generated KtFile backed by some VirtualFile
)
val text = file.buildFileText()
val psiTargetsProvider = file.createPsiTargetsProvider()
val ktFile = createKtFile(factory, file.getFileName(), text, psiTargetsProvider)
val ktFile = createKtFile(
factory,
file.getFileName(),
file.buildFileText(),
file.createNavigationTargetsProvider(),
)
FileBasedKotlinDeclarationProvider(ktFile)
}
}
@@ -284,12 +287,12 @@ class LLFirResolveExtensionToolDeclarationProvider internal constructor(
factory: KtPsiFactory,
fileName: String,
fileText: String,
psiTargetsProvider: KtResolveExtensionReferencePsiTargetsProvider
navigationTargetsProvider: KtResolveExtensionNavigationTargetsProvider
): KtFile {
val ktFile = factory.createFile(fileName, fileText)
val virtualFile = ktFile.virtualFile
virtualFile.analysisExtensionFileContextModule = ktModule
virtualFile.psiTargetsProvider = psiTargetsProvider
virtualFile.navigationTargetsProvider = navigationTargetsProvider
return ktFile
}
@@ -362,7 +365,8 @@ private fun KtResolveExtensionFile.mayHaveTopLevelCallable(name: Name): Boolean
}
@KtModuleStructureInternals
public var VirtualFile.psiTargetsProvider: KtResolveExtensionReferencePsiTargetsProvider? by UserDataProperty(Key.create("KT_RESOLVE_EXTENSION_PSI_TARGETS_PROVIDER"))
public var VirtualFile.navigationTargetsProvider: KtResolveExtensionNavigationTargetsProvider?
by UserDataProperty(Key.create("KT_RESOLVE_EXTENSION_NAVIGATION_TARGETS_PROVIDER"))
private inline fun <R> forbidAnalysis(action: () -> R): R {
return KtAnalysisAllowanceManager.forbidAnalysisInside(KtResolveExtensionProvider::class.java.simpleName, action)