diff --git a/src/extension/prompt/common/codeGuesser.ts b/src/extension/prompt/common/codeGuesser.ts index 2d4b46265..b08c6b767 100644 --- a/src/extension/prompt/common/codeGuesser.ts +++ b/src/extension/prompt/common/codeGuesser.ts @@ -19,6 +19,9 @@ const enum GuessedLineType { NaturalLanguage } +const commonCppDirectives = ['# include', '# define', '# ifdef', '# ifndef', '# endif', '# pragma', '# if', '# else', '# elif', '# undef', '# error', '# line', '# warning']; + + function guessLineType(line: string): GuessedLineType { if (line.length === 0) { return GuessedLineType.Unknown; @@ -37,6 +40,15 @@ function guessLineType(line: string): GuessedLineType { return GuessedLineType.Code; } + // If the line starts with '#'s followed by a space, it's possibly markdown header + // A popular exception is if the line contains C/C++ preprocessor directives + if (line.match(/^#+ .+$/)) { + // If line does not contain any # directives used in C, C++. + if (!commonCppDirectives.some(directive => line.trim().startsWith(directive))) { + return GuessedLineType.NaturalLanguage; + } + } + // Natural Language Hints { // if the first character is upper-case diff --git a/src/extension/prompt/node/test/codeGuesser.spec.ts b/src/extension/prompt/node/test/codeGuesser.spec.ts index 0dcae18ea..99feed668 100644 --- a/src/extension/prompt/node/test/codeGuesser.spec.ts +++ b/src/extension/prompt/node/test/codeGuesser.spec.ts @@ -79,22 +79,27 @@ suite('codeGuesser', () => { assert.strictEqual(looksLikeCode(xmlSnippet), true); }); - test.skip('looksLikeCode - detects YAML as code', () => { + test('looksLikeCode - detects YAML as code', () => { const yamlSnippet = 'key: value'; assert.strictEqual(looksLikeCode(yamlSnippet), true); }); - test.skip('looksLikeCode - detects Markdown as non-code', () => { + test('looksLikeCode - detects Markdown as non-code', () => { const markdownSnippet = '# This is a heading'; assert.strictEqual(looksLikeCode(markdownSnippet), false); }); + test('looksLikeCode - detects C++ preprocessor directive as code', () => { + const cppPreprocessorSnippet = '# include '; + assert.strictEqual(looksLikeCode(cppPreprocessorSnippet), true); + }); + test('looksLikeCode - detects plain text as non-code', () => { const plainTextSnippet = 'Just some plain text.'; assert.strictEqual(looksLikeCode(plainTextSnippet), false); }); - test.skip('looksLikeCode - detects shell script as code', () => { + test('looksLikeCode - detects shell script as code', () => { const shellSnippet = 'echo "Hello World"'; assert.strictEqual(looksLikeCode(shellSnippet), true); });