FIR IDE: resolve fir file to BODY_RESOLVE when it requested by getOrBuildFir

This commit is contained in:
Ilya Kirillov
2020-12-22 14:37:20 +01:00
parent fa42f9302e
commit b2b364eca6
3 changed files with 27 additions and 5 deletions
@@ -47,6 +47,7 @@ internal class FirModuleResolveStateForCompletion(
synchronized(completionMapping) { completionMapping[psi] }?.let { return it }
return originalState.elementBuilder.getOrBuildFirFor(
element,
originalState.firFileBuilder,
originalState.rootModuleSession.cache,
fileStructureCache,
)
@@ -52,7 +52,7 @@ internal class FirModuleResolveStateImpl(
sessionProvider.getSession(moduleInfo)!!
override fun getOrBuildFirFor(element: KtElement): FirElement =
elementBuilder.getOrBuildFirFor(element, rootModuleSession.cache, fileStructureCache)
elementBuilder.getOrBuildFirFor(element, firFileBuilder, rootModuleSession.cache, fileStructureCache)
override fun getFirFile(ktFile: KtFile): FirFile =
firFileBuilder.buildRawFirFileWithCaching(ktFile, rootModuleSession.cache, lazyBodiesMode = false)
@@ -6,11 +6,13 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder
import com.intellij.psi.PsiElement
import com.intellij.psi.util.parentOfType
import com.intellij.psi.util.parentsOfType
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FileStructureCache
import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FileStructureElement
@@ -45,12 +47,31 @@ internal class FirElementBuilder {
fun getOrBuildFirFor(
element: KtElement,
firFileBuilder: FirFileBuilder,
moduleFileCache: ModuleFileCache,
fileStructureCache: FileStructureCache,
): FirElement {
val fileStructure = fileStructureCache.getFileStructure(element.containingKtFile, moduleFileCache)
val mappings = fileStructure.getStructureElementFor(element).mappings
): FirElement = when (element) {
is KtFile -> getOrBuildFirForKtFile(element, firFileBuilder, moduleFileCache)
else -> getOrBuildFirForNonKtFileElement(element, fileStructureCache, moduleFileCache)
}
private fun getOrBuildFirForKtFile(ktFile: KtFile, firFileBuilder: FirFileBuilder, moduleFileCache: ModuleFileCache): FirFile =
firFileBuilder.getFirFileResolvedToPhaseWithCaching(
ktFile,
moduleFileCache,
FirResolvePhase.BODY_RESOLVE,
checkPCE = true
)
private fun getOrBuildFirForNonKtFileElement(
element: KtElement,
fileStructureCache: FileStructureCache,
moduleFileCache: ModuleFileCache
): FirElement {
require(element !is KtFile)
val fileStructure = fileStructureCache.getFileStructure(element.containingKtFile, moduleFileCache)
val mappings = fileStructure.getStructureElementFor(element).mappings
val psi = getPsiAsFirElementSource(element)
mappings[psi]?.let { return it }
return psi.getFirOfClosestParent(mappings)?.second