Skip to content

Commit a4a21c6

Browse files
feat(amazonq): re-enable DefaultModuleDependenciesService (#5889)
- Re-enable `DefaultModuleDependenciesService` it was disabled due to lsp wasn't able to handle these large amount of request. - Adding a step to de-dup and merge request, this reduce the `apache/dubbo` repo events from 439 to 112 - Partition the event by 10 per seconds to control the event flow to flare, this is needed to prevent flare freezing
1 parent cf66c6e commit a4a21c6

File tree

3 files changed

+76
-4
lines changed

3 files changed

+76
-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: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
99
import com.intellij.openapi.roots.ModuleRootEvent
1010
import com.intellij.openapi.roots.ModuleRootListener
1111
import kotlinx.coroutines.CoroutineScope
12+
import kotlinx.coroutines.delay
1213
import kotlinx.coroutines.launch
1314
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
1415
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.ModuleDependencyProvider.Companion.EP_NAME
@@ -44,14 +45,34 @@ class DefaultModuleDependenciesService(
4445
}
4546

4647
private fun syncAllModules() {
48+
val paramsMap = mutableMapOf<Pair<String, String>, DidChangeDependencyPathsParams>()
49+
4750
ModuleManager.getInstance(project).modules.forEach { module ->
4851
EP_NAME.forEachExtensionSafe {
4952
if (it.isApplicable(module)) {
50-
didChangeDependencyPaths(it.createParams(module))
53+
val params = it.createParams(module)
54+
val key = params.moduleName to params.runtimeLanguage
55+
56+
paramsMap.merge(key, params) { existing, new ->
57+
DidChangeDependencyPathsParams(
58+
moduleName = existing.moduleName,
59+
runtimeLanguage = existing.runtimeLanguage,
60+
paths = (existing.paths + new.paths).distinct(),
61+
includePatterns = (existing.includePatterns + new.includePatterns).distinct(),
62+
excludePatterns = (existing.excludePatterns + new.excludePatterns).distinct()
63+
)
64+
}
5165
return@forEachExtensionSafe
5266
}
5367
}
5468
}
69+
70+
paramsMap.values.chunked(10).forEachIndexed { index, chunk ->
71+
cs.launch {
72+
delay(index * 1000L)
73+
chunk.forEach { didChangeDependencyPaths(it) }
74+
}
75+
}
5576
}
5677

5778
override fun dispose() {

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,56 @@ 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+
prepDependencyProvider(
216+
listOf(
217+
Pair(module1, params1),
218+
Pair(module2, params2)
219+
)
220+
)
221+
222+
sut = DefaultModuleDependenciesService(project, this)
223+
224+
advanceUntilIdle()
225+
226+
// Verify only one call with merged paths
227+
verify(exactly = 1) {
228+
mockLanguageServer.didChangeDependencyPaths(
229+
match {
230+
it.moduleName == "sameModule" &&
231+
it.runtimeLanguage == "java" &&
232+
it.paths.containsAll(listOf("/path/to/dep1.jar", "/path/to/dep2.jar")) &&
233+
it.includePatterns.containsAll(listOf("*.java", "*.class")) &&
234+
it.excludePatterns.containsAll(listOf("test/**", "build/**"))
235+
}
236+
)
237+
}
238+
}
239+
190240
private fun prepDependencyProvider(moduleParamPairs: List<Pair<Module, DidChangeDependencyPathsParams>>) {
191241
every { mockModuleManager.modules } returns moduleParamPairs.map { it.first }.toTypedArray()
192242

0 commit comments

Comments
 (0)