AA: allow directory as source roots
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtSourceModuleBuilder.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtSourceModuleBuilder.kt
index 454cd09..22df08b 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtSourceModuleBuilder.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtSourceModuleBuilder.kt
@@ -5,7 +5,7 @@
 
 package org.jetbrains.kotlin.analysis.project.structure.builder
 
-import com.intellij.psi.PsiFile
+import com.intellij.psi.PsiFileSystemItem
 import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
 import org.jetbrains.kotlin.analysis.project.structure.impl.KtSourceModuleImpl
 import org.jetbrains.kotlin.config.ApiVersion
@@ -21,13 +21,13 @@
     public lateinit var moduleName: String
     public var languageVersionSettings: LanguageVersionSettings =
         LanguageVersionSettingsImpl(LanguageVersion.LATEST_STABLE, ApiVersion.LATEST)
-    private val sourceRoots: MutableList<PsiFile> = mutableListOf()
+    private val sourceRoots: MutableList<PsiFileSystemItem> = mutableListOf()
 
-    public fun addSourceRoot(file: PsiFile) {
+    public fun addSourceRoot(file: PsiFileSystemItem) {
         sourceRoots.add(file)
     }
 
-    public fun addSourceRoots(files: Collection<PsiFile>) {
+    public fun addSourceRoots(files: Collection<PsiFileSystemItem>) {
         sourceRoots.addAll(files)
     }
 
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt
index e0e9a5b..c4ca626 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt
@@ -9,7 +9,7 @@
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.vfs.StandardFileSystems
 import com.intellij.openapi.vfs.VirtualFileManager
-import com.intellij.psi.PsiFile
+import com.intellij.psi.PsiFileSystemItem
 import com.intellij.psi.PsiManager
 import com.intellij.psi.search.GlobalSearchScope
 import com.intellij.psi.search.ProjectScope
@@ -55,6 +55,7 @@
 
 internal fun getSourceFilePaths(
     compilerConfig: CompilerConfiguration,
+    includeDirectoryRoot: Boolean = false,
 ): Set<String> {
     return buildSet {
         compilerConfig.javaSourceRoots.forEach { srcRoot ->
@@ -64,6 +65,9 @@
                 Files.walk(path)
                     .filter(java.nio.file.Files::isRegularFile)
                     .forEach { add(it.toString()) }
+                if (includeDirectoryRoot) {
+                    add(srcRoot)
+                }
             } else {
                 // E.g., project/app/src/some/pkg/main.kt
                 add(srcRoot)
@@ -72,7 +76,7 @@
     }
 }
 
-internal inline fun <reified T : PsiFile> getPsiFilesFromPaths(
+internal inline fun <reified T : PsiFileSystemItem> getPsiFilesFromPaths(
     project: Project,
     paths: Collection<String>,
 ): List<T> {
@@ -81,8 +85,12 @@
     return buildList {
         for (path in paths) {
             val vFile = fs.findFileByPath(path) ?: continue
-            val psiFile = psiManager.findFile(vFile) as? T ?: continue
-            add(psiFile)
+            val psiFileSystemItem =
+                if (vFile.isDirectory)
+                    psiManager.findDirectory(vFile) as? T
+                else
+                    psiManager.findFile(vFile) as? T
+            psiFileSystemItem?.let { add(it) }
         }
     }
 }
@@ -150,7 +158,12 @@
             this.platform = platform
             this.project = project
             this.moduleName = moduleName
-            addSourceRoots(getPsiFilesFromPaths(project, getSourceFilePaths(compilerConfig)))
+            addSourceRoots(
+                getPsiFilesFromPaths(
+                    project,
+                    getSourceFilePaths(compilerConfig, includeDirectoryRoot = true)
+                )
+            )
         }
     )
 }
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtSourceModuleImpl.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtSourceModuleImpl.kt
index 34a9bd1..4e928f8 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtSourceModuleImpl.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtSourceModuleImpl.kt
@@ -6,7 +6,7 @@
 package org.jetbrains.kotlin.analysis.project.structure.impl
 
 import com.intellij.openapi.project.Project
-import com.intellij.psi.PsiFile
+import com.intellij.psi.PsiFileSystemItem
 import com.intellij.psi.search.GlobalSearchScope
 import org.jetbrains.kotlin.analysis.project.structure.KtModule
 import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
@@ -23,7 +23,7 @@
     override val project: Project,
     override val moduleName: String,
     override val languageVersionSettings: LanguageVersionSettings,
-    internal val sourceRoots: List<PsiFile>,
+    internal val sourceRoots: List<PsiFileSystemItem>,
 ) : KtSourceModule, KtModuleWithPlatform {
     override val analyzerServices: PlatformDependentAnalyzerServices = super.analyzerServices
 }
\ No newline at end of file