Skip to content
Closed
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
39f2f5b
add message and data classes
samgst-amazon Mar 17, 2025
7204f2a
server config support for includeSuggestionsWithCodeReferences
samgst-amazon Mar 17, 2025
7b41616
Update plugins/amazonq/shared/jetbrains-community/src/software/aws/to…
samgst-amazon Mar 18, 2025
497cbdb
Merge branch 'feature/q-lsp' into samgst/q-lsp-aws-config
samgst-amazon Mar 18, 2025
430bf1b
data classes
samgst-amazon Mar 18, 2025
0b95441
send inlineCompletionParams to lsp
samgst-amazon Mar 18, 2025
dad393e
handler for aws/textDocument
samgst-amazon Mar 19, 2025
8a93408
add to existing textDocumentServiceHandler
samgst-amazon Mar 19, 2025
fa5b08a
Merge branch 'feature/q-lsp' into samgst/q-lsp-inlineCompletion
samgst-amazon Mar 19, 2025
37c88e3
detekt
samgst-amazon Mar 20, 2025
ae44899
code scan
samgst-amazon Mar 20, 2025
4f62d74
didOpen captures already open files in IDE
samgst-amazon Mar 21, 2025
c9cdb9e
Merge branch 'samgst/q-lsp-didOpen-init' into samgst/q-lsp-inlineComp…
samgst-amazon Mar 24, 2025
a2afd32
add more listeners to handler
samgst-amazon Mar 24, 2025
ee72f6d
Merge branch 'feature/q-lsp' into samgst/q-lsp-inlineCompletion
samgst-amazon Mar 24, 2025
8af0bb3
move call into codewhispererService
samgst-amazon Mar 26, 2025
e60ee13
add call
samgst-amazon Mar 26, 2025
72d1c1f
triggerType passed through
samgst-amazon Mar 26, 2025
9cfb452
Merge branch 'feature/q-lsp' into samgst/q-lsp-inlineCompletion
samgst-amazon Mar 26, 2025
bf77c91
ReadAction for param building
samgst-amazon Mar 27, 2025
2ddd138
test
samgst-amazon Mar 27, 2025
6ebef65
Merge branch 'feature/q-lsp' into samgst/q-lsp-inlineCompletion
samgst-amazon Mar 27, 2025
7bf9e83
Merge branch 'feature/q-lsp' into samgst/q-lsp-inlineCompletion
samgst-amazon Mar 31, 2025
8eca4ad
Merge branch 'feature/q-lsp' into samgst/q-lsp-inlineCompletion
samgst-amazon Mar 31, 2025
a5c4c1a
Merge branch 'feature/q-lsp' into samgst/q-lsp-inlineCompletion
samgst-amazon Apr 1, 2025
87292a0
Merge branch 'main' into samgst/q-lsp-inlineCompletion
samgst-amazon Apr 21, 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 @@ -29,6 +29,8 @@
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.eclipse.lsp4j.Position
import org.eclipse.lsp4j.TextDocumentIdentifier
import software.amazon.awssdk.core.exception.SdkServiceException
import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException
Expand All @@ -53,6 +55,11 @@
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection
import software.aws.toolkits.jetbrains.services.amazonq.SUPPLEMENTAL_CONTEXT_TIMEOUT
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionContext
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionTriggerKind
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionWithReferencesParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorManager
Expand Down Expand Up @@ -205,6 +212,7 @@
return
}

handleInlineCompletion(editor)

Check warning on line 215 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt#L215

Added line #L215 was not covered by tests
invokeCodeWhispererInBackground(requestContext)
}

Expand Down Expand Up @@ -527,6 +535,15 @@
return nextStates
}

internal fun handleInlineCompletion(editor: Editor) {

Check notice on line 538 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Class member can have 'private' visibility

Function 'handleInlineCompletion' could be private
editor.project?.let { project ->
AmazonQLspService.executeIfRunning(project) { server ->
val params = buildInlineCompletionParams(editor)
server.inlineCompletionWithReferences(params)
}

Check warning on line 543 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt#L540-L543

Added lines #L540 - L543 were not covered by tests
}
}

Check warning on line 545 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt#L545

Added line #L545 was not covered by tests

private fun initStates(
requestContext: RequestContext,
responseContext: ResponseContext,
Expand Down Expand Up @@ -706,6 +723,19 @@
return states
}

private fun buildInlineCompletionParams(editor: Editor): InlineCompletionWithReferencesParams =
InlineCompletionWithReferencesParams(
context = InlineCompletionContext(
triggerKind = InlineCompletionTriggerKind.Invoke

Check warning on line 729 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt#L727-L729

Added lines #L727 - L729 were not covered by tests
)
).apply {
textDocument = TextDocumentIdentifier(toUriString(editor.virtualFile))
position = Position(
editor.caretModel.primaryCaret.visualPosition.line,
editor.caretModel.primaryCaret.offset

Check warning on line 735 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt#L731-L735

Added lines #L731 - L735 were not covered by tests
)
}

Check warning on line 737 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt#L737

Added line #L737 was not covered by tests

private fun addPopupChildDisposables(popup: JBPopup) {
codeInsightSettingsFacade.disableCodeInsightUntil(popup)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,18 @@ import org.eclipse.lsp4j.jsonrpc.services.JsonRequest
import org.eclipse.lsp4j.services.LanguageServer
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionListWithReferences
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionWithReferencesParams
import java.util.concurrent.CompletableFuture

/**
* Remote interface exposed by the Amazon Q language server
*/
@Suppress("unused")
interface AmazonQLanguageServer : LanguageServer {
@JsonRequest("aws/textDocument/inlineCompletionWithReferences")
fun inlineCompletionWithReferences(params: InlineCompletionWithReferencesParams): CompletableFuture<InlineCompletionListWithReferences>

@JsonNotification("aws/didChangeDependencyPaths")
fun didChangeDependencyPaths(params: DidChangeDependencyPathsParams): CompletableFuture<Unit>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// 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.model.aws.textDocument

data class InlineCompletionContext(
var triggerKind: InlineCompletionTriggerKind,
var selectedCompletionInfo: SelectedCompletionInfo? = null,
)

Check warning on line 9 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionContext.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionContext.kt#L6-L9

Added lines #L6 - L9 were not covered by tests
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// 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.model.aws.textDocument

data class InlineCompletionItem(
var itemId: String,
var insertText: String,
var references: List<InlineCompletionReference>,

Check warning on line 9 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionItem.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionItem.kt#L6-L9

Added lines #L6 - L9 were not covered by tests
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// 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.model.aws.textDocument

data class InlineCompletionListWithReferences(
var items: List<InlineCompletionItem>,
var sessionId: String,

Check warning on line 8 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionListWithReferences.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionListWithReferences.kt#L6-L8

Added lines #L6 - L8 were not covered by tests
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// 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.model.aws.textDocument

data class InlineCompletionReference(
var referenceName: String,
var referenceUrl: String,
var licenseName: String,
var position: InlineCompletionReferencePosition,

Check warning on line 10 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionReference.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionReference.kt#L6-L10

Added lines #L6 - L10 were not covered by tests
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// 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.model.aws.textDocument

data class InlineCompletionReferencePosition(
var startCharacter: Int = 0,
var endCharacter: Int = 0,
)

Check warning on line 9 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionReferencePosition.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionReferencePosition.kt#L6-L9

Added lines #L6 - L9 were not covered by tests
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// 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.model.aws.textDocument

enum class InlineCompletionTriggerKind(val value: Int) {
Invoke(0),
Automatic(1),

Check warning on line 8 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionTriggerKind.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused symbol

Class "Automatic" is never used
}

Check warning on line 9 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionTriggerKind.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionTriggerKind.kt#L6-L9

Added lines #L6 - L9 were not covered by tests
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// 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.model.aws.textDocument

import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams

data class InlineCompletionWithReferencesParams(
var context: InlineCompletionContext,
) : TextDocumentPositionAndWorkDoneProgressParams()

Check warning on line 10 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionWithReferencesParams.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionWithReferencesParams.kt#L8-L10

Added lines #L8 - L10 were not covered by tests
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// 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.model.aws.textDocument

import org.eclipse.lsp4j.Range

data class SelectedCompletionInfo(
var text: String,
var range: Range,

Check warning on line 10 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/SelectedCompletionInfo.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/SelectedCompletionInfo.kt#L8-L10

Added lines #L8 - L10 were not covered by tests
)
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,27 @@
FileDocumentManagerListener.TOPIC,
this
)

// open files on startup
val fileEditorManager = FileEditorManager.getInstance(project)
fileEditorManager.openFiles.forEach { file ->
handleFileOpened(file)
}
}

Check warning on line 61 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#L57-L61

Added lines #L57 - L61 were not covered by tests

private fun handleFileOpened(file: VirtualFile) {
AmazonQLspService.executeIfRunning(project) { languageServer ->

Check warning on line 64 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#L64

Added line #L64 was not covered by tests
toUriString(file)?.let { uri ->
languageServer.textDocumentService.didOpen(
DidOpenTextDocumentParams().apply {
textDocument = TextDocumentItem().apply {
this.uri = uri
text = file.inputStream.readAllBytes().decodeToString()
}
}

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#L66-L72

Added lines #L66 - L72 were not covered by tests
)
}

Check warning on line 74 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#L74

Added line #L74 was not covered by tests
}
}

override fun beforeDocumentSaving(document: Document) {
Expand Down Expand Up @@ -99,18 +120,7 @@
source: FileEditorManager,
file: VirtualFile,
) {
AmazonQLspService.executeIfRunning(project) { languageServer ->
toUriString(file)?.let { uri ->
languageServer.textDocumentService.didOpen(
DidOpenTextDocumentParams().apply {
textDocument = TextDocumentItem().apply {
this.uri = uri
text = file.inputStream.readAllBytes().decodeToString()
}
}
)
}
}
handleFileOpened(file)

Check warning on line 123 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#L123

Added line #L123 was not covered by tests
}

override fun fileClosed(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.intellij.openapi.application.ApplicationManager
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.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.newvfs.events.VFileContentChangeEvent
Expand Down Expand Up @@ -43,6 +44,7 @@ import java.util.concurrent.CompletableFuture

class TextDocumentServiceHandlerTest {
private lateinit var project: Project
private lateinit var mockFileEditorManager: FileEditorManager
private lateinit var mockLanguageServer: AmazonQLanguageServer
private lateinit var mockTextDocumentService: TextDocumentService
private lateinit var sut: TextDocumentServiceHandler
Expand Down Expand Up @@ -90,6 +92,11 @@ class TextDocumentServiceHandlerTest {
every { messageBus.connect(any<Disposable>()) } returns mockConnection
every { mockConnection.subscribe(any(), any()) } just runs

// Mock FileEditorManager
mockFileEditorManager = mockk<FileEditorManager>()
every { mockFileEditorManager.openFiles } returns emptyArray()
every { project.getService(FileEditorManager::class.java) } returns mockFileEditorManager

sut = TextDocumentServiceHandler(project, mockk())
}

Expand Down Expand Up @@ -126,6 +133,25 @@ class TextDocumentServiceHandlerTest {
}
}

@Test
fun `didOpen runs on service init`() = runTest {
val uri = URI.create("file:///test/path/file.txt")
val content = "test content"
val file = createMockVirtualFile(uri, content)

every { mockFileEditorManager.openFiles } returns arrayOf(file)

sut = TextDocumentServiceHandler(project, mockk())

val paramsSlot = slot<DidOpenTextDocumentParams>()
verify { mockTextDocumentService.didOpen(capture(paramsSlot)) }

with(paramsSlot.captured.textDocument) {
assertEquals(normalizeFileUri(uri.toString()), this.uri)
assertEquals(content, text)
}
}

@Test
fun `didOpen runs on fileOpened`() = runTest {
// Create test file
Expand Down
Loading