Skip to content

Commit 59d5c75

Browse files
fix(amazonq): fix didChangeDependencyPathsParams with absolute pathing (#5492)
* update dependency pathing * detekt * prefix and suffix changes for messages
1 parent 60a42f4 commit 59d5c75

File tree

5 files changed

+35
-77
lines changed

5 files changed

+35
-77
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/ModuleDependencyProvider.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies
55

66
import com.intellij.openapi.extensions.ExtensionPointName
77
import com.intellij.openapi.module.Module
8+
import com.intellij.openapi.roots.ModuleRootManager
9+
import com.intellij.openapi.vfs.VirtualFile
810
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams
11+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString
912

1013
interface ModuleDependencyProvider {
1114
companion object {
@@ -14,4 +17,9 @@ interface ModuleDependencyProvider {
1417

1518
fun isApplicable(module: Module): Boolean
1619
fun createParams(module: Module): DidChangeDependencyPathsParams
20+
21+
fun getWorkspaceFolderPath(module: Module): String {
22+
val contentRoots: Array<VirtualFile> = ModuleRootManager.getInstance(module).contentRoots
23+
return contentRoots.firstOrNull()?.let { toUriString(it) }.orEmpty()
24+
}
1725
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/providers/JavaModuleDependencyProvider.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.intellij.openapi.module.Module
77
import com.intellij.openapi.projectRoots.JavaSdkType
88
import com.intellij.openapi.roots.ModuleRootManager
99
import com.intellij.openapi.roots.OrderRootType
10-
import com.intellij.openapi.vfs.VfsUtil
1110
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.ModuleDependencyProvider
1211
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams
1312

@@ -16,31 +15,21 @@ internal class JavaModuleDependencyProvider : ModuleDependencyProvider {
1615
ModuleRootManager.getInstance(module).sdk?.sdkType is JavaSdkType
1716

1817
override fun createParams(module: Module): DidChangeDependencyPathsParams {
19-
val sourceRoots = getSourceRoots(module)
2018
val dependencies = mutableListOf<String>()
2119

2220
ModuleRootManager.getInstance(module).orderEntries().forEachLibrary { library ->
23-
library.getUrls(OrderRootType.CLASSES).forEach { url ->
24-
dependencies.add(VfsUtil.urlToPath(url))
21+
library.getFiles(OrderRootType.CLASSES).forEach { file ->
22+
dependencies.add(file.path.removeSuffix("!/"))
2523
}
2624
true
2725
}
2826

2927
return DidChangeDependencyPathsParams(
30-
moduleName = module.name,
31-
programmingLanguage = "Java",
32-
files = sourceRoots,
33-
dirs = dependencies,
28+
moduleName = getWorkspaceFolderPath(module),
29+
programmingLanguage = "java",
30+
paths = dependencies,
3431
includePatterns = emptyList(),
3532
excludePatterns = emptyList()
3633
)
3734
}
38-
39-
private fun getSourceRoots(module: Module): List<String> =
40-
ModuleRootManager.getInstance(module).contentEntries
41-
.flatMap { contentEntry ->
42-
contentEntry.sourceFolders
43-
.filter { !it.isTestSource }
44-
.mapNotNull { it.file?.path }
45-
}
4635
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/providers/PythonModuleDependencyProvider.kt

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.providers
55

66
import com.intellij.openapi.module.Module
7-
import com.intellij.openapi.roots.ModuleRootManager
87
import com.jetbrains.python.packaging.management.PythonPackageManager
98
import com.jetbrains.python.sdk.PythonSdkUtil
109
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.ModuleDependencyProvider
@@ -15,31 +14,26 @@ internal class PythonModuleDependencyProvider : ModuleDependencyProvider {
1514
PythonSdkUtil.findPythonSdk(module) != null
1615

1716
override fun createParams(module: Module): DidChangeDependencyPathsParams {
18-
val sourceRoots = getSourceRoots(module)
1917
val dependencies = mutableListOf<String>()
2018

2119
PythonSdkUtil.findPythonSdk(module)?.let { sdk ->
22-
val packageManager = PythonPackageManager.forSdk(module.project, sdk)
23-
packageManager.installedPackages.forEach { pkg ->
24-
dependencies.add(pkg.name)
20+
PythonSdkUtil.getSitePackagesDirectory(sdk)?.let { sitePackagesDir ->
21+
val packageManager = PythonPackageManager.forSdk(module.project, sdk)
22+
packageManager.installedPackages.forEach { pkg ->
23+
val packageDir = sitePackagesDir.findChild(pkg.name)
24+
if (packageDir != null) {
25+
dependencies.add(packageDir.path)
26+
}
27+
}
2528
}
2629
}
2730

2831
return DidChangeDependencyPathsParams(
29-
moduleName = module.name,
30-
programmingLanguage = "Python",
31-
files = sourceRoots,
32-
dirs = dependencies,
32+
moduleName = getWorkspaceFolderPath(module),
33+
programmingLanguage = "python",
34+
paths = dependencies,
3335
includePatterns = emptyList(),
3436
excludePatterns = emptyList()
3537
)
3638
}
37-
38-
private fun getSourceRoots(module: Module): List<String> =
39-
ModuleRootManager.getInstance(module).contentEntries
40-
.flatMap { contentEntry ->
41-
contentEntry.sourceFolders
42-
.filter { !it.isTestSource }
43-
.mapNotNull { it.file?.path }
44-
}
4539
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependenc
66
class DidChangeDependencyPathsParams(
77
val moduleName: String,
88
val programmingLanguage: String,
9-
val files: List<String>,
10-
val dirs: List<String>,
9+
val paths: List<String>,
1110
val includePatterns: List<String>,
1211
val excludePatterns: List<String>,
1312
)

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/DefaultModuleDependenciesServiceTest.kt

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,13 @@ class DefaultModuleDependenciesServiceTest {
9191
val module = mockk<Module>()
9292
val params = DidChangeDependencyPathsParams(
9393
moduleName = "testModule",
94-
programmingLanguage = "Java",
95-
files = listOf("src/main"),
96-
dirs = listOf("lib"),
94+
programmingLanguage = "java",
95+
paths = listOf("/path/to/dependency.jar"),
9796
includePatterns = emptyList(),
9897
excludePatterns = emptyList()
9998
)
10099

101100
every { mockModuleManager.modules } returns arrayOf(module)
102-
103101
prepDependencyProvider(listOf(Pair(module, params)))
104102

105103
sut = DefaultModuleDependenciesService(project, mockk())
@@ -114,17 +112,15 @@ class DefaultModuleDependenciesServiceTest {
114112
val module2 = mockk<Module>()
115113
val params1 = DidChangeDependencyPathsParams(
116114
moduleName = "module1",
117-
programmingLanguage = "Java",
118-
files = listOf("src/main1"),
119-
dirs = listOf("lib1"),
115+
programmingLanguage = "java",
116+
paths = listOf("/path/to/dependency1.jar"),
120117
includePatterns = emptyList(),
121118
excludePatterns = emptyList()
122119
)
123120
val params2 = DidChangeDependencyPathsParams(
124121
moduleName = "module2",
125-
programmingLanguage = "Java",
126-
files = listOf("src/main2"),
127-
dirs = listOf("lib2"),
122+
programmingLanguage = "python",
123+
paths = listOf("/path/to/site-packages/package1"),
128124
includePatterns = emptyList(),
129125
excludePatterns = emptyList()
130126
)
@@ -138,41 +134,18 @@ class DefaultModuleDependenciesServiceTest {
138134

139135
sut = DefaultModuleDependenciesService(project, mockk())
140136

141-
// Verify both modules were synced
142137
verify { mockLanguageServer.didChangeDependencyPaths(params1) }
143138
verify { mockLanguageServer.didChangeDependencyPaths(params2) }
144139
}
145140

146-
@Test
147-
fun `test rootsChanged with non-applicable module`() {
148-
// Arrange
149-
val module = mockk<Module>()
150-
151-
every { mockModuleManager.modules } returns arrayOf(module)
152-
153-
every {
154-
EP_NAME.forEachExtensionSafe(any<Consumer<ModuleDependencyProvider>>())
155-
} answers {
156-
val consumer = firstArg<Consumer<ModuleDependencyProvider>>()
157-
every { mockDependencyProvider.isApplicable(any()) } returns false
158-
consumer.accept(mockDependencyProvider)
159-
}
160-
161-
sut = DefaultModuleDependenciesService(project, mockk())
162-
163-
// Verify no sync occurred
164-
verify(exactly = 0) { mockLanguageServer.didChangeDependencyPaths(any()) }
165-
}
166-
167141
@Test
168142
fun `test rootsChanged withFileTypesChange`() {
169143
// Arrange
170144
val module = mockk<Module>()
171145
val params = DidChangeDependencyPathsParams(
172146
moduleName = "testModule",
173-
programmingLanguage = "Java",
174-
files = listOf("src/main"),
175-
dirs = listOf("lib"),
147+
programmingLanguage = "java",
148+
paths = listOf("/path/to/dependency.jar"),
176149
includePatterns = emptyList(),
177150
excludePatterns = emptyList()
178151
)
@@ -182,10 +155,8 @@ class DefaultModuleDependenciesServiceTest {
182155

183156
sut = DefaultModuleDependenciesService(project, mockk())
184157

185-
// Act
186158
sut.rootsChanged(event)
187159

188-
// Verify sync occurred once - once on init and rootsChange ignores
189160
verify(exactly = 1) { mockLanguageServer.didChangeDependencyPaths(params) }
190161
}
191162

@@ -195,9 +166,8 @@ class DefaultModuleDependenciesServiceTest {
195166
val module = mockk<Module>()
196167
val params = DidChangeDependencyPathsParams(
197168
moduleName = "testModule",
198-
programmingLanguage = "Java",
199-
files = listOf("src/main"),
200-
dirs = listOf("lib"),
169+
programmingLanguage = "java",
170+
paths = listOf("/path/to/dependency.jar"),
201171
includePatterns = emptyList(),
202172
excludePatterns = emptyList()
203173
)
@@ -210,10 +180,8 @@ class DefaultModuleDependenciesServiceTest {
210180

211181
sut = DefaultModuleDependenciesService(project, mockk())
212182

213-
// Act
214183
sut.rootsChanged(event)
215184

216-
// Verify sync occurred twice - once on init and once after rootsChanged
217185
verify(exactly = 2) { mockLanguageServer.didChangeDependencyPaths(params) }
218186
}
219187

0 commit comments

Comments
 (0)