[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)
         }
     }