Skip to content

Commit 41f9bf9

Browse files
authored
safer fix (#4236)
* safer fix * return overridden default value only when configured default value is defined * better fix * add explicit sentinel check
1 parent 55e65d3 commit 41f9bf9

2 files changed

Lines changed: 32 additions & 8 deletions

File tree

src/extension/test/vscode-node/configurations.test.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,28 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55
import * as assert from 'assert';
6-
import { Config, ConfigKey } from '../../../platform/configuration/common/configurationService';
6+
import { BaseConfig, Config, ConfigKey, ConfigValueValidators } from '../../../platform/configuration/common/configurationService';
77
import { ConfigurationServiceImpl } from '../../../platform/configuration/vscode/configurationServiceImpl';
8-
import { Event } from '../../../util/vs/base/common/event';
98
import { NullEnvService } from '../../../platform/env/common/nullEnvService';
9+
import { Event } from '../../../util/vs/base/common/event';
10+
11+
class TestConfigurationServiceImpl extends ConfigurationServiceImpl {
12+
13+
public getDefinedDefaultValue<T>(key: BaseConfig<T>): T {
14+
if (ConfigValueValidators.isCustomInternalDefaultValue(key.defaultValue) || ConfigValueValidators.isCustomTeamDefaultValue(key.defaultValue)) {
15+
return this.getDefaultValue(key);
16+
}
17+
return key.defaultValue;
18+
}
19+
20+
}
1021

1122
suite('Configuration Defaults', () => {
1223

13-
let testObject: ConfigurationServiceImpl;
24+
let testObject: TestConfigurationServiceImpl;
1425

1526
setup(() => {
16-
testObject = new ConfigurationServiceImpl({
27+
testObject = new TestConfigurationServiceImpl({
1728
_serviceBrand: undefined,
1829
copilotToken: undefined,
1930
onDidStoreUpdate: Event.None
@@ -27,7 +38,7 @@ suite('Configuration Defaults', () => {
2738

2839
for (const setting of advancedSettings) {
2940
const actual = testObject.getConfig<unknown>(setting);
30-
const expected = testObject.getDefaultValue(setting);
41+
const expected = testObject.getDefinedDefaultValue(setting);
3142
assert.deepStrictEqual(actual, expected, `Default value for ${setting.fullyQualifiedId} did not match`);
3243
}
3344

@@ -38,7 +49,7 @@ suite('Configuration Defaults', () => {
3849

3950
for (const setting of internalSettings) {
4051
const actual = testObject.getConfig<unknown>(setting);
41-
const expected = testObject.getDefaultValue(setting);
52+
const expected = testObject.getDefinedDefaultValue(setting);
4253
assert.deepStrictEqual(actual, expected, `Default value for ${setting.fullyQualifiedId} did not match`);
4354
}
4455
});

src/platform/configuration/common/configurationService.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,21 @@ export abstract class AbstractConfigurationService extends Disposable implements
222222
return this._isTeamMember ? key.defaultValue.teamDefaultValue : key.defaultValue.defaultValue;
223223
}
224224

225-
const override = this.getDefaultValueForConfig(key);
226-
return override !== undefined ? override : key.defaultValue;
225+
const defaultValueFromConfig = this.getDefaultValueForConfig(key);
226+
227+
// Preserve legacy behavior for settings whose code default is undefined.
228+
// VS Code may return type-default sentinels (false/0/''/null/undefined) from inspect().defaultValue,
229+
// which should not override an intentional undefined default in code.
230+
const isTypeDefaultSentinel = defaultValueFromConfig === undefined || defaultValueFromConfig === null || defaultValueFromConfig === false || defaultValueFromConfig === 0 || defaultValueFromConfig === '';
231+
if (key.defaultValue === undefined && isTypeDefaultSentinel) {
232+
return key.defaultValue;
233+
}
234+
235+
if (defaultValueFromConfig !== undefined) {
236+
return defaultValueFromConfig;
237+
}
238+
239+
return key.defaultValue;
227240
}
228241

229242
protected _setUserInfo(userInfo: { isInternal: boolean; isTeamMember: boolean; teamMemberUsername?: string }): void {

0 commit comments

Comments
 (0)