Skip to content

Commit 7cb2b07

Browse files
authored
fix(amazonq): fix issue where AmazonQLspService subservices are never disposed (#5753)
1 parent e68a6ad commit 7cb2b07

File tree

9 files changed

+51
-37
lines changed

9 files changed

+51
-37
lines changed

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -476,10 +476,18 @@ private class AmazonQServerInstance(private val project: Project, private val cs
476476
}
477477

478478
this@AmazonQServerInstance.apply {
479-
DefaultAuthCredentialsService(project, encryptionManager, this)
480-
TextDocumentServiceHandler(project, this)
481-
WorkspaceServiceHandler(project, lspInitResult, this)
482-
DefaultModuleDependenciesService(project, this)
479+
DefaultAuthCredentialsService(project, encryptionManager).also {
480+
Disposer.register(this, it)
481+
}
482+
TextDocumentServiceHandler(project).also {
483+
Disposer.register(this, it)
484+
}
485+
WorkspaceServiceHandler(project, lspInitResult).also {
486+
Disposer.register(this, it)
487+
}
488+
DefaultModuleDependenciesService(project).also {
489+
Disposer.register(this, it)
490+
}
483491
}
484492
}
485493
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import java.util.concurrent.TimeUnit
3838
class DefaultAuthCredentialsService(
3939
private val project: Project,
4040
private val encryptionManager: JwtEncryptionManager,
41-
serverInstance: Disposable,
4241
) : AuthCredentialsService,
4342
BearerTokenProviderListener,
4443
ToolkitConnectionManagerListener,
@@ -50,7 +49,7 @@ class DefaultAuthCredentialsService(
5049
private val tokenSyncIntervalMinutes = 5L
5150

5251
init {
53-
project.messageBus.connect(serverInstance).apply {
52+
project.messageBus.connect(this).apply {
5453
subscribe(BearerTokenProviderListener.TOPIC, this@DefaultAuthCredentialsService)
5554
subscribe(ToolkitConnectionManagerListener.TOPIC, this@DefaultAuthCredentialsService)
5655
subscribe(QRegionProfileSelectedListener.TOPIC, this@DefaultAuthCredentialsService)

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
1515

1616
class DefaultModuleDependenciesService(
1717
private val project: Project,
18-
serverInstance: Disposable,
1918
) : ModuleDependenciesService,
20-
ModuleRootListener {
21-
19+
ModuleRootListener,
20+
Disposable {
2221
init {
23-
project.messageBus.connect(serverInstance).subscribe(
22+
project.messageBus.connect(this).subscribe(
2423
ModuleRootListener.TOPIC,
2524
this
2625
)
@@ -52,4 +51,7 @@ class DefaultModuleDependenciesService(
5251
}
5352
}
5453
}
54+
55+
override fun dispose() {
56+
}
5557
}

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,26 @@ import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
3232

3333
class TextDocumentServiceHandler(
3434
private val project: Project,
35-
private val serverInstance: Disposable,
3635
) : FileDocumentManagerListener,
3736
FileEditorManagerListener,
3837
BulkFileListener,
39-
DocumentListener {
40-
38+
DocumentListener,
39+
Disposable {
4140
init {
4241
// didOpen & didClose events
43-
project.messageBus.connect(serverInstance).subscribe(
42+
project.messageBus.connect(this).subscribe(
4443
FileEditorManagerListener.FILE_EDITOR_MANAGER,
4544
this
4645
)
4746

4847
// didChange events
49-
project.messageBus.connect(serverInstance).subscribe(
48+
project.messageBus.connect(this).subscribe(
5049
VirtualFileManager.VFS_CHANGES,
5150
this
5251
)
5352

5453
// didSave events
55-
project.messageBus.connect(serverInstance).subscribe(
54+
project.messageBus.connect(this).subscribe(
5655
FileDocumentManagerListener.TOPIC,
5756
this
5857
)
@@ -72,7 +71,7 @@ class TextDocumentServiceHandler(
7271
realTimeEdit(event)
7372
}
7473
},
75-
serverInstance
74+
this
7675
)
7776
}
7877
AmazonQLspService.executeIfRunning(project) { languageServer ->
@@ -183,4 +182,7 @@ class TextDocumentServiceHandler(
183182
}
184183
// Process document changes here
185184
}
185+
186+
override fun dispose() {
187+
}
186188
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,22 @@ import java.nio.file.Paths
4545
class WorkspaceServiceHandler(
4646
private val project: Project,
4747
initializeResult: InitializeResult,
48-
serverInstance: Disposable,
4948
) : BulkFileListener,
50-
ModuleRootListener {
49+
ModuleRootListener,
50+
Disposable {
5151

5252
private var lastSnapshot: List<WorkspaceFolder> = emptyList()
5353
private val operationMatchers: MutableMap<FileOperationType, List<Pair<PathMatcher, String>>> = mutableMapOf()
5454

5555
init {
5656
operationMatchers.putAll(initializePatterns(initializeResult))
5757

58-
project.messageBus.connect(serverInstance).subscribe(
58+
project.messageBus.connect(this).subscribe(
5959
VirtualFileManager.VFS_CHANGES,
6060
this
6161
)
6262

63-
project.messageBus.connect(serverInstance).subscribe(
63+
project.messageBus.connect(this).subscribe(
6464
ModuleRootListener.TOPIC,
6565
this
6666
)
@@ -313,4 +313,7 @@ class WorkspaceServiceHandler(
313313
lastSnapshot = currentSnapshot
314314
}
315315
}
316+
317+
override fun dispose() {
318+
}
316319
}

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/DefaultAuthCredentialsServiceTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class DefaultAuthCredentialsServiceTest {
143143

144144
@Test
145145
fun `activeConnectionChanged updates token when connection ID matches Q connection`() {
146-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
146+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
147147
val newConnection = createMockConnection("new-token", "connection-id")
148148
every { mockConnection.id } returns "connection-id"
149149

@@ -154,7 +154,7 @@ class DefaultAuthCredentialsServiceTest {
154154

155155
@Test
156156
fun `activeConnectionChanged does not update token when connection ID differs`() {
157-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
157+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
158158
val newConnection = createMockConnection("new-token", "different-id")
159159
every { mockConnection.id } returns "q-connection-id"
160160

@@ -165,7 +165,7 @@ class DefaultAuthCredentialsServiceTest {
165165

166166
@Test
167167
fun `onChange updates token with new connection`() {
168-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
168+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
169169
setupMockConnectionManager("updated-token")
170170

171171
sut.onChange("providerId", listOf("new-scope"))
@@ -178,7 +178,7 @@ class DefaultAuthCredentialsServiceTest {
178178
every { isQConnected(project) } returns false
179179
every { isQExpired(project) } returns false
180180

181-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
181+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
182182

183183
verify(exactly = 0) { mockLanguageServer.updateTokenCredentials(any()) }
184184
}
@@ -188,15 +188,15 @@ class DefaultAuthCredentialsServiceTest {
188188
every { isQConnected(project) } returns true
189189
every { isQExpired(project) } returns true
190190

191-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
191+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
192192

193193
verify(exactly = 0) { mockLanguageServer.updateTokenCredentials(any()) }
194194
}
195195

196196
@Test
197197
fun `test updateTokenCredentials unencrypted success`() {
198198
val isEncrypted = false
199-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
199+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
200200

201201
sut.updateTokenCredentials(mockConnection, isEncrypted)
202202

@@ -215,7 +215,7 @@ class DefaultAuthCredentialsServiceTest {
215215

216216
@Test
217217
fun `test updateTokenCredentials encrypted success`() {
218-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
218+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
219219

220220
val encryptedToken = "encryptedToken"
221221
val isEncrypted = true
@@ -239,7 +239,7 @@ class DefaultAuthCredentialsServiceTest {
239239

240240
@Test
241241
fun `test deleteTokenCredentials success`() {
242-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
242+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
243243

244244
every { mockLanguageServer.deleteTokenCredentials() } returns CompletableFuture.completedFuture(Unit)
245245

@@ -252,7 +252,7 @@ class DefaultAuthCredentialsServiceTest {
252252
fun `init results in token update`() {
253253
every { isQConnected(any()) } returns true
254254
every { isQExpired(any()) } returns false
255-
sut = DefaultAuthCredentialsService(project, mockEncryptionManager, mockk())
255+
sut = DefaultAuthCredentialsService(project, mockEncryptionManager)
256256

257257
verify(exactly = 1) { mockLanguageServer.updateTokenCredentials(any()) }
258258
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class DefaultModuleDependenciesServiceTest {
9595
every { mockModuleManager.modules } returns arrayOf(module)
9696
prepDependencyProvider(listOf(Pair(module, params)))
9797

98-
sut = DefaultModuleDependenciesService(project, mockk())
98+
sut = DefaultModuleDependenciesService(project)
9999

100100
verify { mockLanguageServer.didChangeDependencyPaths(params) }
101101
}
@@ -127,7 +127,7 @@ class DefaultModuleDependenciesServiceTest {
127127
)
128128
)
129129

130-
sut = DefaultModuleDependenciesService(project, mockk())
130+
sut = DefaultModuleDependenciesService(project)
131131

132132
verify { mockLanguageServer.didChangeDependencyPaths(params1) }
133133
verify { mockLanguageServer.didChangeDependencyPaths(params2) }
@@ -148,7 +148,7 @@ class DefaultModuleDependenciesServiceTest {
148148
val event = mockk<ModuleRootEvent>()
149149
every { event.isCausedByFileTypesChange } returns true
150150

151-
sut = DefaultModuleDependenciesService(project, mockk())
151+
sut = DefaultModuleDependenciesService(project)
152152

153153
sut.rootsChanged(event)
154154

@@ -173,7 +173,7 @@ class DefaultModuleDependenciesServiceTest {
173173

174174
prepDependencyProvider(listOf(Pair(module, params)))
175175

176-
sut = DefaultModuleDependenciesService(project, mockk())
176+
sut = DefaultModuleDependenciesService(project)
177177

178178
sut.rootsChanged(event)
179179

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class TextDocumentServiceHandlerTest {
9494
every { mockTextDocumentService.didOpen(any()) } returns Unit
9595
every { mockTextDocumentService.didClose(any()) } returns Unit
9696

97-
sut = TextDocumentServiceHandler(projectRule.project, mockk())
97+
sut = TextDocumentServiceHandler(projectRule.project)
9898
}
9999

100100
@Test
@@ -137,7 +137,7 @@ class TextDocumentServiceHandlerTest {
137137
projectRule.fixture.createFile("name", content).also { projectRule.fixture.openFileInEditor(it) }
138138
}
139139

140-
sut = TextDocumentServiceHandler(projectRule.project, mockk())
140+
sut = TextDocumentServiceHandler(projectRule.project)
141141

142142
val paramsSlot = mutableListOf<DidOpenTextDocumentParams>()
143143
verify { mockTextDocumentService.didOpen(capture(paramsSlot)) }

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandlerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class WorkspaceServiceHandlerTest {
146146
every { mockInitializeResult.capabilities } returns mockCapabilities
147147

148148
// Create WorkspaceServiceHandler with mocked InitializeResult
149-
sut = WorkspaceServiceHandler(project, mockInitializeResult, mockk())
149+
sut = WorkspaceServiceHandler(project, mockInitializeResult)
150150
}
151151

152152
@Test

0 commit comments

Comments
 (0)