[LL] allow building fir on decompiled text
when open in the editor
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt
index 90ba558..2cc8188 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt
@@ -31,12 +31,6 @@
it.toString()
}
}
- checkWithAttachmentBuilder(!ktFile.isCompiled, { "Called on compiled element" }) {
- withEntry("file", ktFile.name)
- withEntry("file module", ktFile.getKtModule()) {
- it.toString()
- }
- }
val bodyBuildingMode = when {
ktFile.isScript() -> {
// As 'FirScript' content is never transformed, lazy bodies are not replaced with calculated ones even on BODY_RESOLVE.
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt
index 33a7030..3f8cf7f 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt
@@ -6,14 +6,9 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions
import com.intellij.openapi.util.ModificationTracker
-import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.FirElementsRecorder
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.fir.BuiltinTypes
-import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
-import org.jetbrains.kotlin.fir.declarations.FirDeclaration
-import org.jetbrains.kotlin.psi.KtElement
-import java.util.concurrent.ConcurrentHashMap
/**
* [org.jetbrains.kotlin.fir.FirSession] responsible for all libraries analysing module transitively depends on
@@ -22,10 +17,4 @@
ktModule: KtModule,
dependencyTracker: ModificationTracker,
builtinTypes: BuiltinTypes,
-) : LLFirLibraryLikeSession(ktModule, dependencyTracker, builtinTypes) {
- private val cache = ConcurrentHashMap<FirDeclaration, Map<KtElement, FirElement>>()
-
- fun getKtToFirMapping(firElement: FirDeclaration): Map<KtElement, FirElement> = cache.computeIfAbsent(firElement) {
- FirElementsRecorder.recordElementsFrom(it, FirElementsRecorder())
- }
-}
+) : LLFirLibraryLikeSession(ktModule, dependencyTracker, builtinTypes)
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt
index 3080f4d..b7e19b5 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt
@@ -70,8 +70,8 @@
* Returns the existing session if found, or creates a new session and caches it.
* Analyzable session will be returned for a library module.
*/
- fun getSession(module: KtModule): LLFirSession {
- if (module is KtBinaryModule) {
+ fun getSession(module: KtModule, preferBinary: Boolean = false): LLFirSession {
+ if (module is KtBinaryModule && (preferBinary || module is KtSdkModule)) {
return getCachedSession(module, binaryCache, ::createBinaryLibrarySession)
}
@@ -470,7 +470,7 @@
private fun collectSourceModuleDependencies(module: KtModule): List<LLFirSession> {
fun getOrCreateSessionForDependency(dependency: KtModule): LLFirSession? = when (dependency) {
is KtBuiltinsModule -> null // Built-ins are already added
- is KtBinaryModule -> getSession(dependency)
+ is KtBinaryModule -> getSession(dependency, preferBinary = true)
is KtSourceModule -> getSession(dependency)
is KtScriptModule,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt
index 8b35a92..10c2de9 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirLibraryOrLibrarySourceResolvableResolveSession.kt
@@ -8,7 +8,6 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirLibraryOrLibrarySourceResolvableModuleSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
-import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
import org.jetbrains.kotlin.psi.KtElement
@@ -26,7 +25,7 @@
override fun getModuleKind(module: KtModule): ModuleKind {
LLFirLibraryOrLibrarySourceResolvableModuleSession.checkIsValidKtModule(module)
- return if (module is KtLibrarySourceModule && module == useSiteKtModule) ModuleKind.RESOLVABLE_MODULE else ModuleKind.BINARY_MODULE
+ return if (module == useSiteKtModule) ModuleKind.RESOLVABLE_MODULE else ModuleKind.BINARY_MODULE
}
}
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt
index 8975bc7..ebbf628 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt
@@ -14,7 +14,7 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.canBePartOfParentDeclaration
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.retryOnInvalidSession
-import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirLibrarySession
+import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.FirElementsRecorder
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableModuleSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionCache
@@ -65,7 +65,8 @@
return useSiteFirSession
}
- return LLFirSessionCache.getInstance(module.project).getSession(module)
+ val cache = LLFirSessionCache.getInstance(module.project)
+ return cache.getSession(module, preferBinary = true)
}
protected open fun getResolvableSessionFor(module: KtModule): LLFirResolvableModuleSession {
@@ -79,22 +80,8 @@
override fun getOrBuildFirFor(element: KtElement): FirElement? {
retryOnInvalidSession {
- val ktModule = element.getKtModule()
- when (getModuleKind(ktModule)) {
- ModuleKind.RESOLVABLE_MODULE -> {
- val moduleComponents = getResolvableSessionFor(ktModule).moduleComponents
- return moduleComponents.elementsBuilder.getOrBuildFirFor(element, this)
- }
- ModuleKind.BINARY_MODULE -> {
- val container = element.getNonLocalContainingOrThisDeclaration {
- !it.canBePartOfParentDeclaration
- } ?: return null
- val fir = findFirCompiledSymbol(container).fir
- if (container == element) return fir
- val session = getSessionFor(ktModule) as LLFirLibrarySession
- return session.getKtToFirMapping(fir)[element]
- }
- }
+ val moduleComponents = getModuleComponentsForElement(element)
+ return moduleComponents.elementsBuilder.getOrBuildFirFor(element, this)
}
}