Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/extension/prompt/common/codeGuesser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down
11 changes: 8 additions & 3 deletions src/extension/prompt/node/test/codeGuesser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 <iostream>';
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);
});
Expand Down