diff --git a/python/src/com/jetbrains/python/projectModel/BaseProjectModelService.kt b/python/src/com/jetbrains/python/projectModel/BaseProjectModelService.kt index eaf90b9e11c2..98c4990879ad 100644 --- a/python/src/com/jetbrains/python/projectModel/BaseProjectModelService.kt +++ b/python/src/com/jetbrains/python/projectModel/BaseProjectModelService.kt @@ -117,10 +117,9 @@ abstract class BaseProjectModelService { dependencies += ModuleDependency(ModuleId(moduleName.name), true, DependencyScope.COMPILE, false) } contentRoots = listOf(ContentRootEntity(extProject.root.toVirtualFileUrl(fileUrlManager), emptyList(), source) { - sourceRoots = listOf(SourceRootEntity( - url = (extProject.root / "src").toVirtualFileUrl(fileUrlManager), - rootTypeId = PYTHON_SOURCE_ROOT_TYPE, - entitySource = source)) + sourceRoots = extProject.sourceRoots.map { srcRoot -> + SourceRootEntity(srcRoot.toVirtualFileUrl(fileUrlManager), PYTHON_SOURCE_ROOT_TYPE, source) + } }) exModuleOptions = ExternalSystemModuleOptionsEntity(source) { externalSystem = systemName diff --git a/python/src/com/jetbrains/python/projectModel/poetry/PoetryProjectModelResolver.kt b/python/src/com/jetbrains/python/projectModel/poetry/PoetryProjectModelResolver.kt index 7275f70b6168..9fcd5688e5f8 100644 --- a/python/src/com/jetbrains/python/projectModel/poetry/PoetryProjectModelResolver.kt +++ b/python/src/com/jetbrains/python/projectModel/poetry/PoetryProjectModelResolver.kt @@ -15,6 +15,9 @@ data class PoetryProject( override val root: Path, override val dependencies: List, ) : ExternalProject { + override val sourceRoots: List + get() = listOfNotNull((root / "src").takeIf { it.isDirectory() }) + // Poetry projects don't have any declarative hierarchical structure override val fullName: String? get() = name diff --git a/python/src/com/jetbrains/python/projectModel/projectModel.kt b/python/src/com/jetbrains/python/projectModel/projectModel.kt index de1dcc982902..029fe7203548 100644 --- a/python/src/com/jetbrains/python/projectModel/projectModel.kt +++ b/python/src/com/jetbrains/python/projectModel/projectModel.kt @@ -22,6 +22,7 @@ interface ExternalProject { val name: String val root: Path val dependencies: List + val sourceRoots: List /** * The colon separated fully qualified name of the project in the form `root:subproject:subsubproject` diff --git a/python/src/com/jetbrains/python/projectModel/uv/UvProjectModelResolver.kt b/python/src/com/jetbrains/python/projectModel/uv/UvProjectModelResolver.kt index 2c41d270c783..d374df9add31 100644 --- a/python/src/com/jetbrains/python/projectModel/uv/UvProjectModelResolver.kt +++ b/python/src/com/jetbrains/python/projectModel/uv/UvProjectModelResolver.kt @@ -12,6 +12,7 @@ import java.nio.file.FileVisitResult import java.nio.file.Path import java.nio.file.PathMatcher import kotlin.io.path.* +import kotlin.io.path.isDirectory private const val DEFAULT_VENV_DIR = ".venv" @@ -22,7 +23,10 @@ data class UvProject( override val fullName: String?, val isWorkspace: Boolean, val parentWorkspace: UvProject?, -) : ExternalProject +) : ExternalProject { + override val sourceRoots: List + get() = listOfNotNull((root / "src").takeIf { it.isDirectory() }) +} private data class UvPyProjectToml( val projectName: String,