Skip to content

Commit 540e742

Browse files
committed
feat(amazon lsp): add copyToClipboard implementation
1 parent 38e95a8 commit 540e742

File tree

2 files changed

+50
-6
lines changed

2 files changed

+50
-6
lines changed

packages/amazonq/src/lsp/chat/messages.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ import {
2323
insertToCursorPositionNotificationType,
2424
} from '@aws/language-server-runtimes/protocol'
2525
import { v4 as uuidv4 } from 'uuid'
26-
import { window } from 'vscode'
26+
import * as vscode from 'vscode'
2727
import { Disposable, LanguageClient, Position, State, TextDocumentIdentifier } from 'vscode-languageclient'
2828
import * as jose from 'jose'
2929
import { AmazonQChatViewProvider } from './webviewProvider'
3030
import { AuthUtil } from 'aws-core-vscode/codewhisperer'
31-
import { AmazonQPromptSettings } from 'aws-core-vscode/shared'
31+
import { AmazonQPromptSettings, messages } from 'aws-core-vscode/shared'
3232

3333
export function registerLanguageServerEventListener(languageClient: LanguageClient, provider: AmazonQChatViewProvider) {
3434
languageClient.onDidChangeState(({ oldState, newState }) => {
@@ -62,11 +62,15 @@ export function registerMessageListeners(
6262

6363
switch (message.command) {
6464
case COPY_TO_CLIPBOARD:
65-
// TODO see what we need to hook this up
6665
languageClient.info('[VSCode Client] Copy to clipboard event received')
66+
try {
67+
await messages.copyToClipboard(message.params.code)
68+
} catch (e) {
69+
languageClient.error(`[VSCode Client] Failed to copy to clipboard: ${(e as Error).message}`)
70+
}
6771
break
6872
case INSERT_TO_CURSOR_POSITION: {
69-
const editor = window.activeTextEditor
73+
const editor = vscode.window.activeTextEditor
7074
let textDocument: TextDocumentIdentifier | undefined = undefined
7175
let cursorPosition: Position | undefined = undefined
7276
if (editor) {
@@ -119,8 +123,8 @@ export function registerMessageListeners(
119123
)
120124

121125
const editor =
122-
window.activeTextEditor ||
123-
window.visibleTextEditors.find((editor) => editor.document.languageId !== 'Log')
126+
vscode.window.activeTextEditor ||
127+
vscode.window.visibleTextEditors.find((editor) => editor.document.languageId !== 'Log')
124128
if (editor) {
125129
message.params.cursorPosition = [editor.selection.active]
126130
message.params.textDocument = { uri: editor.document.uri.toString() }

packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
import * as sinon from 'sinon'
7+
import * as vscode from 'vscode'
78
import { LanguageClient } from 'vscode-languageclient'
89
import { AuthUtil } from 'aws-core-vscode/codewhisperer'
910
import { registerMessageListeners } from '../../../../../src/lsp/chat/messages'
@@ -126,4 +127,43 @@ describe('registerMessageListeners', () => {
126127
})
127128
})
128129
})
130+
131+
describe('COPY_TO_CLIPBOARD', () => {
132+
const testCode = 'test'
133+
const copyMessage = {
134+
command: 'copyToClipboard',
135+
params: {
136+
code: testCode,
137+
},
138+
}
139+
let writeTextStub: sinon.SinonStub
140+
141+
beforeEach(() => {
142+
writeTextStub = sinon.stub()
143+
sandbox.stub(vscode.env, 'clipboard').value({
144+
writeText: writeTextStub,
145+
})
146+
})
147+
148+
it('successfully copies code to clipboard', async () => {
149+
writeTextStub.resolves()
150+
151+
await messageHandler(copyMessage)
152+
153+
sinon.assert.calledWith(writeTextStub, testCode)
154+
})
155+
156+
it('handles clipboard copy failure', async () => {
157+
const errorMessage = 'Failed to copy'
158+
writeTextStub.rejects(new Error(errorMessage))
159+
160+
await messageHandler(copyMessage)
161+
162+
sinon.assert.calledOnce(errorStub)
163+
sinon.assert.calledWith(
164+
errorStub,
165+
sinon.match(`[VSCode Client] Failed to copy to clipboard: ${errorMessage}`)
166+
)
167+
})
168+
})
129169
})

0 commit comments

Comments
 (0)