in Extension/src/LanguageServer/configurations.ts [790:941]
private updateServerOnFolderSettingsChange(): void {
if (!this.configurationJson) {
return;
}
const settings: CppSettings = new CppSettings(this.rootUri);
const userSettings: CppSettings = new CppSettings();
const env: Environment = this.ExtendedEnvironment;
for (let i: number = 0; i < this.configurationJson.configurations.length; i++) {
const configuration: Configuration = this.configurationJson.configurations[i];
configuration.includePath = this.updateConfigurationPathsArray(configuration.includePath, settings.defaultIncludePath, env);
// in case includePath is reset below
const origIncludePath: string[] | undefined = configuration.includePath;
if (userSettings.addNodeAddonIncludePaths) {
const includePath: string[] = origIncludePath || [];
configuration.includePath = includePath.concat(this.nodeAddonIncludes.filter(i => includePath.indexOf(i) < 0));
}
configuration.defines = this.updateConfigurationStringArray(configuration.defines, settings.defaultDefines, env);
configuration.macFrameworkPath = this.updateConfigurationPathsArray(configuration.macFrameworkPath, settings.defaultMacFrameworkPath, env);
configuration.windowsSdkVersion = this.updateConfigurationString(configuration.windowsSdkVersion, settings.defaultWindowsSdkVersion, env);
configuration.forcedInclude = this.updateConfigurationPathsArray(configuration.forcedInclude, settings.defaultForcedInclude, env);
configuration.compileCommands = this.updateConfigurationString(configuration.compileCommands, settings.defaultCompileCommands, env);
configuration.compilerArgs = this.updateConfigurationStringArray(configuration.compilerArgs, settings.defaultCompilerArgs, env);
configuration.cStandard = this.updateConfigurationString(configuration.cStandard, settings.defaultCStandard, env);
configuration.cppStandard = this.updateConfigurationString(configuration.cppStandard, settings.defaultCppStandard, env);
configuration.intelliSenseMode = this.updateConfigurationString(configuration.intelliSenseMode, settings.defaultIntelliSenseMode, env);
configuration.intelliSenseModeIsExplicit = configuration.intelliSenseModeIsExplicit || settings.defaultIntelliSenseMode !== "";
configuration.cStandardIsExplicit = configuration.cStandardIsExplicit || settings.defaultCStandard !== "";
configuration.cppStandardIsExplicit = configuration.cppStandardIsExplicit || settings.defaultCppStandard !== "";
configuration.mergeConfigurations = this.updateConfigurationBoolean(configuration.mergeConfigurations, settings.defaultMergeConfigurations);
if (!configuration.compileCommands) {
// compile_commands.json already specifies a compiler. compilerPath overrides the compile_commands.json compiler so
// don't set a default when compileCommands is in use.
configuration.compilerPath = this.updateConfigurationString(configuration.compilerPath, settings.defaultCompilerPath, env, true);
configuration.compilerPathIsExplicit = configuration.compilerPathIsExplicit || settings.defaultCompilerPath !== undefined;
if (configuration.compilerPath === undefined) {
if (!!this.defaultCompilerPath) {
// If no config value yet set for these, pick up values from the defaults, but don't consider them explicit.
configuration.compilerPath = this.defaultCompilerPath;
if (!configuration.cStandard && !!this.defaultCStandard) {
configuration.cStandard = this.defaultCStandard;
configuration.cStandardIsExplicit = false;
}
if (!configuration.cppStandard && !!this.defaultCppStandard) {
configuration.cppStandard = this.defaultCppStandard;
configuration.cppStandardIsExplicit = false;
}
if (!configuration.intelliSenseMode && !!this.defaultIntelliSenseMode) {
configuration.intelliSenseMode = this.defaultIntelliSenseMode;
configuration.intelliSenseModeIsExplicit = false;
}
if (!configuration.windowsSdkVersion && !!this.defaultWindowsSdkVersion) {
configuration.windowsSdkVersion = this.defaultWindowsSdkVersion;
}
if (!origIncludePath && !!this.defaultIncludes) {
const includePath: string[] = configuration.includePath || [];
configuration.includePath = includePath.concat(this.defaultIncludes);
}
if (!configuration.macFrameworkPath && !!this.defaultFrameworks) {
configuration.macFrameworkPath = this.defaultFrameworks;
}
}
}
} else {
// However, if compileCommands are used and compilerPath is explicitly set, it's still necessary to resolve variables in it.
if (configuration.compilerPath === "${default}") {
configuration.compilerPath = settings.defaultCompilerPath;
}
if (configuration.compilerPath === null) {
configuration.compilerPath = undefined;
configuration.compilerPathIsExplicit = true;
} else if (configuration.compilerPath !== undefined) {
configuration.compilerPath = util.resolveVariables(configuration.compilerPath, env);
configuration.compilerPathIsExplicit = true;
} else {
configuration.compilerPathIsExplicit = false;
}
}
configuration.customConfigurationVariables = this.updateConfigurationStringDictionary(configuration.customConfigurationVariables, settings.defaultCustomConfigurationVariables, env);
configuration.configurationProvider = this.updateConfigurationString(configuration.configurationProvider, settings.defaultConfigurationProvider, env);
if (!configuration.browse) {
configuration.browse = {};
}
if (!configuration.browse.path) {
if (settings.defaultBrowsePath) {
configuration.browse.path = settings.defaultBrowsePath;
} else if (configuration.includePath) {
// If the user doesn't set browse.path, copy the includePath over. Make sure ${workspaceFolder} is in there though...
configuration.browse.path = configuration.includePath.slice(0);
if (configuration.includePath.findIndex((value: string, index: number) =>
!!value.match(/^\$\{(workspaceRoot|workspaceFolder)\}(\\\*{0,2}|\/\*{0,2})?$/g)) === -1
) {
configuration.browse.path.push("${workspaceFolder}");
}
}
} else {
configuration.browse.path = this.updateConfigurationPathsArray(configuration.browse.path, settings.defaultBrowsePath, env);
}
configuration.browse.limitSymbolsToIncludedHeaders = this.updateConfigurationStringOrBoolean(configuration.browse.limitSymbolsToIncludedHeaders, settings.defaultLimitSymbolsToIncludedHeaders, env);
configuration.browse.databaseFilename = this.updateConfigurationString(configuration.browse.databaseFilename, settings.defaultDatabaseFilename, env);
if (i === this.CurrentConfigurationIndex) {
// If there is no c_cpp_properties.json, there are no relevant C_Cpp.default.* settings set,
// and there is only 1 registered custom config provider, default to using that provider.
const providers: CustomConfigurationProviderCollection = getCustomConfigProviders();
const hasEmptyConfiguration: boolean = !this.propertiesFile
&& !settings.defaultCompilerPath
&& settings.defaultCompilerPath !== ""
&& !settings.defaultIncludePath
&& !settings.defaultDefines
&& !settings.defaultMacFrameworkPath
&& settings.defaultWindowsSdkVersion === ""
&& !settings.defaultForcedInclude
&& settings.defaultCompileCommands === ""
&& !settings.defaultCompilerArgs
&& settings.defaultCStandard === ""
&& settings.defaultCppStandard === ""
&& settings.defaultIntelliSenseMode === ""
&& settings.defaultConfigurationProvider === "";
// Only keep a cached custom browse config if there is an empty configuration,
// or if a specified provider ID has not changed.
let keepCachedBrowseConfig: boolean = true;
if (hasEmptyConfiguration) {
if (providers.size === 1) {
providers.forEach(provider => { configuration.configurationProvider = provider.extensionId; });
if (this.lastCustomBrowseConfigurationProviderId !== undefined) {
keepCachedBrowseConfig = configuration.configurationProvider === this.lastCustomBrowseConfigurationProviderId.Value;
}
} else if (this.lastCustomBrowseConfigurationProviderId !== undefined
&& !!this.lastCustomBrowseConfigurationProviderId.Value) {
// Use the last configuration provider we received a browse config from as the provider ID.
configuration.configurationProvider = this.lastCustomBrowseConfigurationProviderId.Value;
}
} else if (this.lastCustomBrowseConfigurationProviderId !== undefined) {
keepCachedBrowseConfig = configuration.configurationProvider === this.lastCustomBrowseConfigurationProviderId.Value;
}
if (!keepCachedBrowseConfig && this.lastCustomBrowseConfiguration !== undefined) {
this.lastCustomBrowseConfiguration.Value = undefined;
}
}
}
this.updateCompileCommandsFileWatchers();
if (!this.configurationIncomplete) {
this.onConfigurationsChanged();
}
}