Skip to content

Commit 2f0337b

Browse files
authored
fix(settings): add logic to detect changes in deeply-nested settings #2654
1 parent dd113da commit 2f0337b

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/shared/settings.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,14 @@ function createSettingsClass<T extends TypeDescriptor>(section: string, descript
248248
//
249249
// So if `aws.foo.bar` changed, this would fire with data `{ key: 'bar' }`
250250
const props = keys(descriptor)
251+
const store = toRecord(props, p => this.get(p))
251252
const emitter = new vscode.EventEmitter<{ readonly key: keyof T }>()
252253
const listener = this.settings.onDidChangeSection(section, event => {
253-
for (const key of props.filter(p => event.affectsConfiguration(p))) {
254+
const isDifferent = (p: keyof T & string) => event.affectsConfiguration(p) || store[p] !== this.get(p)
255+
256+
for (const key of props.filter(isDifferent)) {
254257
this.log(`key "${key}" changed`)
258+
store[key] = this.get(key)
255259
emitter.fire({ key })
256260
}
257261
})

src/test/shared/settingsConfiguration.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,4 +328,25 @@ describe('Experiments', function () {
328328
await sut.update('jsonResourceModification', true)
329329
assert.strictEqual(await sut.isExperimentEnabled('jsonResourceModification'), true)
330330
})
331+
332+
it('fires events from nested settings', async function () {
333+
const info = vscode.workspace.getConfiguration().inspect('aws.experiments.jsonResourceModification')
334+
if (info?.globalValue) {
335+
this.skip()
336+
}
337+
338+
const experiments = new Experiments(new Settings(vscode.ConfigurationTarget.Workspace))
339+
340+
try {
341+
const key = new Promise<string>((resolve, reject) => {
342+
experiments.onDidChange(event => resolve(event.key))
343+
setTimeout(() => reject(new Error('Timed out waiting for settings event')), 5000)
344+
})
345+
346+
await experiments.update('jsonResourceModification', true)
347+
assert.strictEqual(await key, 'jsonResourceModification')
348+
} finally {
349+
await experiments.reset()
350+
}
351+
})
331352
})

0 commit comments

Comments
 (0)