diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt index c17dbefb07f..87e570b9f48 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt @@ -3,8 +3,9 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.util +import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.ProjectRootManager +import com.intellij.openapi.roots.ModuleRootManager import org.eclipse.lsp4j.WorkspaceFolder import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString @@ -13,10 +14,12 @@ object WorkspaceFolderUtil { if (project.isDefault) { emptyList() } else { - ProjectRootManager.getInstance(project).contentRoots.map { contentRoot -> - WorkspaceFolder().apply { - name = contentRoot.name - this.uri = toUriString(contentRoot) + ModuleManager.getInstance(project).modules.mapNotNull { module -> + ModuleRootManager.getInstance(module).contentRoots.firstOrNull()?.let { contentRoot -> + WorkspaceFolder().apply { + name = module.name + uri = toUriString(contentRoot) + } } } } diff --git a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtilTest.kt b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtilTest.kt index 93dc0ae9bd6..3ab9fd37c70 100644 --- a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtilTest.kt +++ b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtilTest.kt @@ -3,32 +3,39 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.util +import com.intellij.openapi.module.Module +import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.ProjectRootManager +import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.vfs.VirtualFile import io.mockk.every import io.mockk.mockk +import io.mockk.mockkStatic import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import java.net.URI -import java.nio.file.Path class WorkspaceFolderUtilTest { @Test - fun `createWorkspaceFolders returns empty list when no workspace folders`() { + fun `createWorkspaceFolders returns empty list when project is default`() { val mockProject = mockk() every { mockProject.isDefault } returns true val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject) - assertThat(result).isEqualTo(emptyList()) + assertThat(result).isEmpty() } @Test - fun `createWorkspaceFolders returns workspace folders for non-default project`() { + fun `createWorkspaceFolders returns workspace folders for non-default project with modules`() { val mockProject = mockk() - val mockProjectRootManager = mockk() + val mockModuleManager = mockk() + val mockModule1 = mockk() + val mockModule2 = mockk() + val mockModuleRootManager1 = mockk() + val mockModuleRootManager2 = mockk() + val mockContentRoot1 = createMockVirtualFile( URI("file:///path/to/root1"), name = "root1" @@ -38,58 +45,65 @@ class WorkspaceFolderUtilTest { name = "root2" ) + mockkStatic(ModuleManager::class, ModuleRootManager::class) + every { mockProject.isDefault } returns false - every { ProjectRootManager.getInstance(mockProject) } returns mockProjectRootManager - every { mockProjectRootManager.contentRoots } returns arrayOf(mockContentRoot1, mockContentRoot2) + every { ModuleManager.getInstance(mockProject) } returns mockModuleManager + every { mockModuleManager.modules } returns arrayOf(mockModule1, mockModule2) + every { mockModule1.name } returns "module1" + every { mockModule2.name } returns "module2" + every { ModuleRootManager.getInstance(mockModule1) } returns mockModuleRootManager1 + every { ModuleRootManager.getInstance(mockModule2) } returns mockModuleRootManager2 + every { mockModuleRootManager1.contentRoots } returns arrayOf(mockContentRoot1) + every { mockModuleRootManager2.contentRoots } returns arrayOf(mockContentRoot2) val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject) assertThat(result).hasSize(2) assertThat(result[0].uri).isEqualTo(normalizeFileUri("file:///path/to/root1")) assertThat(result[1].uri).isEqualTo(normalizeFileUri("file:///path/to/root2")) - assertThat(result[0].name).isEqualTo("root1") - assertThat(result[1].name).isEqualTo("root2") + assertThat(result[0].name).isEqualTo("module1") + assertThat(result[1].name).isEqualTo("module2") } @Test - fun `createWorkspaceFolders returns empty list when project has no content roots`() { + fun `createWorkspaceFolders handles modules with no content roots`() { val mockProject = mockk() - val mockProjectRootManager = mockk() + val mockModuleManager = mockk() + val mockModule = mockk() + val mockModuleRootManager = mockk() + + mockkStatic(ModuleManager::class, ModuleRootManager::class) every { mockProject.isDefault } returns false - every { ProjectRootManager.getInstance(mockProject) } returns mockProjectRootManager - every { mockProjectRootManager.contentRoots } returns emptyArray() + every { ModuleManager.getInstance(mockProject) } returns mockModuleManager + every { mockModuleManager.modules } returns arrayOf(mockModule) + every { ModuleRootManager.getInstance(mockModule) } returns mockModuleRootManager + every { mockModuleRootManager.contentRoots } returns emptyArray() val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject) - assertThat(result).isEqualTo(emptyList()) + assertThat(result).isEmpty() } - private fun createMockVirtualFile(uri: URI, name: String): VirtualFile { - val path = mockk { - every { toUri() } returns uri - } - return mockk { + private fun createMockVirtualFile(uri: URI, name: String): VirtualFile = + mockk { every { url } returns uri.toString() every { getName() } returns name - every { toNioPath() } returns path every { isDirectory } returns false every { fileSystem } returns mockk { every { protocol } returns "file" } } - } // for windows unit tests private fun normalizeFileUri(uri: String): String { if (!System.getProperty("os.name").lowercase().contains("windows")) { return uri } - if (!uri.startsWith("file:///")) { return uri } - val path = uri.substringAfter("file:///") return "file:///C:/$path" }