diff --git a/Extension/src/LanguageServer/languageConfig.ts b/Extension/src/LanguageServer/languageConfig.ts index c9112ef17..47acbcf6a 100644 --- a/Extension/src/LanguageServer/languageConfig.ts +++ b/Extension/src/LanguageServer/languageConfig.ts @@ -55,7 +55,8 @@ function getMLSplitAfterPattern(): string { function getMLPreviousLinePattern(insert: string): string | undefined { if (insert.startsWith("/*")) { - return `(?=^(\\s*(\\/\\*\\*|\\*)).*)(?=(?!(\\s*\\*\\/)))`; + const match: string = escape(insert); + return `(?=^(\\s*(${match}|\\*)).*)(?=(?!(\\s*\\*\\/)))`; } return undefined; } @@ -238,8 +239,9 @@ export function getLanguageConfig(languageId: string): vscode.LanguageConfigurat } export function getLanguageConfigFromPatterns(languageId: string, patterns?: (string | CommentPattern)[]): vscode.LanguageConfiguration { - const beginPatterns: string[] = []; // avoid duplicate rules - const continuePatterns: string[] = []; // avoid duplicate rules + const beginPatterns: string[] = []; // avoid duplicate begin rules + const continuePatterns: string[] = []; // avoid duplicate continue rules + const endPatterns: string[] = []; // avoid duplicate end rules let duplicates: boolean = false; let beginRules: vscode.OnEnterRule[] = []; let continueRules: vscode.OnEnterRule[] = []; @@ -258,14 +260,17 @@ export function getLanguageConfigFromPatterns(languageId: string, patterns?: (st } else { duplicates = true; } - if (continuePatterns.indexOf(c.continue) < 0) { + if (continuePatterns.indexOf(`${c.begin}\0${c.continue}`) < 0) { if (r.continue && r.continue.length > 0) { continueRules = continueRules.concat(r.continue); } + continuePatterns.push(`${c.begin}\0${c.continue}`); + } + if (endPatterns.indexOf(c.continue) < 0) { if (r.end && r.end.length > 0) { endRules = endRules.concat(r.end); } - continuePatterns.push(c.continue); + endPatterns.push(c.continue); } }); if (duplicates) { diff --git a/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts index aba365a28..dff580139 100644 --- a/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts +++ b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts @@ -45,6 +45,27 @@ suite("multiline comment setting tests", function(): void { action: { indentAction: vscode.IndentAction.None, removeText: 1 } } ]; + const multipleMLRules: vscode.OnEnterRule[] = [ + defaultMLRules[0], // e.g. /** | */ + defaultMLRules[1], // e.g. /** ...| + { // e.g. /*! | */ + beforeText: /^\s*\/\*\!(?!\/)([^\*]|\*(?!\/))*$/, + afterText: /^\s*\*\/$/, + action: { indentAction: vscode.IndentAction.IndentOutdent, appendText: ' * ' } + }, + { // e.g. /*! ...| + beforeText: /^\s*\/\*\!(?!\/)([^\*]|\*(?!\/))*$/, + action: { indentAction: vscode.IndentAction.None, appendText: ' * ' } + }, + defaultMLRules[2], // e.g. * ...| + { // e.g. * ...| + beforeText: /^(\t|[ ])*\ \*(\ ([^\*]|\*(?!\/))*)?$/, + previousLineText: /(?=^(\s*(\/\*\!|\*)).*)(?=(?!(\s*\*\/)))/, + action: { indentAction: vscode.IndentAction.None, appendText: '* ' } + }, + defaultMLRules[3], // e.g. */| + defaultMLRules[4] // e.g. *-----*/| + ]; const defaultSLRules: vscode.OnEnterRule[] = [ { beforeText: /^\s*\/\/\/.+$/, @@ -72,6 +93,11 @@ suite("multiline comment setting tests", function(): void { assert.deepStrictEqual(rules, defaultMLRules); }); + test("Check the OnEnterRules for C++ with an additional option", () => { + const rules = getLanguageConfigFromPatterns('cpp', [ "/**", "/*!" ]).onEnterRules; + assert.deepStrictEqual(rules, multipleMLRules); + }); + test("Make sure duplicate rules are removed", () => { const rules = getLanguageConfigFromPatterns('cpp', [ "/**", { begin: "/**", continue: " * " }, "/**" ]).onEnterRules; assert.deepStrictEqual(rules, defaultMLRules);