Skip to content

Commit 3a16038

Browse files
feat(amazonq): enable DefaultModuleDependenciesService with event reduction
1 parent 83ac4f5 commit 3a16038

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import software.aws.toolkits.core.utils.writeText
7373
import software.aws.toolkits.jetbrains.core.coroutines.ioDispatcher
7474
import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactManager
7575
import software.aws.toolkits.jetbrains.services.amazonq.lsp.auth.DefaultAuthCredentialsService
76+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.DefaultModuleDependenciesService
7677
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
7778
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AmazonQLspTypeAdapterFactory
7879
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsExtendedInitializeResult
@@ -592,9 +593,9 @@ private class AmazonQServerInstance(private val project: Project, private val cs
592593
WorkspaceServiceHandler(project, cs, lspInitResult).also {
593594
Disposer.register(this, it)
594595
}
595-
// DefaultModuleDependenciesService(project, cs).also {
596-
// Disposer.register(this, it)
597-
// }
596+
DefaultModuleDependenciesService(project, cs).also {
597+
Disposer.register(this, it)
598+
}
598599
}
599600
}
600601
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,29 @@ class DefaultModuleDependenciesService(
4444
}
4545

4646
private fun syncAllModules() {
47+
val paramsMap = mutableMapOf<Pair<String, String>, DidChangeDependencyPathsParams>()
48+
4749
ModuleManager.getInstance(project).modules.forEach { module ->
4850
EP_NAME.forEachExtensionSafe {
4951
if (it.isApplicable(module)) {
50-
didChangeDependencyPaths(it.createParams(module))
52+
val params = it.createParams(module)
53+
val key = params.moduleName to params.runtimeLanguage
54+
55+
paramsMap.merge(key, params) { existing, new ->
56+
DidChangeDependencyPathsParams(
57+
moduleName = existing.moduleName,
58+
runtimeLanguage = existing.runtimeLanguage,
59+
paths = (existing.paths + new.paths).distinct(),
60+
includePatterns = (existing.includePatterns + new.includePatterns).distinct(),
61+
excludePatterns = (existing.excludePatterns + new.excludePatterns).distinct()
62+
)
63+
}
5164
return@forEachExtensionSafe
5265
}
5366
}
5467
}
68+
69+
paramsMap.values.forEach { didChangeDependencyPaths(it) }
5570
}
5671

5772
override fun dispose() {

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,49 @@ class DefaultModuleDependenciesServiceTest {
187187
verify(exactly = 2) { mockLanguageServer.didChangeDependencyPaths(params) }
188188
}
189189

190+
@Test
191+
fun `test deduplication of same moduleName and runtimeLanguage`() = runTest {
192+
// Arrange
193+
val module1 = mockk<Module>()
194+
val module2 = mockk<Module>()
195+
val params1 = DidChangeDependencyPathsParams(
196+
moduleName = "sameModule",
197+
runtimeLanguage = "java",
198+
paths = listOf("/path/to/dep1.jar"),
199+
includePatterns = listOf("*.java"),
200+
excludePatterns = listOf("test/**")
201+
)
202+
val params2 = DidChangeDependencyPathsParams(
203+
moduleName = "sameModule",
204+
runtimeLanguage = "java",
205+
paths = listOf("/path/to/dep2.jar"),
206+
includePatterns = listOf("*.class"),
207+
excludePatterns = listOf("build/**")
208+
)
209+
210+
every { mockModuleManager.modules } returns arrayOf(module1, module2)
211+
every { mockDependencyProvider.isApplicable(any()) } returns true
212+
every { mockDependencyProvider.createParams(module1) } returns params1
213+
every { mockDependencyProvider.createParams(module2) } returns params2
214+
215+
sut = DefaultModuleDependenciesService(project, this)
216+
217+
advanceUntilIdle()
218+
219+
// Verify only one call with merged paths
220+
verify(exactly = 1) {
221+
mockLanguageServer.didChangeDependencyPaths(
222+
match {
223+
it.moduleName == "sameModule" &&
224+
it.runtimeLanguage == "java" &&
225+
it.paths.containsAll(listOf("/path/to/dep1.jar", "/path/to/dep2.jar")) &&
226+
it.includePatterns.containsAll(listOf("*.java", "*.class")) &&
227+
it.excludePatterns.containsAll(listOf("test/**", "build/**"))
228+
}
229+
)
230+
}
231+
}
232+
190233
private fun prepDependencyProvider(moduleParamPairs: List<Pair<Module, DidChangeDependencyPathsParams>>) {
191234
every { mockModuleManager.modules } returns moduleParamPairs.map { it.first }.toTypedArray()
192235

0 commit comments

Comments
 (0)