From ee69947eb57c6d157adb14977d89272de977735c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Thu, 9 May 2024 22:40:17 +0200 Subject: [PATCH 1/9] Add missing extension --- agent/src/vscode-shim.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/agent/src/vscode-shim.ts b/agent/src/vscode-shim.ts index ff7464ac5f..65e8ccf750 100644 --- a/agent/src/vscode-shim.ts +++ b/agent/src/vscode-shim.ts @@ -4,7 +4,7 @@ import path from 'node:path' import * as uuid from 'uuid' import type * as vscode from 'vscode' -import { logDebug, logError, setClientNameVersion } from '@sourcegraph/cody-shared' +import { extensionForLanguage, logDebug, logError, setClientNameVersion } from '@sourcegraph/cody-shared' // // This file must not import any module that transitively imports from 'vscode'. @@ -465,7 +465,9 @@ function toUri( typeof uriOrString === 'object' && ((uriOrString as any)?.language || (uriOrString as any)?.content) ) { - return Uri.from({ scheme: 'untitled', path: `${uuid.v4()}` }) + const language = (uriOrString as any)?.language ?? '' + const extension = extensionForLanguage(language) ?? language + return Uri.from({ scheme: 'untitled', path: `${uuid.v4()}.${extension}` }) } return } From 583ee7e29750b141b01d0b528c80b95c488372e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Fri, 10 May 2024 12:03:38 +0200 Subject: [PATCH 2/9] Do not send uuid-named temp files to the client --- agent/src/vscode-shim.ts | 24 ++++++++++++++++-------- vscode/src/jsonrpc/agent-protocol.ts | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/agent/src/vscode-shim.ts b/agent/src/vscode-shim.ts index 65e8ccf750..9b9140288e 100644 --- a/agent/src/vscode-shim.ts +++ b/agent/src/vscode-shim.ts @@ -292,10 +292,12 @@ const _workspace: typeof vscode.workspace = { throw new Error('workspaceDocuments is uninitialized') } - const uri = toUri(uriOrString) - if (uri) { - if (uri.scheme === 'untitled') await openUntitledDocument(uri) - return workspaceDocuments.openTextDocument(uri) + const result = toUri(uriOrString) + if (result) { + if (result.uri.scheme === 'untitled' && result.shouldOpenInClient) { + await openUntitledDocument(result.uri) + } + return workspaceDocuments.openTextDocument(result.uri) } return Promise.reject( new Error(`workspace.openTextDocument:unsupported argument ${JSON.stringify(uriOrString)}`) @@ -454,12 +456,12 @@ const defaultTreeView: vscode.TreeView = { function toUri( uriOrString: string | vscode.Uri | { language?: string; content?: string } | undefined -): Uri | undefined { +): { uri: Uri; shouldOpenInClient: boolean } | undefined { if (typeof uriOrString === 'string') { - return Uri.file(uriOrString) + return { uri: Uri.file(uriOrString), shouldOpenInClient: true } } if (uriOrString instanceof Uri) { - return uriOrString + return { uri: uriOrString, shouldOpenInClient: true } } if ( typeof uriOrString === 'object' && @@ -467,7 +469,13 @@ function toUri( ) { const language = (uriOrString as any)?.language ?? '' const extension = extensionForLanguage(language) ?? language - return Uri.from({ scheme: 'untitled', path: `${uuid.v4()}.${extension}` }) + return { + uri: Uri.from({ + scheme: 'untitled', + path: `${uuid.v4()}.${extension}`, + }), + shouldOpenInClient: false, + } } return } diff --git a/vscode/src/jsonrpc/agent-protocol.ts b/vscode/src/jsonrpc/agent-protocol.ts index 63a30f09d7..6c3aad06b1 100644 --- a/vscode/src/jsonrpc/agent-protocol.ts +++ b/vscode/src/jsonrpc/agent-protocol.ts @@ -422,7 +422,7 @@ interface ClientCapabilities { progressBars?: 'none' | 'enabled' edit?: 'none' | 'enabled' editWorkspace?: 'none' | 'enabled' - untitledDocuments?: 'none' | 'enabled' + untitledDocuments?: 'none' | 'enabled' | 'partial' showDocument?: 'none' | 'enabled' codeLenses?: 'none' | 'enabled' showWindowMessage?: 'notification' | 'request' From bbe59c9c4630d19cb0fc7f0772ce45d089fa3e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Fri, 10 May 2024 15:41:10 +0200 Subject: [PATCH 3/9] fixes --- vscode/src/jsonrpc/agent-protocol.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vscode/src/jsonrpc/agent-protocol.ts b/vscode/src/jsonrpc/agent-protocol.ts index 6c3aad06b1..63a30f09d7 100644 --- a/vscode/src/jsonrpc/agent-protocol.ts +++ b/vscode/src/jsonrpc/agent-protocol.ts @@ -422,7 +422,7 @@ interface ClientCapabilities { progressBars?: 'none' | 'enabled' edit?: 'none' | 'enabled' editWorkspace?: 'none' | 'enabled' - untitledDocuments?: 'none' | 'enabled' | 'partial' + untitledDocuments?: 'none' | 'enabled' showDocument?: 'none' | 'enabled' codeLenses?: 'none' | 'enabled' showWindowMessage?: 'notification' | 'request' From 6d5d9319560ae9ad74b7f7831e7a07d04882c855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Mon, 13 May 2024 17:19:05 +0200 Subject: [PATCH 4/9] Remove this.insertionPromise from handleFileCreationResponse --- vscode/src/edit/provider.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/vscode/src/edit/provider.ts b/vscode/src/edit/provider.ts index daef3274cc..83c528a39a 100644 --- a/vscode/src/edit/provider.ts +++ b/vscode/src/edit/provider.ts @@ -329,13 +329,10 @@ export class EditProvider { if (!fileIsFound) { newFileUri = newFileUri.with({ scheme: 'untitled' }) } - this.insertionPromise = this.config.controller.didReceiveNewFileRequest(task.id, newFileUri) try { - await this.insertionPromise + await this.config.controller.didReceiveNewFileRequest(task.id, newFileUri) } catch (error) { this.handleError(new Error('Cody failed to generate unit tests', { cause: error })) - } finally { - this.insertionPromise = null } } } From f02a6a53d88162f40d746322c2cd2fc0f448f180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Mon, 13 May 2024 17:30:20 +0200 Subject: [PATCH 5/9] Add comment on `toUri` --- agent/src/vscode-shim.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/agent/src/vscode-shim.ts b/agent/src/vscode-shim.ts index 9b9140288e..52d676d885 100644 --- a/agent/src/vscode-shim.ts +++ b/agent/src/vscode-shim.ts @@ -454,6 +454,10 @@ const defaultTreeView: vscode.TreeView = { title: undefined, } +/** + * @returns An object with a URI and a boolean indicating whether the URI should be opened in the client. + * This object with UUID path is used only when we want to create in-memory temp files, and those we do not want to send to the clients. + */ function toUri( uriOrString: string | vscode.Uri | { language?: string; content?: string } | undefined ): { uri: Uri; shouldOpenInClient: boolean } | undefined { From b6a833256c4c6d16353e88d45272e4f77806eba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Mon, 13 May 2024 17:31:00 +0200 Subject: [PATCH 6/9] Update tests --- agent/src/index.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/agent/src/index.test.ts b/agent/src/index.test.ts index 8f0e3057d8..b971735562 100644 --- a/agent/src/index.test.ts +++ b/agent/src/index.test.ts @@ -950,8 +950,12 @@ describe('Agent', () => { const untitledDocuments = client.workspace .allUris() .filter(uri => vscode.Uri.parse(uri).scheme === 'untitled') + const fileDocuments = client.workspace + .allUris() + .filter(uri => vscode.Uri.parse(uri).scheme === 'file') expect(untitledDocuments).toHaveLength(2) - const [untitledDocument] = untitledDocuments + expect(fileDocuments).toHaveLength(1) + const [untitledDocument] = untitledDocuments.slice(1) const testDocument = client.workspace.getDocument(vscode.Uri.parse(untitledDocument)) expect(trimEndOfLine(testDocument?.getText())).toMatchInlineSnapshot( ` From e32176cdbe4ee30ebbf62f6377634b3dcaaaeec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Tue, 14 May 2024 15:25:28 +0200 Subject: [PATCH 7/9] Fix tests --- agent/src/TestClient.ts | 2 ++ agent/src/index.test.ts | 8 +------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/agent/src/TestClient.ts b/agent/src/TestClient.ts index 283c8e4105..73cba4d4aa 100644 --- a/agent/src/TestClient.ts +++ b/agent/src/TestClient.ts @@ -178,6 +178,7 @@ export class TestClient extends MessageHandler { public readonly name: string public workspace = new AgentWorkspaceDocuments() public workspaceEditParams: WorkspaceEditParams[] = [] + public textDocumentEditParams: TextDocumentEditParams[] = [] get serverEndpoint(): string { return this.params.credentials.serverEndpoint @@ -330,6 +331,7 @@ export class TestClient extends MessageHandler { return Promise.resolve(true) }) this.registerRequest('textDocument/edit', params => { + this.textDocumentEditParams.push(params) return Promise.resolve(this.editDocument(params).success) }) this.registerRequest('textDocument/show', () => { diff --git a/agent/src/index.test.ts b/agent/src/index.test.ts index b971735562..98518697cb 100644 --- a/agent/src/index.test.ts +++ b/agent/src/index.test.ts @@ -950,11 +950,7 @@ describe('Agent', () => { const untitledDocuments = client.workspace .allUris() .filter(uri => vscode.Uri.parse(uri).scheme === 'untitled') - const fileDocuments = client.workspace - .allUris() - .filter(uri => vscode.Uri.parse(uri).scheme === 'file') expect(untitledDocuments).toHaveLength(2) - expect(fileDocuments).toHaveLength(1) const [untitledDocument] = untitledDocuments.slice(1) const testDocument = client.workspace.getDocument(vscode.Uri.parse(untitledDocument)) expect(trimEndOfLine(testDocument?.getText())).toMatchInlineSnapshot( @@ -988,9 +984,7 @@ describe('Agent', () => { explainPollyError ) - // Just to make sure the edit happened via `workspace/edit` instead - // of `textDocument/edit`. - expect(client.workspaceEditParams).toHaveLength(1) + expect(client.textDocumentEditParams).toHaveLength(1) }, 30_000) describe('Edit code', () => { From fb599110a4137659058024b9314661b5d2a8e45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Wed, 15 May 2024 10:06:07 +0200 Subject: [PATCH 8/9] Fix tests --- agent/src/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/src/index.test.ts b/agent/src/index.test.ts index 98518697cb..030f106bce 100644 --- a/agent/src/index.test.ts +++ b/agent/src/index.test.ts @@ -951,7 +951,7 @@ describe('Agent', () => { .allUris() .filter(uri => vscode.Uri.parse(uri).scheme === 'untitled') expect(untitledDocuments).toHaveLength(2) - const [untitledDocument] = untitledDocuments.slice(1) + const untitledDocument = untitledDocuments.find(d => d.endsWith('trickyLogic.test.ts'))!! const testDocument = client.workspace.getDocument(vscode.Uri.parse(untitledDocument)) expect(trimEndOfLine(testDocument?.getText())).toMatchInlineSnapshot( ` From 6979182723e862e0fb1ecee74559615343e460da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Kondratek?= Date: Wed, 15 May 2024 13:45:26 +0200 Subject: [PATCH 9/9] Fix tests --- agent/src/index.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/agent/src/index.test.ts b/agent/src/index.test.ts index 030f106bce..15493c88f5 100644 --- a/agent/src/index.test.ts +++ b/agent/src/index.test.ts @@ -951,8 +951,9 @@ describe('Agent', () => { .allUris() .filter(uri => vscode.Uri.parse(uri).scheme === 'untitled') expect(untitledDocuments).toHaveLength(2) - const untitledDocument = untitledDocuments.find(d => d.endsWith('trickyLogic.test.ts'))!! - const testDocument = client.workspace.getDocument(vscode.Uri.parse(untitledDocument)) + const untitledDocument = untitledDocuments.find(d => d.endsWith('trickyLogic.test.ts')) + expect(untitledDocument).toBeDefined() + const testDocument = client.workspace.getDocument(vscode.Uri.parse(untitledDocument ?? '')) expect(trimEndOfLine(testDocument?.getText())).toMatchInlineSnapshot( ` "import { expect } from 'vitest'