diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt index 1cba809683d..1ea0c4de825 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt @@ -20,12 +20,16 @@ import org.eclipse.lsp4j.CreateFilesParams import org.eclipse.lsp4j.DeleteFilesParams import org.eclipse.lsp4j.DidChangeWatchedFilesParams import org.eclipse.lsp4j.DidChangeWorkspaceFoldersParams +import org.eclipse.lsp4j.DidCloseTextDocumentParams +import org.eclipse.lsp4j.DidOpenTextDocumentParams import org.eclipse.lsp4j.FileChangeType import org.eclipse.lsp4j.FileCreate import org.eclipse.lsp4j.FileDelete import org.eclipse.lsp4j.FileEvent import org.eclipse.lsp4j.FileRename import org.eclipse.lsp4j.RenameFilesParams +import org.eclipse.lsp4j.TextDocumentIdentifier +import org.eclipse.lsp4j.TextDocumentItem import org.eclipse.lsp4j.WorkspaceFolder import org.eclipse.lsp4j.WorkspaceFoldersChangeEvent import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService @@ -135,6 +139,29 @@ class WorkspaceServiceHandler( val oldUri = toUriString(parentFile)?.let { parentUri -> "$parentUri/$oldFileName" } val newUri = toUriString(renamedFile) + if (!renamedFile.isDirectory) { + oldUri?.let { uri -> + languageServer.textDocumentService.didClose( + DidCloseTextDocumentParams().apply { + textDocument = TextDocumentIdentifier().apply { + this.uri = uri + } + } + ) + } + + newUri?.let { uri -> + languageServer.textDocumentService.didOpen( + DidOpenTextDocumentParams().apply { + textDocument = TextDocumentItem().apply { + this.uri = uri + text = renamedFile.inputStream.readAllBytes().decodeToString() + } + } + ) + } + } + FileRename().apply { this.oldUri = oldUri this.newUri = newUri diff --git a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandlerTest.kt b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandlerTest.kt index ef0adf1bf26..3e5d4f5aea7 100644 --- a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandlerTest.kt +++ b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandlerTest.kt @@ -31,10 +31,13 @@ import org.eclipse.lsp4j.CreateFilesParams import org.eclipse.lsp4j.DeleteFilesParams import org.eclipse.lsp4j.DidChangeWatchedFilesParams import org.eclipse.lsp4j.DidChangeWorkspaceFoldersParams +import org.eclipse.lsp4j.DidCloseTextDocumentParams +import org.eclipse.lsp4j.DidOpenTextDocumentParams import org.eclipse.lsp4j.FileChangeType import org.eclipse.lsp4j.RenameFilesParams import org.eclipse.lsp4j.WorkspaceFolder import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage +import org.eclipse.lsp4j.services.TextDocumentService import org.eclipse.lsp4j.services.WorkspaceService import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -50,6 +53,7 @@ class WorkspaceServiceHandlerTest { private lateinit var project: Project private lateinit var mockLanguageServer: AmazonQLanguageServer private lateinit var mockWorkspaceService: WorkspaceService + private lateinit var mockTextDocumentService: TextDocumentService private lateinit var sut: WorkspaceServiceHandler private lateinit var mockApplication: Application @@ -57,6 +61,7 @@ class WorkspaceServiceHandlerTest { fun setup() { project = mockk() mockWorkspaceService = mockk() + mockTextDocumentService = mockk() mockLanguageServer = mockk() mockApplication = mockk() @@ -89,6 +94,11 @@ class WorkspaceServiceHandlerTest { every { mockWorkspaceService.didChangeWatchedFiles(any()) } returns Unit every { mockWorkspaceService.didChangeWorkspaceFolders(any()) } returns Unit + // Mock textDocument service (for didRename calls) + every { mockLanguageServer.textDocumentService } returns mockTextDocumentService + every { mockTextDocumentService.didOpen(any()) } returns Unit + every { mockTextDocumentService.didClose(any()) } returns Unit + // Mock message bus val messageBus = mockk() every { project.messageBus } returns messageBus @@ -389,6 +399,15 @@ class WorkspaceServiceHandlerTest { // Act sut.after(listOf(propertyEvent)) + val closeParams = slot() + verify { mockTextDocumentService.didClose(capture(closeParams)) } + assertThat(closeParams.captured.textDocument.uri).isEqualTo(normalizeFileUri("file:///testDir/$oldName")) + + val openParams = slot() + verify { mockTextDocumentService.didOpen(capture(openParams)) } + assertThat(openParams.captured.textDocument.uri).isEqualTo(normalizeFileUri("file:///testDir/$newName")) + assertThat(openParams.captured.textDocument.text).isEqualTo(normalizeFileUri("content")) + // Assert val paramsSlot = slot() verify { mockWorkspaceService.didRenameFiles(capture(paramsSlot)) } @@ -411,6 +430,8 @@ class WorkspaceServiceHandlerTest { sut.after(listOf(propertyEvent)) // Assert + verify(exactly = 0) { mockTextDocumentService.didClose(any()) } + verify(exactly = 0) { mockTextDocumentService.didOpen(any()) } verify(exactly = 0) { mockWorkspaceService.didRenameFiles(any()) } } @@ -427,6 +448,8 @@ class WorkspaceServiceHandlerTest { sut.after(listOf(propertyEvent)) // Assert + verify(exactly = 0) { mockTextDocumentService.didClose(any()) } + verify(exactly = 0) { mockTextDocumentService.didOpen(any()) } val paramsSlot = slot() verify { mockWorkspaceService.didRenameFiles(capture(paramsSlot)) } with(paramsSlot.captured.files[0]) { @@ -624,6 +647,7 @@ class WorkspaceServiceHandlerTest { every { fileSystem } returns mockk { every { protocol } returns "file" } + every { this@mockk.inputStream } returns "content".byteInputStream() } }