Skip to content

Commit 7420808

Browse files
authored
feat(amazonq): switch to relative path for inline Completion API field (#5543)
1 parent cf3f30b commit 7420808

File tree

2 files changed

+46
-34
lines changed

2 files changed

+46
-34
lines changed

packages/amazonq/test/unit/codewhisperer/util/editorContext.test.ts

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@
22
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
65
import assert from 'assert'
76
import * as codewhispererClient from 'aws-core-vscode/codewhisperer'
87
import * as EditorContext from 'aws-core-vscode/codewhisperer'
9-
import { createMockTextEditor, createMockClientRequest, resetCodeWhispererGlobalVariables } from 'aws-core-vscode/test'
8+
import {
9+
createMockTextEditor,
10+
createMockClientRequest,
11+
resetCodeWhispererGlobalVariables,
12+
openATextEditorWithText,
13+
createTestWorkspaceFolder,
14+
closeAllEditors,
15+
} from 'aws-core-vscode/test'
1016
import { globals } from 'aws-core-vscode/shared'
1117
import { GenerateCompletionsRequest } from 'aws-core-vscode/codewhisperer'
1218

1319
describe('editorContext', function () {
1420
let telemetryEnabledDefault: boolean
21+
let tempFolder: string
1522

1623
beforeEach(async function () {
1724
await resetCodeWhispererGlobalVariables()
@@ -66,15 +73,19 @@ describe('editorContext', function () {
6673
assert.strictEqual(actual, expected)
6774
})
6875

69-
it('Should return expected filename for a long filename', function () {
76+
it('Should return expected filename for a long filename', async function () {
7077
const editor = createMockTextEditor('', 'a'.repeat(1500), 'python', 1, 17)
7178
const actual = EditorContext.getFileName(editor)
7279
const expected = 'a'.repeat(1024)
7380
assert.strictEqual(actual, expected)
7481
})
7582
})
7683

77-
describe('getfileNameForRequest', function () {
84+
describe('getFileRelativePath', function () {
85+
this.beforeEach(async function () {
86+
tempFolder = (await createTestWorkspaceFolder()).uri.fsPath
87+
})
88+
7889
it('Should return a new filename with correct extension given a .ipynb file', function () {
7990
const languageToExtension = new Map<string, string>([
8091
['python', 'py'],
@@ -86,11 +97,22 @@ describe('editorContext', function () {
8697

8798
languageToExtension.forEach((extension, language) => {
8899
const editor = createMockTextEditor('', 'test.ipynb', language, 1, 17)
89-
const actual = EditorContext.getFileNameForRequest(editor)
100+
const actual = EditorContext.getFileRelativePath(editor)
90101
const expected = 'test.' + extension
91102
assert.strictEqual(actual, expected)
92103
})
93104
})
105+
106+
it('Should return relative path', async function () {
107+
const editor = await openATextEditorWithText('tttt', 'test.py', tempFolder)
108+
const actual = EditorContext.getFileRelativePath(editor)
109+
const expected = 'test.py'
110+
assert.strictEqual(actual, expected)
111+
})
112+
113+
afterEach(async function () {
114+
await closeAllEditors()
115+
})
94116
})
95117

96118
describe('validateRequest', function () {

packages/core/src/codewhisperer/util/editorContext.ts

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,33 +38,15 @@ export function extractContextForCodeWhisperer(editor: vscode.TextEditor): codew
3838
document.positionAt(offset + CodeWhispererConstants.charactersLimit)
3939
)
4040
)
41-
if (checkLeftContextKeywordsForJsonAndYaml(caretLeftFileContext, editor.document.languageId)) {
42-
return {
43-
filename: getFileNameForRequest(editor),
44-
programmingLanguage: {
45-
languageName: 'plaintext',
46-
},
47-
leftFileContent: caretLeftFileContext,
48-
rightFileContent: caretRightFileContext,
49-
} as codewhispererClient.FileContext
50-
}
51-
52-
if (checkLeftContextKeywordsForJsonAndYaml(caretLeftFileContext, editor.document.languageId)) {
53-
return {
54-
filename: getFileNameForRequest(editor),
55-
programmingLanguage: {
56-
languageName: 'plaintext',
57-
},
58-
leftFileContent: caretLeftFileContext,
59-
rightFileContent: caretRightFileContext,
60-
} as codewhispererClient.FileContext
41+
let languageName = 'plaintext'
42+
if (!checkLeftContextKeywordsForJsonAndYaml(caretLeftFileContext, editor.document.languageId)) {
43+
languageName =
44+
runtimeLanguageContext.normalizeLanguage(editor.document.languageId) ?? editor.document.languageId
6145
}
62-
6346
return {
64-
filename: getFileNameForRequest(editor),
47+
filename: getFileRelativePath(editor),
6548
programmingLanguage: {
66-
languageName:
67-
runtimeLanguageContext.normalizeLanguage(editor.document.languageId) ?? editor.document.languageId,
49+
languageName: languageName,
6850
},
6951
leftFileContent: caretLeftFileContext,
7052
rightFileContent: caretRightFileContext,
@@ -76,19 +58,27 @@ export function getFileName(editor: vscode.TextEditor): string {
7658
return fileName.substring(0, CodeWhispererConstants.filenameCharsLimit)
7759
}
7860

79-
export function getFileNameForRequest(editor: vscode.TextEditor): string {
61+
export function getFileRelativePath(editor: vscode.TextEditor): string {
8062
const fileName = path.basename(editor.document.fileName)
81-
63+
let relativePath = ''
64+
const workspaceFolder = vscode.workspace.getWorkspaceFolder(editor.document.uri)
65+
if (!workspaceFolder) {
66+
relativePath = fileName
67+
} else {
68+
const workspacePath = workspaceFolder.uri.fsPath
69+
const filePath = editor.document.uri.fsPath
70+
relativePath = path.relative(workspacePath, filePath)
71+
}
8272
// For notebook files, we want to use the programming language for each cell for the code suggestions, so change
8373
// the filename sent in the request to reflect that language
84-
if (fileName.endsWith('.ipynb')) {
74+
if (relativePath.endsWith('.ipynb')) {
8575
const fileExtension = runtimeLanguageContext.getLanguageExtensionForNotebook(editor.document.languageId)
8676
if (fileExtension !== undefined) {
87-
const filenameWithNewExtension = fileName.substring(0, fileName.length - 5) + fileExtension
77+
const filenameWithNewExtension = relativePath.substring(0, relativePath.length - 5) + fileExtension
8878
return filenameWithNewExtension.substring(0, CodeWhispererConstants.filenameCharsLimit)
8979
}
9080
}
91-
return fileName.substring(0, CodeWhispererConstants.filenameCharsLimit)
81+
return relativePath.substring(0, CodeWhispererConstants.filenameCharsLimit)
9282
}
9383

9484
export async function buildListRecommendationRequest(

0 commit comments

Comments
 (0)