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 } synchronized(completionMapping) { completionMapping[psi] }?.let { return it }
return originalState.elementBuilder.getOrBuildFirFor( return originalState.elementBuilder.getOrBuildFirFor(
element, element,
originalState.firFileBuilder,
originalState.rootModuleSession.cache, originalState.rootModuleSession.cache,
fileStructureCache, fileStructureCache,
) )
@@ -52,7 +52,7 @@ internal class FirModuleResolveStateImpl(
sessionProvider.getSession(moduleInfo)!! sessionProvider.getSession(moduleInfo)!!
override fun getOrBuildFirFor(element: KtElement): FirElement = 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 = override fun getFirFile(ktFile: KtFile): FirFile =
firFileBuilder.buildRawFirFileWithCaching(ktFile, rootModuleSession.cache, lazyBodiesMode = false) firFileBuilder.buildRawFirFileWithCaching(ktFile, rootModuleSession.cache, lazyBodiesMode = false)
@@ -6,11 +6,13 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.parentOfType
import com.intellij.psi.util.parentsOfType import com.intellij.psi.util.parentsOfType
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.fir.FirElement 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.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.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.FileStructureCache
import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FileStructureElement import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FileStructureElement
@@ -45,12 +47,31 @@ internal class FirElementBuilder {
fun getOrBuildFirFor( fun getOrBuildFirFor(
element: KtElement, element: KtElement,
firFileBuilder: FirFileBuilder,
moduleFileCache: ModuleFileCache, moduleFileCache: ModuleFileCache,
fileStructureCache: FileStructureCache, fileStructureCache: FileStructureCache,
): FirElement { ): FirElement = when (element) {
val fileStructure = fileStructureCache.getFileStructure(element.containingKtFile, moduleFileCache) is KtFile -> getOrBuildFirForKtFile(element, firFileBuilder, moduleFileCache)
val mappings = fileStructure.getStructureElementFor(element).mappings 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) val psi = getPsiAsFirElementSource(element)
mappings[psi]?.let { return it } mappings[psi]?.let { return it }
return psi.getFirOfClosestParent(mappings)?.second return psi.getFirOfClosestParent(mappings)?.second