Skip to content

Commit 1defb4e

Browse files
authored
feat(codewhisperer): generate code based on language of notebook cell #3346
1 parent 05c3577 commit 1defb4e

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

src/codewhisperer/util/editorContext.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export function extractContextForCodeWhisperer(editor: vscode.TextEditor): codew
3535
)
3636

3737
return {
38-
filename: getFileName(editor),
38+
filename: getFileNameForRequest(editor),
3939
programmingLanguage: {
4040
languageName:
4141
runtimeLanguageContext.mapVscLanguageToCodeWhispererLanguage(editor.document.languageId) ??
@@ -51,6 +51,21 @@ export function getFileName(editor: vscode.TextEditor): string {
5151
return fileName.substring(0, CodeWhispererConstants.filenameCharsLimit)
5252
}
5353

54+
export function getFileNameForRequest(editor: vscode.TextEditor): string {
55+
const fileName = path.basename(editor.document.fileName)
56+
57+
// For notebook files, we want to use the programming language for each cell for the code suggestions, so change
58+
// the filename sent in the request to reflect that language
59+
if (fileName.endsWith('.ipynb')) {
60+
const fileExtension = runtimeLanguageContext.getLanguageExtensionForNotebook(editor.document.languageId)
61+
if (fileExtension !== undefined) {
62+
const filenameWithNewExtension = fileName.substring(0, fileName.length - 5) + fileExtension
63+
return filenameWithNewExtension.substring(0, CodeWhispererConstants.filenameCharsLimit)
64+
}
65+
}
66+
return fileName.substring(0, CodeWhispererConstants.filenameCharsLimit)
67+
}
68+
5469
export function buildListRecommendationRequest(
5570
editor: vscode.TextEditor,
5671
nextToken: string,

src/codewhisperer/util/runtimeLanguageContext.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ export class RuntimeLanguageContext {
1616
*/
1717
private supportedLanguageMap: ConstantMap<CodeWhispererConstants.SupportedLanguage, CodewhispererLanguage>
1818

19+
/**
20+
* A map storing CodeWhisperer supported programming language with key: vscLanguageId and value: language extension
21+
* Key: vscLanguageId
22+
* Value: language extension
23+
*/
24+
private supportedLanguageExtensionMap: ConstantMap<CodeWhispererConstants.SupportedLanguage, string>
25+
1926
// A set contains vscode languageId and CodeWhispererLanguage
2027
private supportedLanguageSet = new Set<string>()
2128

@@ -39,6 +46,25 @@ export class RuntimeLanguageContext {
3946
shellscript: 'shell',
4047
sql: 'sql',
4148
})
49+
this.supportedLanguageExtensionMap = createConstantMap<CodeWhispererConstants.SupportedLanguage, string>({
50+
java: 'java',
51+
python: 'py',
52+
javascriptreact: 'jsx',
53+
javascript: 'js',
54+
typescript: 'ts',
55+
typescriptreact: 'tsx',
56+
csharp: 'cs',
57+
c: 'c',
58+
cpp: 'cpp',
59+
go: 'go',
60+
kotlin: 'kt',
61+
php: 'php',
62+
ruby: 'rb',
63+
rust: 'rs',
64+
scala: 'scala',
65+
shellscript: 'sh',
66+
sql: 'sql',
67+
})
4268

4369
const values = Array.from(this.supportedLanguageMap.values())
4470
const keys = Array.from(this.supportedLanguageMap.keys())
@@ -55,6 +81,15 @@ export class RuntimeLanguageContext {
5581
return this.supportedLanguageMap.get(vscLanguageId) ?? undefined
5682
}
5783

84+
/**
85+
* This is for notebook files map to a new filename with the corresponding language extension
86+
* @param vscLanguageId : official vscode languageId
87+
* @returns corresponding language extension if any, otherwise undefined
88+
*/
89+
public getLanguageExtensionForNotebook(vscLanguageId?: string): string | undefined {
90+
return this.supportedLanguageExtensionMap.get(vscLanguageId) ?? undefined
91+
}
92+
5893
/**
5994
* @param vscLanguageId : official vscode languageId
6095
* @returns An object with a field language: CodewhispererLanguage, if no corresponding CodewhispererLanguage ID, plaintext is returned

src/test/codewhisperer/util/editorContext.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,25 @@ describe('editorContext', function () {
6464
})
6565
})
6666

67+
describe('getfileNameForRequest', function () {
68+
it('Should return a new filename with correct extension given a .ipynb file', function () {
69+
const languageToExtension = new Map<string, string>([
70+
['python', 'py'],
71+
['rust', 'rs'],
72+
['javascript', 'js'],
73+
['typescript', 'ts'],
74+
['c', 'c'],
75+
])
76+
77+
languageToExtension.forEach((extension, language) => {
78+
const editor = createMockTextEditor('', 'test.ipynb', language, 1, 17)
79+
const actual = EditorContext.getFileNameForRequest(editor)
80+
const expected = 'test.' + extension
81+
assert.strictEqual(actual, expected)
82+
})
83+
})
84+
})
85+
6786
describe('validateRequest', function () {
6887
it('Should return false if request filename.length is invalid', function () {
6988
const req = createMockClientRequest()

0 commit comments

Comments
 (0)