Skip to content

Commit 846ab2f

Browse files
committed
Merge branch 'feature/q-lsp' into HEAD
2 parents 7368860 + a8da8ca commit 846ab2f

File tree

5 files changed

+63
-32
lines changed

5 files changed

+63
-32
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ class ArtifactManager(
3232

3333
companion object {
3434
private val DEFAULT_VERSION_RANGE = SupportedManifestVersionRange(
35-
startVersion = SemVer("3.0.0", 3, 0, 0),
36-
endVersion = SemVer("4.0.0", 4, 0, 0)
35+
startVersion = SemVer("1.0.0", 1, 0, 0),
36+
endVersion = SemVer("2.0.0", 2, 0, 0)
3737
)
3838
private val logger = getLogger<ArtifactManager>()
3939
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ManifestFetcher.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ManifestFetcher(
2525
private val logger = getLogger<ManifestFetcher>()
2626

2727
private const val DEFAULT_MANIFEST_URL =
28-
"https://aws-toolkit-language-servers.amazonaws.com/codewhisperer/0/manifest.json"
28+
"https://aws-toolkit-language-servers.amazonaws.com/remoteWorkspaceContext/0/manifest.json"
2929

3030
private val DEFAULT_MANIFEST_PATH: Path = getToolkitsCommonCacheRoot()
3131
.resolve("aws")

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ data class ExtendedClientMetadata(
1111

1212
data class AwsMetadata(
1313
val clientInfo: ClientInfoMetadata,
14+
val awsClientCapabilities: AwsClientCapabilities,
15+
)
16+
17+
data class AwsClientCapabilities(
18+
val q: DeveloperProfiles,
19+
)
20+
21+
data class DeveloperProfiles(
22+
val developerProfiles: Boolean,
1423
)
1524

1625
data class ClientInfoMetadata(
@@ -37,6 +46,11 @@ fun createExtendedClientMetadata(): ExtendedClientMetadata {
3746
clientId = metadata.clientId,
3847
version = metadata.parentProductVersion,
3948
name = metadata.parentProduct
49+
),
50+
awsClientCapabilities = AwsClientCapabilities(
51+
q = DeveloperProfiles(
52+
developerProfiles = true
53+
)
4054
)
4155
)
4256
)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.util
55

6+
import com.intellij.openapi.module.ModuleManager
67
import com.intellij.openapi.project.Project
7-
import com.intellij.openapi.roots.ProjectRootManager
8+
import com.intellij.openapi.roots.ModuleRootManager
89
import org.eclipse.lsp4j.WorkspaceFolder
910
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString
1011

@@ -13,10 +14,12 @@ object WorkspaceFolderUtil {
1314
if (project.isDefault) {
1415
emptyList()
1516
} else {
16-
ProjectRootManager.getInstance(project).contentRoots.map { contentRoot ->
17-
WorkspaceFolder().apply {
18-
name = contentRoot.name
19-
this.uri = toUriString(contentRoot)
17+
ModuleManager.getInstance(project).modules.mapNotNull { module ->
18+
ModuleRootManager.getInstance(module).contentRoots.firstOrNull()?.let { contentRoot ->
19+
WorkspaceFolder().apply {
20+
name = module.name
21+
uri = toUriString(contentRoot)
22+
}
2023
}
2124
}
2225
}

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtilTest.kt

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,39 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.util
55

6+
import com.intellij.openapi.module.Module
7+
import com.intellij.openapi.module.ModuleManager
68
import com.intellij.openapi.project.Project
7-
import com.intellij.openapi.roots.ProjectRootManager
9+
import com.intellij.openapi.roots.ModuleRootManager
810
import com.intellij.openapi.vfs.VirtualFile
911
import io.mockk.every
1012
import io.mockk.mockk
13+
import io.mockk.mockkStatic
1114
import org.assertj.core.api.Assertions.assertThat
1215
import org.junit.jupiter.api.Test
1316
import java.net.URI
14-
import java.nio.file.Path
1517

1618
class WorkspaceFolderUtilTest {
1719

1820
@Test
19-
fun `createWorkspaceFolders returns empty list when no workspace folders`() {
21+
fun `createWorkspaceFolders returns empty list when project is default`() {
2022
val mockProject = mockk<Project>()
2123
every { mockProject.isDefault } returns true
2224

2325
val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject)
2426

25-
assertThat(result).isEqualTo(emptyList<VirtualFile>())
27+
assertThat(result).isEmpty()
2628
}
2729

2830
@Test
29-
fun `createWorkspaceFolders returns workspace folders for non-default project`() {
31+
fun `createWorkspaceFolders returns workspace folders for non-default project with modules`() {
3032
val mockProject = mockk<Project>()
31-
val mockProjectRootManager = mockk<ProjectRootManager>()
33+
val mockModuleManager = mockk<ModuleManager>()
34+
val mockModule1 = mockk<Module>()
35+
val mockModule2 = mockk<Module>()
36+
val mockModuleRootManager1 = mockk<ModuleRootManager>()
37+
val mockModuleRootManager2 = mockk<ModuleRootManager>()
38+
3239
val mockContentRoot1 = createMockVirtualFile(
3340
URI("file:///path/to/root1"),
3441
name = "root1"
@@ -38,58 +45,65 @@ class WorkspaceFolderUtilTest {
3845
name = "root2"
3946
)
4047

48+
mockkStatic(ModuleManager::class, ModuleRootManager::class)
49+
4150
every { mockProject.isDefault } returns false
42-
every { ProjectRootManager.getInstance(mockProject) } returns mockProjectRootManager
43-
every { mockProjectRootManager.contentRoots } returns arrayOf(mockContentRoot1, mockContentRoot2)
51+
every { ModuleManager.getInstance(mockProject) } returns mockModuleManager
52+
every { mockModuleManager.modules } returns arrayOf(mockModule1, mockModule2)
53+
every { mockModule1.name } returns "module1"
54+
every { mockModule2.name } returns "module2"
55+
every { ModuleRootManager.getInstance(mockModule1) } returns mockModuleRootManager1
56+
every { ModuleRootManager.getInstance(mockModule2) } returns mockModuleRootManager2
57+
every { mockModuleRootManager1.contentRoots } returns arrayOf(mockContentRoot1)
58+
every { mockModuleRootManager2.contentRoots } returns arrayOf(mockContentRoot2)
4459

4560
val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject)
4661

4762
assertThat(result).hasSize(2)
4863
assertThat(result[0].uri).isEqualTo(normalizeFileUri("file:///path/to/root1"))
4964
assertThat(result[1].uri).isEqualTo(normalizeFileUri("file:///path/to/root2"))
50-
assertThat(result[0].name).isEqualTo("root1")
51-
assertThat(result[1].name).isEqualTo("root2")
65+
assertThat(result[0].name).isEqualTo("module1")
66+
assertThat(result[1].name).isEqualTo("module2")
5267
}
5368

5469
@Test
55-
fun `createWorkspaceFolders returns empty list when project has no content roots`() {
70+
fun `createWorkspaceFolders handles modules with no content roots`() {
5671
val mockProject = mockk<Project>()
57-
val mockProjectRootManager = mockk<ProjectRootManager>()
72+
val mockModuleManager = mockk<ModuleManager>()
73+
val mockModule = mockk<Module>()
74+
val mockModuleRootManager = mockk<ModuleRootManager>()
75+
76+
mockkStatic(ModuleManager::class, ModuleRootManager::class)
5877

5978
every { mockProject.isDefault } returns false
60-
every { ProjectRootManager.getInstance(mockProject) } returns mockProjectRootManager
61-
every { mockProjectRootManager.contentRoots } returns emptyArray()
79+
every { ModuleManager.getInstance(mockProject) } returns mockModuleManager
80+
every { mockModuleManager.modules } returns arrayOf(mockModule)
81+
every { ModuleRootManager.getInstance(mockModule) } returns mockModuleRootManager
82+
every { mockModuleRootManager.contentRoots } returns emptyArray()
6283

6384
val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject)
6485

65-
assertThat(result).isEqualTo(emptyList<VirtualFile>())
86+
assertThat(result).isEmpty()
6687
}
6788

68-
private fun createMockVirtualFile(uri: URI, name: String): VirtualFile {
69-
val path = mockk<Path> {
70-
every { toUri() } returns uri
71-
}
72-
return mockk<VirtualFile> {
89+
private fun createMockVirtualFile(uri: URI, name: String): VirtualFile =
90+
mockk<VirtualFile> {
7391
every { url } returns uri.toString()
7492
every { getName() } returns name
75-
every { toNioPath() } returns path
7693
every { isDirectory } returns false
7794
every { fileSystem } returns mockk {
7895
every { protocol } returns "file"
7996
}
8097
}
81-
}
8298

8399
// for windows unit tests
84100
private fun normalizeFileUri(uri: String): String {
85101
if (!System.getProperty("os.name").lowercase().contains("windows")) {
86102
return uri
87103
}
88-
89104
if (!uri.startsWith("file:///")) {
90105
return uri
91106
}
92-
93107
val path = uri.substringAfter("file:///")
94108
return "file:///C:/$path"
95109
}

0 commit comments

Comments
 (0)