Skip to content

Commit 5f0a9ca

Browse files
committed
1 parent 2f2d650 commit 5f0a9ca

2 files changed

Lines changed: 44 additions & 3 deletions

File tree

src/vs/workbench/parts/lib/node/configVariables.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,17 @@ export class ConfigVariables extends SystemVariables {
2525
}
2626

2727
protected resolveString(value: string): string {
28+
const originalValue = value;
2829
value = super.resolveString(value);
2930

3031
let regexp = /\$\{config\.(.*?)\}/g;
3132
return value.replace(regexp, (match: string, name: string) => {
3233
let config = this.configurationService.getConfiguration();
3334
let newValue = new Function('_', 'try {return _.' + name + ';} catch (ex) { return "";}')(config);
3435
if (Types.isString(newValue)) {
35-
return newValue;
36-
}
37-
else {
36+
// Prevent infinite recursion and also support nested references (or tokens)
37+
return newValue === originalValue ? '' : this.resolveString(newValue);
38+
} else {
3839
return this.resolve(newValue) + '';
3940
}
4041
});

src/vs/workbench/parts/lib/test/node/configVariables.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,46 @@ suite('ConfigVariables tests', () => {
4646
let systemVariables: ConfigVariables = new ConfigVariables(configurationService, null, null, TestEnvironmentService, URI.parse('file:///VSCode/workspaceLocation'));
4747
assert.strictEqual(systemVariables.resolve('abc ${config.editor.fontFamily} ${config.terminal.integrated.fontFamily} xyz'), 'abc foo bar xyz');
4848
});
49+
test('ConfigVariables: substitute nested configs', () => {
50+
let configurationService: IConfigurationService;
51+
configurationService = new MockConfigurationService({
52+
editor: {
53+
fontFamily: 'foo ${workspaceRoot} ${config.terminal.integrated.fontFamily}'
54+
},
55+
terminal: {
56+
integrated: {
57+
fontFamily: 'bar'
58+
}
59+
}
60+
});
61+
62+
let systemVariables: ConfigVariables = new ConfigVariables(configurationService, null, null, TestEnvironmentService, URI.parse('file:///VSCode/workspaceLocation'));
63+
if (Platform.isWindows) {
64+
assert.strictEqual(systemVariables.resolve('abc ${config.editor.fontFamily} ${config.terminal.integrated.fontFamily} xyz'), 'abc foo \\VSCode\\workspaceLocation bar bar xyz');
65+
} else {
66+
assert.strictEqual(systemVariables.resolve('abc ${config.editor.fontFamily} ${config.terminal.integrated.fontFamily} xyz'), 'abc foo /VSCode/workspaceLocation bar bar xyz');
67+
}
68+
});
69+
test('ConfigVariables: substitute accidental self referenced configs', () => {
70+
let configurationService: IConfigurationService;
71+
configurationService = new MockConfigurationService({
72+
editor: {
73+
fontFamily: 'foo ${workspaceRoot} ${config.terminal.integrated.fontFamily} ${config.editor.fontFamily}'
74+
},
75+
terminal: {
76+
integrated: {
77+
fontFamily: 'bar'
78+
}
79+
}
80+
});
81+
82+
let systemVariables: ConfigVariables = new ConfigVariables(configurationService, null, null, TestEnvironmentService, URI.parse('file:///VSCode/workspaceLocation'));
83+
if (Platform.isWindows) {
84+
assert.strictEqual(systemVariables.resolve('abc ${config.editor.fontFamily} ${config.terminal.integrated.fontFamily} xyz'), 'abc foo \\VSCode\\workspaceLocation bar bar xyz');
85+
} else {
86+
assert.strictEqual(systemVariables.resolve('abc ${config.editor.fontFamily} ${config.terminal.integrated.fontFamily} xyz'), 'abc foo /VSCode/workspaceLocation bar bar xyz');
87+
}
88+
});
4989
test('SystemVariables: substitute one env variable', () => {
5090
let configurationService: IConfigurationService;
5191
configurationService = new MockConfigurationService({

0 commit comments

Comments
 (0)