Skip to content

Commit d272fc3

Browse files
committed
Configuration cleanup
1 parent 697cb2e commit d272fc3

File tree

2 files changed

+51
-26
lines changed

2 files changed

+51
-26
lines changed

language-server/src/services/configuration.js

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DidChangeConfigurationNotification } from "vscode-languageserver";
22
import ignore from "ignore";
3+
import { pick } from "../util/util.js";
34

45
/**
56
* @import { DidChangeConfigurationParams, NotificationHandler } from "vscode-languageserver"
@@ -11,20 +12,42 @@ import ignore from "ignore";
1112
* @typedef {{
1213
* defaultDialect?: string;
1314
* schemaFilePatterns: string[];
14-
* detectIndentation?: boolean;
15+
* }} LanguageServerSettings
16+
*/
17+
18+
/**
19+
* @typedef {{
1520
* tabSize?: number;
1621
* insertSpaces?: boolean;
17-
* endOfLine: string;
18-
* }} DocumentSettings
22+
* detectIndentation: boolean;
23+
* }} EditorSettings
24+
*/
25+
26+
/**
27+
* @typedef {{
28+
* eol?: string;
29+
* }} FilesSettings
30+
*/
31+
32+
/**
33+
* @typedef {LanguageServerSettings & EditorSettings & FilesSettings} DocumentSettings
1934
*/
2035

36+
/**
37+
* @typedef {[
38+
* Partial<LanguageServerSettings> | null,
39+
* Partial<EditorSettings> | null,
40+
* Partial<FilesSettings> | null
41+
* ]} Settings
42+
*/
2143

2244
export class Configuration {
2345
#server;
2446

2547
/** @type DocumentSettings | undefined */
2648
#settings;
27-
/** @type Partial<DocumentSettings> */
49+
50+
/** @type DocumentSettings */
2851
#defaultSettings;
2952

3053
/** @type ((uri: string) => boolean) | undefined */
@@ -76,32 +99,22 @@ export class Configuration {
7699
/** @type () => Promise<DocumentSettings> */
77100
async get() {
78101
if (!this.#settings) {
79-
/** @type {unknown[]} */
80-
const config = await this.#server.workspace.getConfiguration([
102+
const settings = /** @type Settings */ (await this.#server.workspace.getConfiguration([
81103
{ section: "jsonSchemaLanguageServer" },
82104
{ section: "editor" },
83-
{ section: "files.eol" }
84-
]);
85-
const [extensionSettings, editorSettings, eol] = /** @type [Partial<DocumentSettings> | null, Partial<DocumentSettings> | null, string | null] */ (config);
86-
const indentationSettings = {
87-
tabSize: editorSettings?.tabSize,
88-
insertSpaces: editorSettings?.insertSpaces,
89-
detectIndentation: editorSettings?.detectIndentation ?? this.#defaultSettings.detectIndentation,
90-
endOfLine: eol
105+
{ section: "files" }
106+
]));
107+
const [languageServerSettings, editorSettings, filesSettings] = settings;
91108

92-
};
93-
94-
const fullSettings = {
109+
this.#settings = {
95110
...this.#defaultSettings,
96-
...extensionSettings,
97-
...indentationSettings
111+
...languageServerSettings,
112+
...pick(editorSettings ?? {}, "tabSize", "insertSpaces", "detectIndentation"),
113+
...pick(filesSettings ?? {}, "eol")
98114
};
99-
100-
this.#settings = /** @type DocumentSettings */ (fullSettings);
101-
this.#matcher = undefined;
102115
}
103116

104-
return /** @type DocumentSettings */ (this.#settings);
117+
return this.#settings;
105118
}
106119

107120
/** @type (uri: string) => Promise<boolean> */

language-server/src/util/util.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { getKeywordId, getKeywordName } from "@hyperjump/json-schema/experimental";
22
import { resolveIri as hyperjumpResolveIri } from "@hyperjump/uri";
33
import { readdir } from "node:fs/promises";
4+
import { EOL } from "node:os";
45
import { join, relative } from "node:path";
56
import { URI } from "vscode-uri";
67
import detectIndent from "detect-indent";
78
import * as jsoncParser from "jsonc-parser";
8-
import os from "os";
99

1010
/**
1111
* @import { TextEdit } from "vscode-languageserver"
1212
* @import { TextDocument } from "vscode-languageserver-textdocument"
1313
* @import { Ignore } from "ignore"
14-
* @import { DocumentSettings} from "../services/configuration.js"
14+
* @import { DocumentSettings } from "../services/configuration.js"
1515
* @import { SchemaNode as SchemaNodeType } from "../model/schema-node.js"
1616
*/
1717

@@ -126,7 +126,7 @@ export const withFormatting = (textDocument, textEdit, settings) => {
126126
insertSpaces: indentation.type === "space",
127127
tabSize: indentation.amount,
128128
keepLines: true,
129-
eol: settings.endOfLine == "auto" ? os.EOL : settings.endOfLine
129+
eol: settings.eol == "auto" ? EOL : settings.eol
130130
};
131131

132132
const offset = textDocument.offsetAt(textEdit.range.start);
@@ -151,3 +151,15 @@ export const withFormatting = (textDocument, textEdit, settings) => {
151151
newText: jsoncParser.applyEdits(textEdit.newText, formatEdits)
152152
};
153153
};
154+
155+
// eslint-disable-next-line @stylistic/no-extra-parens
156+
export const pick = /** @type <T extends object, K extends keyof T>(object: T, ...keys: K[]) => Partial<Pick<T, K>> */ ((object, ...keys) => {
157+
/** @type Partial<typeof object> */
158+
const result = {};
159+
for (const key of keys) {
160+
if (key in object) {
161+
result[key] = object[key];
162+
}
163+
}
164+
return result;
165+
});

0 commit comments

Comments
 (0)