in Extension/src/LanguageServer/settings.ts [528:660]
public populateEditorConfig(document: vscode.TextDocument): void {
// Set up a map of setting names and values. Parse through the document line-by-line, looking for
// existing occurrences to replace. Replaced occurrences are removed from the map. If any remain when
// done, they are added as a new section at the end of the file. The file is opened with unsaved
// edits, so the user may edit or undo if we made a mistake.
const settingMap: Map<string, string> = new Map<string, string>();
settingMap.set("cpp_indent_braces", this.vcFormatIndentBraces.toString());
settingMap.set("cpp_indent_multi_line_relative_to", mapIndentationReferenceToEditorConfig(this.vcFormatIndentMultiLineRelativeTo));
settingMap.set("cpp_indent_within_parentheses", this.vcFormatIndentWithinParentheses.toString());
settingMap.set("cpp_indent_preserve_within_parentheses", this.vcFormatIndentPreserveWithinParentheses.toString());
settingMap.set("cpp_indent_case_labels", this.vcFormatIndentCaseLabels.toString());
settingMap.set("cpp_indent_case_contents", this.vcFormatIndentCaseContents.toString());
settingMap.set("cpp_indent_case_contents_when_block", this.vcFormatIndentCaseContentsWhenBlock.toString());
settingMap.set("cpp_indent_lambda_braces_when_parameter", this.vcFormatIndentLambdaBracesWhenParameter.toString());
settingMap.set("cpp_indent_goto_labels", mapIndentToEditorConfig(this.vcFormatIndentGotoLables));
settingMap.set("cpp_indent_preprocessor", mapIndentToEditorConfig(this.vcFormatIndentPreprocessor));
settingMap.set("cpp_indent_access_specifiers", this.vcFormatIndentAccessSpecifiers.toString());
settingMap.set("cpp_indent_namespace_contents", this.vcFormatIndentNamespaceContents.toString());
settingMap.set("cpp_indent_preserve_comments", this.vcFormatIndentPreserveComments.toString());
settingMap.set("cpp_new_line_before_open_brace_namespace", mapNewOrSameLineToEditorConfig(this.vcFormatNewlineBeforeOpenBraceNamespace));
settingMap.set("cpp_new_line_before_open_brace_type", mapNewOrSameLineToEditorConfig(this.vcFormatNewlineBeforeOpenBraceType));
settingMap.set("cpp_new_line_before_open_brace_function", mapNewOrSameLineToEditorConfig(this.vcFormatNewlineBeforeOpenBraceFunction));
settingMap.set("cpp_new_line_before_open_brace_block", mapNewOrSameLineToEditorConfig(this.vcFormatNewlineBeforeOpenBraceBlock));
settingMap.set("cpp_new_line_before_open_brace_lambda", mapNewOrSameLineToEditorConfig(this.vcFormatNewlineBeforeOpenBraceLambda));
settingMap.set("cpp_new_line_scope_braces_on_separate_lines", this.vcFormatNewlineScopeBracesOnSeparateLines.toString());
settingMap.set("cpp_new_line_close_brace_same_line_empty_type", this.vcFormatNewlineCloseBraceSameLineEmptyType.toString());
settingMap.set("cpp_new_line_close_brace_same_line_empty_function", this.vcFormatNewlineCloseBraceSameLineEmptyFunction.toString());
settingMap.set("cpp_new_line_before_catch", this.vcFormatNewlineBeforeCatch.toString().toString());
settingMap.set("cpp_new_line_before_else", this.vcFormatNewlineBeforeElse.toString().toString());
settingMap.set("cpp_new_line_before_while_in_do_while", this.vcFormatNewlineBeforeWhileInDoWhile.toString());
settingMap.set("cpp_space_before_function_open_parenthesis", this.vcFormatSpaceBeforeFunctionOpenParenthesis.toString());
settingMap.set("cpp_space_within_parameter_list_parentheses", this.vcFormatSpaceWithinParameterListParentheses.toString());
settingMap.set("cpp_space_between_empty_parameter_list_parentheses", this.vcFormatSpaceBetweenEmptyParameterListParentheses.toString());
settingMap.set("cpp_space_after_keywords_in_control_flow_statements", this.vcFormatSpaceAfterKeywordsInControlFlowStatements.toString());
settingMap.set("cpp_space_within_control_flow_statement_parentheses", this.vcFormatSpaceWithinControlFlowStatementParentheses.toString());
settingMap.set("cpp_space_before_lambda_open_parenthesis", this.vcFormatSpaceBeforeLambdaOpenParenthesis.toString());
settingMap.set("cpp_space_within_cast_parentheses", this.vcFormatSpaceWithinCastParentheses.toString());
settingMap.set("cpp_space_after_cast_close_parenthesis", this.vcFormatSpaceAfterCastCloseParenthesis.toString());
settingMap.set("cpp_space_within_expression_parentheses", this.vcFormatSpaceWithinExpressionParentheses.toString());
settingMap.set("cpp_space_before_block_open_brace", this.vcFormatSpaceBeforeBlockOpenBrace.toString());
settingMap.set("cpp_space_between_empty_braces", this.vcFormatSpaceBetweenEmptyBraces.toString());
settingMap.set("cpp_space_before_initializer_list_open_brace", this.vcFormatSpaceBeforeInitializerListOpenBrace.toString());
settingMap.set("cpp_space_within_initializer_list_braces", this.vcFormatSpaceWithinInitializerListBraces.toString());
settingMap.set("cpp_space_preserve_in_initializer_list", this.vcFormatSpacePreserveInInitializerList.toString());
settingMap.set("cpp_space_before_open_square_bracket", this.vcFormatSpaceBeforeOpenSquareBracket.toString());
settingMap.set("cpp_space_within_square_brackets", this.vcFormatSpaceWithinSquareBrackets.toString());
settingMap.set("cpp_space_before_empty_square_brackets", this.vcFormatSpaceBeforeEmptySquareBrackets.toString());
settingMap.set("cpp_space_between_empty_square_brackets", this.vcFormatSpaceBetweenEmptySquareBrackets.toString());
settingMap.set("cpp_space_group_square_brackets", this.vcFormatSpaceGroupSquareBrackets.toString());
settingMap.set("cpp_space_within_lambda_brackets", this.vcFormatSpaceWithinLambdaBrackets.toString());
settingMap.set("cpp_space_between_empty_lambda_brackets", this.vcFormatSpaceBetweenEmptyLambdaBrackets.toString());
settingMap.set("cpp_space_before_comma", this.vcFormatSpaceBeforeComma.toString());
settingMap.set("cpp_space_after_comma", this.vcFormatSpaceAfterComma.toString());
settingMap.set("cpp_space_remove_around_member_operators", this.vcFormatSpaceRemoveAroundMemberOperators.toString());
settingMap.set("cpp_space_before_inheritance_colon", this.vcFormatSpaceBeforeInheritanceColon.toString());
settingMap.set("cpp_space_before_constructor_colon", this.vcFormatSpaceBeforeConstructorColon.toString());
settingMap.set("cpp_space_remove_before_semicolon", this.vcFormatSpaceRemoveBeforeSemicolon.toString());
settingMap.set("cpp_space_after_semicolon", this.vcFormatSpaceInsertAfterSemicolon.toString());
settingMap.set("cpp_space_remove_around_unary_operator", this.vcFormatSpaceRemoveAroundUnaryOperator.toString());
settingMap.set("cpp_space_around_binary_operator", this.vcFormatSpaceAroundBinaryOperator.toString());
settingMap.set("cpp_space_around_assignment_operator", this.vcFormatSpaceAroundAssignmentOperator.toString());
settingMap.set("cpp_space_pointer_reference_alignment", this.vcFormatSpacePointerReferenceAlignment.toString());
settingMap.set("cpp_space_around_ternary_operator", this.vcFormatSpaceAroundTernaryOperator.toString());
settingMap.set("cpp_wrap_preserve_blocks", mapWrapToEditorConfig(this.vcFormatWrapPreserveBlocks));
const edits: vscode.WorkspaceEdit = new vscode.WorkspaceEdit();
let isInWildcardSection: boolean = false;
let trailingBlankLines: number = 0;
// Cycle through lines using document.lineAt(), to avoid issues mapping edits back to lines.
for (let i: number = 0; i < document.lineCount; ++i) {
let textLine: vscode.TextLine = document.lineAt(i);
if (textLine.range.end.character === 0) {
trailingBlankLines++;
continue;
}
trailingBlankLines = 0;
// Keep track of whether we left off in a wildcard section, so we don't output a redundant one.
let text: string = textLine.text.trim();
if (text.startsWith("[")) {
isInWildcardSection = text.startsWith("[*]");
continue;
}
for (const setting of settingMap) {
if (text.startsWith(setting[0])) {
// The next character must be white space or '=', otherwise it's a partial match.
if (text.length > setting[0].length) {
const c: string = text[setting[0].length];
if (c !== '=' && c.trim() !== "") {
continue;
}
}
edits.replace(document.uri, textLine.range, setting[0] + "=" + setting[1]);
// Because we're going to remove this setting from the map,
// scan ahead to update any other sections it may need to be updated in.
for (let j: number = i + 1; j < document.lineCount; ++j) {
textLine = document.lineAt(j);
text = textLine.text.trim();
if (text.startsWith(setting[0])) {
// The next character must be white space or '=', otherwise it's a partial match.
if (text.length > setting[0].length) {
const c: string = text[setting[0].length];
if (c !== '=' && c.trim() !== "") {
continue;
}
}
edits.replace(document.uri, textLine.range, setting[0] + "=" + setting[1]);
}
}
settingMap.delete(setting[0]);
break;
}
}
if (settingMap.size === 0) {
break;
}
}
if (settingMap.size > 0) {
let remainingSettingsText: string = "";
if (document.lineCount > 0) {
while (++trailingBlankLines < 2) {
remainingSettingsText += "\n";
}
}
if (!isInWildcardSection) {
remainingSettingsText += "[*]\n";
}
for (const setting of settingMap) {
remainingSettingsText += setting[0] + "=" + setting[1] + "\n";
}
const lastPosition: vscode.Position = document.lineAt(document.lineCount - 1).range.end;
edits.insert(document.uri, lastPosition, remainingSettingsText);
}
vscode.workspace.applyEdit(edits).then(() => vscode.window.showTextDocument(document));
}