From 5e5970716236d252ea37b210d1cbbbb711137f2e Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Mon, 7 Apr 2025 15:23:19 -0700 Subject: [PATCH] add languageId and version to didOpen message --- .../TextDocumentServiceHandler.kt | 2 + .../lsp/workspace/WorkspaceServiceHandler.kt | 2 + .../TextDocumentServiceHandlerTest.kt | 23 +++++++--- .../workspace/WorkspaceServiceHandlerTest.kt | 43 +++++++++++++++++-- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt index 49149863b67..bbf60200810 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt @@ -68,6 +68,8 @@ class TextDocumentServiceHandler( textDocument = TextDocumentItem().apply { this.uri = uri text = file.inputStream.readAllBytes().decodeToString() + languageId = file.fileType.name.lowercase() + version = file.modificationStamp.toInt() } } ) 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 1ea0c4de825..a457a6e0ef5 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 @@ -156,6 +156,8 @@ class WorkspaceServiceHandler( textDocument = TextDocumentItem().apply { this.uri = uri text = renamedFile.inputStream.readAllBytes().decodeToString() + languageId = renamedFile.fileType.name.lowercase() + version = renamedFile.modificationStamp.toInt() } } ) diff --git a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt index 14ee9888473..96da1fc4318 100644 --- a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt +++ b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.components.serviceIfCreated import com.intellij.openapi.editor.Document import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.fileEditor.FileEditorManager +import com.intellij.openapi.fileTypes.FileType import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.newvfs.events.VFileContentChangeEvent @@ -149,27 +150,27 @@ class TextDocumentServiceHandlerTest { with(paramsSlot.captured.textDocument) { assertThat(this.uri).isEqualTo(normalizeFileUri(uri.toString())) assertThat(text).isEqualTo(content) + assertThat(languageId).isEqualTo("java") + assertThat(version).isEqualTo(1) } } @Test fun `didOpen runs on fileOpened`() = runTest { - // Create test file val uri = URI.create("file:///test/path/file.txt") val content = "test content" - val file = createMockVirtualFile(uri, content) - // Call the handler method sut.fileOpened(mockk(), file) - // Verify the correct LSP method was called with matching parameters val paramsSlot = slot() verify { mockTextDocumentService.didOpen(capture(paramsSlot)) } with(paramsSlot.captured.textDocument) { assertThat(this.uri).isEqualTo(normalizeFileUri(uri.toString())) assertThat(text).isEqualTo(content) + assertThat(languageId).isEqualTo("java") + assertThat(version).isEqualTo(1) } } @@ -297,11 +298,21 @@ class TextDocumentServiceHandlerTest { } } - private fun createMockVirtualFile(uri: URI, content: String = ""): VirtualFile { + private fun createMockVirtualFile( + uri: URI, + content: String = "", + fileTypeName: String = "JAVA", + modificationStamp: Long = 1L, + ): VirtualFile { val path = mockk { every { toUri() } returns uri } val inputStream = content.byteInputStream() + + val mockFileType = mockk { + every { name } returns fileTypeName + } + return mockk { every { url } returns uri.path every { toNioPath() } returns path @@ -310,6 +321,8 @@ class TextDocumentServiceHandlerTest { every { protocol } returns "file" } every { this@mockk.inputStream } returns inputStream + every { fileType } returns mockFileType + every { this@mockk.modificationStamp } returns modificationStamp } } 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 3e5d4f5aea7..73a959d11b3 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 @@ -7,6 +7,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.application.Application import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.serviceIfCreated +import com.intellij.openapi.fileTypes.FileType import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.newvfs.events.VFileCopyEvent @@ -394,6 +395,8 @@ class WorkspaceServiceHandlerTest { oldName = oldName, newName = newName, isDirectory = false, + fileTypeName = "JAVA", + modificationStamp = 123L ) // Act @@ -405,8 +408,12 @@ class WorkspaceServiceHandlerTest { 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")) + with(openParams.captured.textDocument) { + assertThat(uri).isEqualTo(normalizeFileUri("file:///testDir/$newName")) + assertThat(text).isEqualTo("content") + assertThat(languageId).isEqualTo("java") + assertThat(version).isEqualTo(123) + } // Assert val paramsSlot = slot() @@ -464,10 +471,14 @@ class WorkspaceServiceHandlerTest { val event1 = createMockPropertyChangeEvent( oldName = "old1.java", newName = "new1.java", + fileTypeName = "JAVA", + modificationStamp = 123L ) val event2 = createMockPropertyChangeEvent( oldName = "old2.py", newName = "new2.py", + fileTypeName = "Python", + modificationStamp = 456L ) // Act @@ -477,6 +488,17 @@ class WorkspaceServiceHandlerTest { val paramsSlot = slot() verify { mockWorkspaceService.didRenameFiles(capture(paramsSlot)) } assertThat(paramsSlot.captured.files).hasSize(2) + + // Verify didClose and didOpen for both files + verify(exactly = 2) { mockTextDocumentService.didClose(any()) } + + val openParamsSlot = mutableListOf() + verify(exactly = 2) { mockTextDocumentService.didOpen(capture(openParamsSlot)) } + + assertThat(openParamsSlot[0].textDocument.languageId).isEqualTo("java") + assertThat(openParamsSlot[0].textDocument.version).isEqualTo(123) + assertThat(openParamsSlot[1].textDocument.languageId).isEqualTo("python") + assertThat(openParamsSlot[1].textDocument.version).isEqualTo(456) } @Test @@ -635,10 +657,19 @@ class WorkspaceServiceHandlerTest { assertThat(paramsSlot.captured.event.removed[0].name).isEqualTo("folder2") } - private fun createMockVirtualFile(uri: URI, fileName: String, isDirectory: Boolean = false): VirtualFile { + private fun createMockVirtualFile( + uri: URI, + fileName: String, + isDirectory: Boolean = false, + fileTypeName: String = "PLAIN_TEXT", + modificationStamp: Long = 1L, + ): VirtualFile { val nioPath = mockk { every { toUri() } returns uri } + val mockFileType = mockk { + every { name } returns fileTypeName + } return mockk { every { this@mockk.isDirectory } returns isDirectory every { toNioPath() } returns nioPath @@ -648,6 +679,8 @@ class WorkspaceServiceHandlerTest { every { protocol } returns "file" } every { this@mockk.inputStream } returns "content".byteInputStream() + every { fileType } returns mockFileType + every { this@mockk.modificationStamp } returns modificationStamp } } @@ -671,10 +704,12 @@ class WorkspaceServiceHandlerTest { oldName: String, newName: String, isDirectory: Boolean = false, + fileTypeName: String = "PLAIN_TEXT", + modificationStamp: Long = 1L, ): VFilePropertyChangeEvent { val parent = createMockVirtualFile(URI("file:///testDir/"), "testDir", true) val newUri = URI("file:///testDir/$newName") - val file = createMockVirtualFile(newUri, newName, isDirectory) + val file = createMockVirtualFile(newUri, newName, isDirectory, fileTypeName, modificationStamp) every { file.parent } returns parent return mockk().apply {