Skip to content
Closed
Show file tree
Hide file tree
Changes from 9 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

Check warning on line 32 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

Unused import directive

Unused import directive
import org.eclipse.lsp4j.TextDocumentIdentifier

Check warning on line 33 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

Unused import directive

Unused import directive
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,9 @@
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.model.aws.textDocument.InlineCompletionContext

Check warning on line 58 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

Unused import directive

Unused import directive
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionTriggerKind

Check warning on line 59 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

Unused import directive

Unused import directive
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionWithReferencesParams

Check warning on line 60 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

Unused import directive

Unused import directive
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
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
)
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: Array<InlineCompletionReference>,

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

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Array property in data class

Property with 'Array' type in a 'data' class: it is recommended to override 'equals()' and 'hashCode()'
)
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
)
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
)
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 InlineCompletionReferencePosition(
var startCharacter: Int = 0,
var endCharacter: Int = 0
)

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

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
}

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()
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// 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;

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

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Redundant semicolon

Redundant semicolon

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


Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,14 @@

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

import com.intellij.codeInsight.lookup.Lookup
import com.intellij.codeInsight.lookup.LookupEvent
import com.intellij.codeInsight.lookup.LookupListener
import com.intellij.codeInsight.lookup.LookupManagerListener
import com.intellij.codeInsight.lookup.impl.LookupImpl
import com.intellij.openapi.Disposable
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.fileEditor.FileDocumentManagerListener
import com.intellij.openapi.fileEditor.FileEditorManager
Expand All @@ -19,11 +25,15 @@
import org.eclipse.lsp4j.DidCloseTextDocumentParams
import org.eclipse.lsp4j.DidOpenTextDocumentParams
import org.eclipse.lsp4j.DidSaveTextDocumentParams
import org.eclipse.lsp4j.Position
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.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.utils.pluginAwareExecuteOnPooledThread

Expand All @@ -32,7 +42,8 @@
serverInstance: Disposable,
) : FileDocumentManagerListener,
FileEditorManagerListener,
BulkFileListener {
BulkFileListener,
LookupManagerListener {

init {
// didOpen & didClose events
Expand All @@ -52,6 +63,58 @@
FileDocumentManagerListener.TOPIC,
this
)

// aws/textDocument/inlineCompletionWithReferences events
project.messageBus.connect(serverInstance).subscribe(
LookupManagerListener.TOPIC,
this
)
}

override fun activeLookupChanged(oldLookup: Lookup?, newLookup: Lookup?) {
if (oldLookup != null || newLookup == null) return

newLookup.addLookupListener(object : LookupListener {
override fun itemSelected(event: LookupEvent) {
val editor = event.lookup.editor
if (!(event.lookup as LookupImpl).isShown) {
cleanup()
return
}

handleInlineCompletion(editor)
cleanup()
}

override fun lookupCanceled(event: LookupEvent) {
cleanup()
}

private fun cleanup() {
newLookup.removeLookupListener(this)
}
})
}

private fun handleInlineCompletion(editor: Editor) {
AmazonQLspService.executeIfRunning(project) { server ->
val params = buildInlineCompletionParams(editor)
server.inlineCompletionWithReferences(params)
}
}

private fun buildInlineCompletionParams(editor: Editor): InlineCompletionWithReferencesParams {
return InlineCompletionWithReferencesParams(
context = InlineCompletionContext(
triggerKind = InlineCompletionTriggerKind.Invoke
)
).apply {
textDocument = TextDocumentIdentifier(toUriString(editor.getVirtualFile()))

Check notice on line 112 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

Accessor call that can be replaced with property access syntax

Use of getter method instead of property access syntax
position = Position(
editor.caretModel.primaryCaret.visualPosition.line,
editor.caretModel.primaryCaret.offset
)
}
}

override fun beforeDocumentSaving(document: Document) {
Expand Down
Loading