diff --git a/packages/amazonq/.changes/next-release/Feature-88ac445a-7a5a-4127-97f7-eaccd41629e6.json b/packages/amazonq/.changes/next-release/Feature-88ac445a-7a5a-4127-97f7-eaccd41629e6.json new file mode 100644 index 00000000000..029fa9de4ea --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-88ac445a-7a5a-4127-97f7-eaccd41629e6.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Inline completion for more json files, and all yaml files" +} diff --git a/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts b/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts index eaf1ae332ba..5694b33365d 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts @@ -4,7 +4,11 @@ */ import assert from 'assert' -import { checkLeftContextKeywordsForJsonAndYaml, getPrefixSuffixOverlap } from 'aws-core-vscode/codewhisperer' +import { + JsonConfigFileNamingConvention, + checkLeftContextKeywordsForJson, + getPrefixSuffixOverlap, +} from 'aws-core-vscode/codewhisperer' describe('commonUtil', function () { describe('getPrefixSuffixOverlap', function () { @@ -31,29 +35,47 @@ describe('commonUtil', function () { }) }) - describe('checkLeftContextKeywordsForJsonAndYaml', function () { + describe('checkLeftContextKeywordsForJson', function () { it('Should return true for valid left context keywords', async function () { assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml('Create an S3 Bucket named CodeWhisperer', 'json'), - true - ) - assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml('Create an S3 Bucket named CodeWhisperer', 'yaml'), + checkLeftContextKeywordsForJson('foo.json', 'Create an S3 Bucket named CodeWhisperer', 'json'), true ) }) it('Should return false for invalid left context keywords', async function () { assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml('Create an S3 Bucket named CodeWhisperer in cfn', 'yaml'), - false - ) - assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml( + checkLeftContextKeywordsForJson( + 'foo.json', 'Create an S3 Bucket named CodeWhisperer in Cloudformation', 'json' ), false ) }) + + for (const jsonConfigFile of JsonConfigFileNamingConvention) { + it(`should evalute by filename ${jsonConfigFile}`, function () { + assert.strictEqual(checkLeftContextKeywordsForJson(jsonConfigFile, 'foo', 'json'), false) + + assert.strictEqual(checkLeftContextKeywordsForJson(jsonConfigFile.toUpperCase(), 'bar', 'json'), false) + + assert.strictEqual(checkLeftContextKeywordsForJson(jsonConfigFile.toUpperCase(), 'baz', 'json'), false) + }) + + const upperCaseFilename = jsonConfigFile.toUpperCase() + it(`should evalute by filename and case insensitive ${upperCaseFilename}`, function () { + assert.strictEqual(checkLeftContextKeywordsForJson(upperCaseFilename, 'foo', 'json'), false) + + assert.strictEqual( + checkLeftContextKeywordsForJson(upperCaseFilename.toUpperCase(), 'bar', 'json'), + false + ) + + assert.strictEqual( + checkLeftContextKeywordsForJson(upperCaseFilename.toUpperCase(), 'baz', 'json'), + false + ) + }) + } }) }) diff --git a/packages/core/src/codewhisperer/models/constants.ts b/packages/core/src/codewhisperer/models/constants.ts index 41347803bd1..135df983e08 100644 --- a/packages/core/src/codewhisperer/models/constants.ts +++ b/packages/core/src/codewhisperer/models/constants.ts @@ -22,6 +22,20 @@ export const AWSTemplateKeyWords = ['AWSTemplateFormatVersion', 'Resources', 'AW export const AWSTemplateCaseInsensitiveKeyWords = ['cloudformation', 'cfn', 'template', 'description'] +export const JsonConfigFileNamingConvention = new Set([ + 'app.json', + 'appsettings.json', + 'bower.json', + 'composer.json', + 'db.json', + 'manifest.json', + 'package.json', + 'schema.json', + 'settings.json', + 'tsconfig.json', + 'vcpkg.json', +]) + export const normalTextChangeRegex = /[A-Za-z0-9]/g export const autoSuggestionConfig = { diff --git a/packages/core/src/codewhisperer/util/commonUtil.ts b/packages/core/src/codewhisperer/util/commonUtil.ts index 05fe21458a7..201a5f1c595 100644 --- a/packages/core/src/codewhisperer/util/commonUtil.ts +++ b/packages/core/src/codewhisperer/util/commonUtil.ts @@ -7,7 +7,11 @@ import * as vscode from 'vscode' import * as semver from 'semver' import { isCloud9 } from '../../shared/extensionUtilities' import { getInlineSuggestEnabled } from '../../shared/utilities/editorUtilities' -import { AWSTemplateCaseInsensitiveKeyWords, AWSTemplateKeyWords } from '../models/constants' +import { + AWSTemplateCaseInsensitiveKeyWords, + AWSTemplateKeyWords, + JsonConfigFileNamingConvention, +} from '../models/constants' export function getLocalDatetime() { const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone @@ -61,11 +65,12 @@ export function getPrefixSuffixOverlap(firstString: string, secondString: string return secondString.slice(0, i) } -export function checkLeftContextKeywordsForJsonAndYaml(leftFileContent: string, language: string): boolean { +export function checkLeftContextKeywordsForJson(fileName: string, leftFileContent: string, language: string): boolean { if ( - (language === 'json' || language === 'yaml') && + language === 'json' && !AWSTemplateKeyWords.some((substring) => leftFileContent.includes(substring)) && - !AWSTemplateCaseInsensitiveKeyWords.some((substring) => leftFileContent.toLowerCase().includes(substring)) + !AWSTemplateCaseInsensitiveKeyWords.some((substring) => leftFileContent.toLowerCase().includes(substring)) && + !JsonConfigFileNamingConvention.has(fileName.toLowerCase()) ) { return true } diff --git a/packages/core/src/codewhisperer/util/editorContext.ts b/packages/core/src/codewhisperer/util/editorContext.ts index e81565282f9..72b5d2874eb 100644 --- a/packages/core/src/codewhisperer/util/editorContext.ts +++ b/packages/core/src/codewhisperer/util/editorContext.ts @@ -14,7 +14,7 @@ import { fetchSupplementalContext } from './supplementalContext/supplementalCont import { supplementalContextTimeoutInMs } from '../models/constants' import { getSelectedCustomization } from './customizationUtil' import { selectFrom } from '../../shared/utilities/tsUtils' -import { checkLeftContextKeywordsForJsonAndYaml } from './commonUtil' +import { checkLeftContextKeywordsForJson } from './commonUtil' import { CodeWhispererSupplementalContext } from '../models/model' import { getOptOutPreference } from '../../shared/telemetry/util' @@ -39,7 +39,7 @@ export function extractContextForCodeWhisperer(editor: vscode.TextEditor): codew ) ) let languageName = 'plaintext' - if (!checkLeftContextKeywordsForJsonAndYaml(caretLeftFileContext, editor.document.languageId)) { + if (!checkLeftContextKeywordsForJson(document.fileName, caretLeftFileContext, editor.document.languageId)) { languageName = runtimeLanguageContext.normalizeLanguage(editor.document.languageId) ?? editor.document.languageId }