Skip to content

Commit 7c36fb2

Browse files
authored
Fix overrides priority (#1027)
* Respect user-set `priority` over `priority` set by `overrides.json` * Add a test for merging user settings with defaults
1 parent 5f70fe1 commit 7c36fb2

File tree

2 files changed

+74
-4
lines changed

2 files changed

+74
-4
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { SettingsSchemaManager } from './settings';
2+
3+
const DEAULT_SERVER_PRIORITY = 50;
4+
5+
describe('SettingsSchemaManager', () => {
6+
describe('#mergeByServer()', () => {
7+
it('prioritises user `priority` over the default', () => {
8+
const defaults = {
9+
pyright: {
10+
priority: 500,
11+
serverSettings: {}
12+
}
13+
};
14+
const user = {
15+
pyright: {
16+
priority: 100,
17+
serverSettings: {}
18+
}
19+
};
20+
const result = SettingsSchemaManager.mergeByServer(defaults, user);
21+
expect(result.pyright.priority).toBe(100);
22+
});
23+
it('should use default `priority` if no user value', () => {
24+
const defaults = {
25+
pyright: {
26+
priority: 500,
27+
serverSettings: {}
28+
}
29+
};
30+
const user = {
31+
pyright: {
32+
serverSettings: {}
33+
}
34+
};
35+
const result = SettingsSchemaManager.mergeByServer(defaults, user);
36+
expect(result.pyright.priority).toBe(500);
37+
});
38+
it('should prefer `priority` from `overrides.json` (which is recorded in defaults) if user value is set to the default value', () => {
39+
const defaults = {
40+
pyright: {
41+
priority: 500,
42+
serverSettings: {}
43+
}
44+
};
45+
const user = {
46+
pyright: {
47+
priority: DEAULT_SERVER_PRIORITY,
48+
serverSettings: {}
49+
}
50+
};
51+
const result = SettingsSchemaManager.mergeByServer(defaults, user);
52+
expect(result.pyright.priority).toBe(500);
53+
});
54+
});
55+
});

packages/jupyterlab-lsp/src/settings.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ function isJSONProperty(obj: unknown): obj is IJSONProperty {
4848
*/
4949
type LanguageServerSettings = Record<string, ServerSchemaWrapper>;
5050

51+
/**
52+
* Default server priority; this should match the value defined in `plugin.json` schema.
53+
*/
54+
const DEAULT_SERVER_PRIORITY = 50;
55+
5156
/**
5257
* Get default values from JSON Schema properties field.
5358
*/
@@ -396,7 +401,7 @@ export class SettingsSchemaManager {
396401
composite.language_servers
397402
);
398403

399-
composite.language_servers = this._mergeByServer(
404+
composite.language_servers = SettingsSchemaManager.mergeByServer(
400405
collapsedDefaults.settings,
401406
collapsedUser.settings
402407
);
@@ -552,7 +557,7 @@ export class SettingsSchemaManager {
552557
};
553558
}
554559

555-
private _mergeByServer(
560+
static mergeByServer(
556561
defaults: LanguageServerSettings,
557562
userSettings: LanguageServerSettings
558563
): LanguageServerSettings {
@@ -565,9 +570,19 @@ export class SettingsSchemaManager {
565570
// nothing to merge with
566571
result[serverKey] = JSONExt.deepCopy(serverSettingsGroup);
567572
} else {
573+
// priority should come from (a) user (b) overrides (c) fallback default;
574+
// unfortunately the user and default values get merged in the form so we
575+
// cannot distinguish (a) from (c); as a workaround we can compare its value
576+
// with the default value.
577+
const userOrDefaultPriority = serverSettingsGroup.priority;
578+
const isPriorityUserSet =
579+
typeof userOrDefaultPriority !== 'undefined' &&
580+
userOrDefaultPriority !== DEAULT_SERVER_PRIORITY;
581+
const priority = isPriorityUserSet
582+
? userOrDefaultPriority
583+
: result[serverKey].priority ?? DEAULT_SERVER_PRIORITY;
568584
const merged: Required<ServerSchemaWrapper> = {
569-
priority: (result[serverKey].priority ||
570-
serverSettingsGroup.priority) as any,
585+
priority,
571586
// `serverSettings` entries are expected to be flattened to dot notation here.
572587
serverSettings: {
573588
...(result[serverKey].serverSettings || {}),

0 commit comments

Comments
 (0)