FIR IDE: do not resolve whole firFile in completion

This commit is contained in:
Ilya Kirillov
2020-09-12 12:08:43 +03:00
parent 2cfbfabe04
commit 01875635db
3 changed files with 10 additions and 2 deletions
@@ -39,6 +39,8 @@ abstract class FirModuleResolveState {
abstract fun getOrBuildFirFor(element: KtElement, toPhase: FirResolvePhase): FirElement abstract fun getOrBuildFirFor(element: KtElement, toPhase: FirResolvePhase): FirElement
abstract fun getFirFile(ktFile: KtFile): FirFile
abstract fun getDiagnostics(element: KtElement): List<Diagnostic> abstract fun getDiagnostics(element: KtElement): List<Diagnostic>
// todo temporary, used only in completion // todo temporary, used only in completion
@@ -77,6 +79,9 @@ internal class FirModuleResolveStateImpl(
override fun getOrBuildFirFor(element: KtElement, toPhase: FirResolvePhase): FirElement = override fun getOrBuildFirFor(element: KtElement, toPhase: FirResolvePhase): FirElement =
elementBuilder.getOrBuildFirFor(element, currentModuleSourcesSession.cache, fileStructureCache) elementBuilder.getOrBuildFirFor(element, currentModuleSourcesSession.cache, fileStructureCache)
override fun getFirFile(ktFile: KtFile): FirFile =
firFileBuilder.buildRawFirFileWithCaching(ktFile, currentModuleSourcesSession.cache)
override fun getDiagnostics(element: KtElement): List<Diagnostic> = override fun getDiagnostics(element: KtElement): List<Diagnostic> =
diagnosticsCollector.getDiagnosticsFor(element) diagnosticsCollector.getDiagnosticsFor(element)
@@ -47,6 +47,9 @@ internal class FirModuleResolveStateForCompletion(
) )
} }
override fun getFirFile(ktFile: KtFile): FirFile =
originalState.getFirFile(ktFile)
override fun recordPsiToFirMappingsForCompletionFrom(fir: FirDeclaration, firFile: FirFile, ktFile: KtFile) { override fun recordPsiToFirMappingsForCompletionFrom(fir: FirDeclaration, firFile: FirFile, ktFile: KtFile) {
fir.accept(FirElementsRecorder(), completionMapping) fir.accept(FirElementsRecorder(), completionMapping)
} }
@@ -66,9 +66,9 @@ internal class KtFirCompletionCandidateChecker(
nameExpression: KtSimpleNameExpression, nameExpression: KtSimpleNameExpression,
possibleExplicitReceiver: KtExpression?, possibleExplicitReceiver: KtExpression?,
): Boolean { ): Boolean {
val file = originalFile.getOrBuildFirOfType<FirFile>(firResolveState) val file = firResolveState.getFirFile(originalFile)
val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState) val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState)
val resolver = SingleCandidateResolver(firResolveState.firIdeSourcesSession, file) val resolver = SingleCandidateResolver(firResolveState.currentModuleSourcesSession, file)
val implicitReceivers = getImplicitReceivers(originalFile, file, nameExpression) val implicitReceivers = getImplicitReceivers(originalFile, file, nameExpression)
for (implicitReceiverValue in implicitReceivers) { for (implicitReceiverValue in implicitReceivers) {
val resolutionParameters = ResolutionParameters( val resolutionParameters = ResolutionParameters(