K2 IDE SCRIPTS WIP
diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt
index a4e14cf..7aa8839 100644
--- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt
+++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt
@@ -53,6 +53,7 @@
         is KtSourceModule -> ktModule.moduleName
         is KtNotUnderContentRootModule -> TODO()
         is KtBuiltinsModule -> "Builtins for ${ktModule.platform}"
+        is KtScriptModule -> "script"
     }
 
 
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt
index 30ebaa8..6cbd091 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirResolveStateService.kt
@@ -8,7 +8,6 @@
 import com.intellij.openapi.components.ServiceManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.roots.ProjectRootModificationTracker
-import com.intellij.psi.util.PsiModificationTracker
 import org.jetbrains.annotations.TestOnly
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
 import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
@@ -61,6 +60,15 @@
                     )
                 }
 
+                is KtScriptModule -> {
+                    LLFirSourceResolveSession(
+                        useSiteSession.moduleComponents.globalResolveComponents,
+                        sessionProviderStorage.project,
+                        useSiteKtModule,
+                        sessionProvider,
+                    )
+                }
+
                 is KtLibraryModule, is KtLibrarySourceModule -> {
                     LLFirLibraryOrLibrarySourceResolvableResolveSession(
                         useSiteSession.moduleComponents.globalResolveComponents,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt
index 5510a43..fae7fc4 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt
@@ -128,6 +128,9 @@
             is FirBackingField -> declarationDesignationsToResolve(target.propertySymbol.fir)
             is FirTypeParameter -> declarationDesignationsToResolve(target.containingDeclarationSymbol.fir)
             is FirValueParameter -> declarationDesignationsToResolve(target.containingFunctionSymbol.fir)
+            is FirScript -> listOf(
+                FirDesignationWithFile(emptyList(), target, target.getContainingFile()!!)
+            )
             is FirFile -> {
                 val validForResolveDeclarations = buildList {
                     add(target.annotationsContainer)
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt
index 36077cd..ae89ef4 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt
@@ -13,9 +13,9 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirIdePredicateBasedProvider
 import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirIdeRegisteredPluginAnnotations
 import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
-import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirExceptionHandler
 import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
+import org.jetbrains.kotlin.analysis.project.structure.KtModule
 import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
 import org.jetbrains.kotlin.analysis.project.structure.moduleScopeProvider
 import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver
@@ -52,7 +52,7 @@
     FirCompositeSymbolProvider(session, buildList(createSubProviders))
 
 @SessionConfiguration
-internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtSourceModule) {
+internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtModule) {
     val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return
     FirSessionConfigurator(this).apply {
         @Suppress("UNCHECKED_CAST")
@@ -67,12 +67,14 @@
 }
 
 @SessionConfiguration
-internal fun LLFirSourcesSession.registerCompilerPluginServices(
+internal fun LLFirSession.registerCompilerPluginServices(
     contentScope: GlobalSearchScope,
     project: Project,
-    module: KtSourceModule
+    module: KtModule
 ) {
-    val projectWithDependenciesScope = contentScope.uniteWith(project.moduleScopeProvider.getModuleLibrariesScope(module))
+    val projectWithDependenciesScope =
+        if (module is KtSourceModule) contentScope.uniteWith(project.moduleScopeProvider.getModuleLibrariesScope(module))
+        else GlobalSearchScope.allScope(project)
     val annotationsResolver = project.createAnnotationResolver(projectWithDependenciesScope)
 
     // We need FirRegisteredPluginAnnotations and FirPredicateBasedProvider during extensions' registration process
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirIdePredicateBasedProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirIdePredicateBasedProvider.kt
index 8df0ed2..4119f85 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirIdePredicateBasedProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirIdePredicateBasedProvider.kt
@@ -9,7 +9,7 @@
 import kotlinx.collections.immutable.persistentListOf
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
-import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession
+import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
 import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolver
 import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
@@ -40,7 +40,7 @@
  * PSI index based implementation of [FirPredicateBasedProvider].
  */
 internal class LLFirIdePredicateBasedProvider(
-    private val session: LLFirSourcesSession,
+    private val session: LLFirSession,
     private val annotationsResolver: KotlinAnnotationsResolver,
     private val declarationProvider: KotlinDeclarationProvider,
 ) : FirPredicateBasedProvider() {
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt
index c920200..89df743 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt
@@ -30,7 +30,10 @@
 import org.jetbrains.kotlin.fir.backend.jvm.FirJvmTypeMapper
 import org.jetbrains.kotlin.fir.extensions.*
 import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
-import org.jetbrains.kotlin.fir.resolve.providers.*
+import org.jetbrains.kotlin.fir.resolve.providers.DEPENDENCIES_SYMBOL_PROVIDER_QUALIFIED_KEY
+import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
+import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
+import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
 import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
 import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
 import org.jetbrains.kotlin.fir.session.*
@@ -42,6 +45,115 @@
 
 @OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
 internal object LLFirSessionFactory {
+    fun createScriptSession(
+        project: Project,
+        module: KtScriptModule,
+        globalResolveComponents: LLFirGlobalResolveComponents,
+        sessionInvalidator: LLFirSessionInvalidator,
+        sessionsCache: MutableMap<KtModule, LLFirSession>,
+        librariesSessionFactory: LLFirLibrarySessionFactory,
+        configureSession: (LLFirSession.() -> Unit)? = null
+    ): LLFirScriptSession {
+        sessionsCache[module]?.let { return it as LLFirScriptSession }
+        checkCanceled()
+
+        val platform = module.platform
+        val builtinsSession = LLFirBuiltinsSessionFactory.getInstance(project).getBuiltinsSession(platform)
+
+        val languageVersionSettings = LanguageVersionSettingsImpl.DEFAULT
+
+        val scopeProvider = FirKotlinScopeProvider(::wrapScopeWithJvmMapped)
+
+        val components = LLFirModuleResolveComponents(module, globalResolveComponents, scopeProvider, sessionInvalidator)
+
+        val contentScope = module.contentScope
+        val session = LLFirScriptSession(
+            module,
+            project,
+            components,
+            builtinsSession.builtinTypes
+        )
+        sessionsCache[module] = session
+        components.session = session
+
+        return session.apply session@{
+            val moduleData = LLFirModuleData(module).apply { bindSession(this@session) }
+            registerModuleData(moduleData)
+            register(FirKotlinScopeProvider::class, scopeProvider)
+
+            registerIdeComponents(project)
+            registerCommonComponents(languageVersionSettings)
+            registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
+            registerResolveComponents()
+            registerJavaSpecificResolveComponents()
+
+            val provider = LLFirProvider(
+                this,
+                components,
+                project.createDeclarationProvider(contentScope),
+                project.createPackageProvider(contentScope),
+                /* Source modules can contain `kotlin` package only if `-Xallow-kotlin-package` is specified, this is handled in LLFirProvider */
+                canContainKotlinPackage = false,
+            )
+
+            register(FirProvider::class, provider)
+            register(FirLazyDeclarationResolver::class, LLFirLazyDeclarationResolver())
+
+            registerCompilerPluginServices(contentScope, project, module)
+            registerCompilerPluginExtensions(project, module)
+
+            val switchableExtensionDeclarationsSymbolProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(session)?.also {
+                register(FirSwitchableExtensionDeclarationsSymbolProvider::class, it)
+            }
+
+            val dependencyProvider = LLFirDependentModuleProvidersBySessions(this) {
+                module.directRegularDependencies.mapNotNullTo(this) { dependency ->
+                    when (dependency) {
+                        is KtBuiltinsModule -> null //  build in is already added
+                        is KtBinaryModule -> LLFirLibrarySessionFactory.getInstance(project).getLibrarySession(dependency, sessionsCache)
+                        is KtSourceModule -> {
+                            createSourcesSession(
+                                project,
+                                dependency,
+                                globalResolveComponents,
+                                sessionInvalidator,
+                                sessionsCache,
+                                librariesSessionFactory = librariesSessionFactory,
+                                configureSession = configureSession,
+                            )
+                        }
+                        is KtNotUnderContentRootModule -> error("Module $module cannot depend on ${dependency::class}: $dependency")
+                        is KtLibrarySourceModule -> error("Module $module cannot depend on ${dependency::class}: $dependency")
+                        is KtScriptModule -> TODO()
+                    }
+                }
+                add(builtinsSession)
+            }
+
+            val javaSymbolProvider = createJavaSymbolProvider(this, moduleData, project, contentScope)
+            register(
+                FirSymbolProvider::class,
+                LLFirModuleWithDependenciesSymbolProvider(
+                    this,
+                    dependencyProvider,
+                    providers = listOfNotNull(
+                        provider.symbolProvider,
+                        switchableExtensionDeclarationsSymbolProvider,
+                        javaSymbolProvider,
+                    ),
+                )
+            )
+            register(JavaSymbolProvider::class, javaSymbolProvider)
+
+            register(DEPENDENCIES_SYMBOL_PROVIDER_QUALIFIED_KEY, dependencyProvider)
+            register(FirJvmTypeMapper::class, FirJvmTypeMapper(this))
+            register(LLFirFirClassByPsiClassProvider::class, LLFirFirClassByPsiClassProvider(this))
+
+            configureSession?.invoke(this)
+            extensionService.additionalCheckers.forEach(session.checkersComponent::register)
+        }
+    }
+
     fun createSourcesSession(
         project: Project,
         module: KtSourceModule,
@@ -130,6 +242,7 @@
                         }
                         is KtNotUnderContentRootModule -> error("Module $module cannot depend on ${dependency::class}: $dependency")
                         is KtLibrarySourceModule -> error("Module $module cannot depend on ${dependency::class}: $dependency")
+                        is KtScriptModule -> TODO()
                     }
                 }
                 add(builtinsSession)
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt
index 8690c19..e88955a 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt
@@ -25,6 +25,7 @@
 class LLFirSessionProviderStorage(val project: Project) {
     private val sourceAsUseSiteSessionCache = LLFirSessionsCache()
     private val libraryAsUseSiteSessionCache = LLFirSessionsCache()
+    private val scriptUseSiteSessionCache = LLFirSessionsCache()
 
     private val librariesSessionFactory = LLFirLibrarySessionFactory.getInstance(project)
     private val builtInsSessionFactory = LLFirBuiltinsSessionFactory.getInstance(project)
@@ -49,9 +50,34 @@
             LLFirSessionProvider(project, session, KtModuleToSessionMappingByMapImpl(mapOf(useSiteKtModule to session)))
         }
 
+        is KtScriptModule -> {
+            createSessionProviderForScriptSession(useSiteKtModule, configureSession)
+        }
+
         else -> error("Unexpected ${useSiteKtModule::class.simpleName}")
     }
 
+    private fun createSessionProviderForScriptSession(
+        useSiteKtModule: KtScriptModule,
+        configureSession: (LLFirSession.() -> Unit)?
+    ): LLFirSessionProvider {
+        val (sessions, session) = scriptUseSiteSessionCache.withMappings(project) { mappings ->
+            val sessions = mutableMapOf<KtModule, LLFirSession>().apply { putAll(mappings) }
+            val session = LLFirSessionFactory.createScriptSession(
+                project,
+                useSiteKtModule,
+                globalComponents,
+                libraryAsUseSiteSessionCache.sessionInvalidator,
+                sessions,
+                librariesSessionFactory,
+                configureSession = configureSession,
+            )
+            sessions to session
+        }
+        return LLFirSessionProvider(project, session, KtModuleToSessionMappingByMapImpl(sessions))
+    }
+
+
 
     private fun createSessionProviderForSourceSession(
         useSiteKtModule: KtSourceModule,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt
index 3fa5f9f..ff302fb 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt
@@ -7,8 +7,7 @@
 
 import com.intellij.openapi.project.Project
 import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
-import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirFileBuilder
-import org.jetbrains.kotlin.analysis.project.structure.KtNotUnderContentRootModule
+import org.jetbrains.kotlin.analysis.project.structure.KtScriptModule
 import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
 import org.jetbrains.kotlin.fir.BuiltinTypes
 import org.jetbrains.kotlin.fir.PrivateSessionConstructor
@@ -19,3 +18,11 @@
     override val moduleComponents: LLFirModuleResolveComponents,
     builtinTypes: BuiltinTypes,
 ) : LLFirResolvableModuleSession(builtinTypes)
+
+
+internal class LLFirScriptSession @PrivateSessionConstructor constructor(
+    override val ktModule: KtScriptModule,
+    override val project: Project,
+    override val moduleComponents: LLFirModuleResolveComponents,
+    builtinTypes: BuiltinTypes,
+) : LLFirResolvableModuleSession(builtinTypes)
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt
index 6e2de3c..9dd04b2 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirSourceResolveSession.kt
@@ -9,10 +9,7 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirGlobalResolveComponents
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
 import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionProvider
-import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule
-import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
-import org.jetbrains.kotlin.analysis.project.structure.KtModule
-import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
+import org.jetbrains.kotlin.analysis.project.structure.*
 import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
 import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
 import org.jetbrains.kotlin.psi.KtElement
@@ -37,6 +34,7 @@
     override fun getModuleKind(module: KtModule): ModuleKind {
         return when (module) {
             is KtSourceModule -> ModuleKind.RESOLVABLE_MODULE
+            is KtScriptModule -> ModuleKind.RESOLVABLE_MODULE
             is KtBuiltinsModule,
             is KtLibraryModule -> ModuleKind.BINARY_MODULE
             else -> unexpectedElementError("module", module)
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyTransformerExecutor.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyTransformerExecutor.kt
index d2a3737..26efb42 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyTransformerExecutor.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyTransformerExecutor.kt
@@ -24,7 +24,6 @@
             towerDataContextCollector: FirTowerDataContextCollector?,
             firProviderInterceptor: FirProviderInterceptor?,
         ) {
-
             val lazyTransformer = LazyTransformerFactory.createLazyTransformer(
                 phase,
                 designation,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt
index c9ad2c5..eafacda 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt
@@ -18,6 +18,14 @@
     return when (this) {
         is FirFile -> this
         is FirFileAnnotationsContainer -> containingFileSymbol.fir
+        is FirScript -> {
+            val ktFile = psi?.containingFile as? KtFile
+                ?: error("File for dangling modifier list cannot be null")
+            val moduleComponents = llFirResolvableSession?.moduleComponents
+                ?: error("LLFirResolvableModuleSession for dangling modifier list cannot be null")
+            moduleComponents.cache.getCachedFirFile(ktFile)
+                ?: error("Fir file for dandling modifier list cannot be null")
+        }
         is FirTypeParameter -> containingDeclarationSymbol.fir.getContainingFile()
         is FirPropertyAccessor -> propertySymbol.fir.getContainingFile()
         is FirValueParameter -> containingFunctionSymbol.fir.getContainingFile()
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt
index 6f7de0d..0bb765e 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt
@@ -7,11 +7,11 @@
 
 import com.intellij.openapi.project.Project
 import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
-import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
+import org.jetbrains.kotlin.analysis.project.structure.KtModule
 import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
 
 internal class KtCompilerPluginsProviderForTests(val project: Project) : KtCompilerPluginsProvider() {
-    override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> {
+    override fun <T : Any> getRegisteredExtensions(module: KtModule, extensionType: ProjectExtensionDescriptor<T>): List<T> {
         return extensionType.getInstances(project)
     }
 }
diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt
index a453e25..e70d259 100644
--- a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt
+++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt
@@ -14,5 +14,5 @@
     /**
      * Returns a list of extensions of a base [extensionType] which are registered for [module]
      */
-    public abstract fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T>
+    public abstract fun <T : Any> getRegisteredExtensions(module: KtModule, extensionType: ProjectExtensionDescriptor<T>): List<T>
 }
diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt
index 9bd8090..6e10634 100644
--- a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt
+++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt
@@ -146,6 +146,12 @@
         get() = "Library sourced of $libraryName"
 }
 
+public interface KtScriptModule : KtModule {
+
+    override val moduleDescription: String
+        get() = "Script"
+}
+
 /**
  * Module which contains kotlin [builtins](https://kotlinlang.org/spec/built-in-types-and-their-semantics.html) for specific platform
  * Kotlin builtins are usually reside in the compiler, so [contentScope] and [getBinaryRoots] are empty