Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(amazonq): implement TextDocumentService message handler #5380

Open
wants to merge 25 commits into
base: feature/q-lsp
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4da2951
init
samgst-amazon Feb 14, 2025
334feda
implement file open and close
samgst-amazon Feb 14, 2025
12a5484
make class the listener
samgst-amazon Feb 15, 2025
878b06e
detekt
samgst-amazon Feb 15, 2025
79b1f38
init executeIfRunning implementation
samgst-amazon Feb 17, 2025
19478d9
detekt
samgst-amazon Feb 17, 2025
9794098
remove unused param
samgst-amazon Feb 17, 2025
41c225b
didChange impl
samgst-amazon Feb 17, 2025
6cda596
didSave impl
samgst-amazon Feb 17, 2025
1f2de8b
constructor param
samgst-amazon Feb 17, 2025
cac22b9
executeIfRunning whole function
samgst-amazon Feb 17, 2025
bd0bd10
move executeIfRunning
samgst-amazon Feb 18, 2025
8961b5d
Merge branch 'feature/q-lsp' into samgst/q-lsp-TDmessages
samgst-amazon Feb 18, 2025
1de97ce
use companion obj call
samgst-amazon Feb 18, 2025
43774b2
make serverInstance private
samgst-amazon Feb 18, 2025
22071e6
null uri handling
samgst-amazon Feb 19, 2025
b6af245
Merge branch 'feature/q-lsp' into samgst/q-lsp-TDmessages
samgst-amazon Feb 19, 2025
482a6ff
add testing for TextDocumentServiceHandler
samgst-amazon Feb 24, 2025
e4a9b9e
additional tests
samgst-amazon Feb 24, 2025
0d26dfe
Merge branch 'feature/q-lsp' into samgst/q-lsp-TDmessages
samgst-amazon Feb 24, 2025
83f7d12
Merge branch 'feature/q-lsp' into samgst/q-lsp-TDmessages
samgst-amazon Feb 26, 2025
a026102
Merge branch 'feature/q-lsp' into samgst/q-lsp-TDmessages
samgst-amazon Feb 28, 2025
c842495
fix test
samgst-amazon Feb 28, 2025
370ecc5
Merge branch 'feature/q-lsp' into samgst/q-lsp-TDmessages
samgst-amazon Feb 28, 2025
b69d6c6
detekt
samgst-amazon Feb 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import software.aws.toolkits.jetbrains.isDeveloperMode
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtendedClientMetadata
import software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument.TextDocumentServiceHandler
import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata
import java.io.IOException
import java.io.OutputStreamWriter
Expand Down Expand Up @@ -86,7 +87,7 @@

@Service(Service.Level.PROJECT)
class AmazonQLspService(private val project: Project, private val cs: CoroutineScope) : Disposable {
private var instance: AmazonQServerInstance? = null
internal var instance: AmazonQServerInstance? = null

Check warning on line 90 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L90 was not covered by tests

init {
cs.launch {
Expand All @@ -111,12 +112,12 @@
}
}

private class AmazonQServerInstance(private val project: Project, private val cs: CoroutineScope) : Disposable {
internal class AmazonQServerInstance(private val project: Project, private val cs: CoroutineScope) : Disposable {

Check warning on line 115 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L115 was not covered by tests
private val encryptionManager = JwtEncryptionManager()

private val launcher: Launcher<AmazonQLanguageServer>

private val languageServer: AmazonQLanguageServer
internal val languageServer: AmazonQLanguageServer
get() = launcher.remoteProxy

@Suppress("ForbiddenVoid")
Expand Down Expand Up @@ -235,6 +236,11 @@
}
languageServer.initialized(InitializedParams())
}

TextDocumentServiceHandler(
project,
this

Check warning on line 242 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L240 - L242 were not covered by tests
)
}

override fun dispose() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument

import com.intellij.openapi.Disposable
import com.intellij.openapi.editor.Document
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.fileEditor.FileDocumentManagerListener
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.FileEditorManagerListener
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.newvfs.BulkFileListener
import com.intellij.openapi.vfs.newvfs.events.VFileContentChangeEvent
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
import org.eclipse.lsp4j.DidChangeTextDocumentParams
import org.eclipse.lsp4j.DidCloseTextDocumentParams
import org.eclipse.lsp4j.DidOpenTextDocumentParams
import org.eclipse.lsp4j.DidSaveTextDocumentParams
import org.eclipse.lsp4j.TextDocumentContentChangeEvent
import org.eclipse.lsp4j.TextDocumentIdentifier
import org.eclipse.lsp4j.TextDocumentItem
import org.eclipse.lsp4j.VersionedTextDocumentIdentifier
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread

class TextDocumentServiceHandler(
private val project: Project,
private val serverInstance: Disposable,

Check warning on line 32 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Constructor parameter is never used as a property

Constructor parameter is never used as a property

Check warning on line 32 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L30 - L32 were not covered by tests
) : FileDocumentManagerListener,
FileEditorManagerListener,
BulkFileListener {

init {

Check warning on line 37 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L37 was not covered by tests
// didOpen & didClose events
project.messageBus.connect(serverInstance).subscribe(
FileEditorManagerListener.FILE_EDITOR_MANAGER,
this

Check warning on line 41 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L39 - L41 were not covered by tests
)

// didChange events
project.messageBus.connect(serverInstance).subscribe(
VirtualFileManager.VFS_CHANGES,
this

Check warning on line 47 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L45 - L47 were not covered by tests
)

// didSave events
project.messageBus.connect(serverInstance).subscribe(
FileDocumentManagerListener.TOPIC,
this

Check warning on line 53 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L51 - L53 were not covered by tests
)
}

Check warning on line 55 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L55 was not covered by tests

private fun executeIfRunning(project: Project, runnable: (AmazonQLanguageServer) -> Unit) =
AmazonQLspService.getInstance(project).instance?.languageServer?.let { runnable(it) }

override fun beforeDocumentSaving(document: Document) {
val file = FileDocumentManager.getInstance().getFile(document) ?: return
executeIfRunning(project) {
it.textDocumentService.didSave(
DidSaveTextDocumentParams().apply {
textDocument = TextDocumentIdentifier().apply {
uri = file.url
}
text = document.text
}

Check warning on line 69 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L62 - L69 were not covered by tests
)
}
}

Check warning on line 72 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L71 - L72 were not covered by tests

override fun after(events: MutableList<out VFileEvent>) {
pluginAwareExecuteOnPooledThread {
events.filterIsInstance<VFileContentChangeEvent>().forEach { event ->

Check warning on line 76 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L75 - L76 were not covered by tests

val document = FileDocumentManager.getInstance().getCachedDocument(event.file) ?: return@forEach
executeIfRunning(project) {
it.textDocumentService.didChange(
DidChangeTextDocumentParams().apply {
textDocument = VersionedTextDocumentIdentifier().apply {
uri = event.file.url
version = document.modificationStamp.toInt()
}
contentChanges = listOf(
TextDocumentContentChangeEvent().apply {
text = document.text
}

Check warning on line 89 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L79 - L89 were not covered by tests
)
}

Check warning on line 91 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L91 was not covered by tests
)
}
}
}
}

Check warning on line 96 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L93 - L96 were not covered by tests

override fun fileOpened(
source: FileEditorManager,
file: VirtualFile,
) {
executeIfRunning(project) {
it.textDocumentService.didOpen(
DidOpenTextDocumentParams().apply {
textDocument = TextDocumentItem().apply {
uri = file.url
text = file.inputStream.readAllBytes().decodeToString()
}
}

Check warning on line 109 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L102 - L109 were not covered by tests
)
}
}

Check warning on line 112 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L111 - L112 were not covered by tests

override fun fileClosed(
source: FileEditorManager,
file: VirtualFile,
) {
executeIfRunning(project) {
it.textDocumentService.didClose(
DidCloseTextDocumentParams().apply {
textDocument = TextDocumentIdentifier().apply {
uri = file.url
}
}

Check warning on line 124 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L118 - L124 were not covered by tests
)
}
}

Check warning on line 127 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L126 - L127 were not covered by tests
}
Loading