Skip to content

Commit 23db78c

Browse files
committed
Improve the withFormatting function and config file
1 parent b9e4978 commit 23db78c

File tree

6 files changed

+31
-50
lines changed

6 files changed

+31
-50
lines changed

language-server/.DS_Store

-6 KB
Binary file not shown.

language-server/src/.DS_Store

-6 KB
Binary file not shown.
-6 KB
Binary file not shown.

language-server/src/features/codeAction/extractSubschema.js

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,38 +48,26 @@ export class ExtractSubSchemaToDefs {
4848
return [];
4949
}
5050

51-
let definitionsNode;
52-
for (const schemaNode of SchemaNode.allNodes(node.root)) {
53-
if (schemaNode.keywordUri === "https://json-schema.org/keyword/definitions") {
54-
definitionsNode = schemaNode;
55-
break;
56-
}
57-
}
58-
51+
let definitionsNode = SchemaNode.step("$defs", node.root) ?? SchemaNode.step("definitions", node.root);
5952
let highestDefNumber = 0;
6053
if (definitionsNode) {
6154
let defNodeKeys = SchemaNode.keys(definitionsNode);
6255
for (const key of defNodeKeys) {
63-
/** @type {string} */
64-
const keyValue = String(SchemaNode.value(key));
65-
/** @type RegExpMatchArray | null */
56+
const keyValue = /** @type {string} */ (SchemaNode.value(key));
57+
6658
const match = /^def(\d+)$/.exec(keyValue);
6759
if (match) {
6860
highestDefNumber = Math.max(parseInt(match[1], 10), highestDefNumber);
6961
}
7062
}
7163
}
72-
let defName = getKeywordName(
73-
/** @type {string} */ (node.root.dialectUri),
74-
"https://json-schema.org/keyword/definitions"
75-
);
7664

77-
let newDefName = `def${highestDefNumber + 1}`;
65+
let defName = getKeywordName(/** @type {string} */(node.root.dialectUri), "https://json-schema.org/keyword/definitions");
66+
const newDefName = `def${highestDefNumber + 1}`;
7867
const settings = await this.configuration.get();
7968
const extractedDef = schemaDocument.textDocument.getText(range);
8069
const defOffset = definitionsNode ? definitionsNode.offset + 1 : node.root.offset + node.root.textLength - 2;
81-
const formattedTextEdit = await withFormatting(
82-
schemaDocument.textDocument,
70+
const formattedTextEdit = withFormatting(
8371
schemaDocument.textDocument.getText(),
8472
{
8573
range: {
@@ -91,6 +79,7 @@ export class ExtractSubSchemaToDefs {
9179
settings.tabSize,
9280
settings.insertSpaces,
9381
settings.detectIndentation,
82+
settings.endOfLine,
9483
defOffset
9584
);
9685

language-server/src/services/configuration.js

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import ignore from "ignore";
1414
* tabSize: number;
1515
* insertSpaces: boolean;
1616
* detectIndentation: boolean;
17+
* endOfLine: string;
1718
* }} DocumentSettings
1819
*/
1920

@@ -87,34 +88,31 @@ export class Configuration {
8788
/** @type (documentUri?: string) => Promise<DocumentSettings> */
8889
async get(documentUri) {
8990
if (!this.#settings) {
90-
/** @type {unknown} */
91-
const extensionSettings = await this.#server.workspace.getConfiguration({
92-
section: "jsonSchemaLanguageServer"
93-
});
94-
/** @type {{ tabSize?: number; insertSpaces?: boolean; detectIndentation?: boolean }} */
95-
const editorSettings = /** @type {unknown} */ (
96-
await this.#server.workspace.getConfiguration({
97-
section: "editor",
98-
scopeUri: documentUri
99-
})
100-
) || {};
101-
const settings = extensionSettings ?? {};
102-
/** @type {{ tabSize?: number; insertSpaces?: boolean; detectIndentation?: boolean }} */
91+
/** @type {unknown[]} */
92+
const config = await this.#server.workspace.getConfiguration([
93+
{ section: "jsonSchemaLanguageServer" },
94+
{ section: "editor", scopeUri: documentUri },
95+
{ section: "files.eol" }
96+
]);
97+
const [extensionSettings, editorSettings, eol] = /** @type [{ defaultDialect?: string; schemaFilePatterns?: string[] },{ tabSize?: number; insertSpaces?: boolean; detectIndentation?: boolean }, string ] */ (config);
98+
/** @type {{ tabSize?: number; insertSpaces?: boolean; detectIndentation?: boolean, endOfLine?: string }} */
10399
const indentationSettings = {
104-
tabSize: editorSettings?.tabSize,
105-
insertSpaces: editorSettings?.insertSpaces,
106-
detectIndentation: editorSettings?.detectIndentation
100+
tabSize: editorSettings?.tabSize ?? this.#defaultSettings.tabSize,
101+
insertSpaces: editorSettings?.insertSpaces ?? this.#defaultSettings.insertSpaces,
102+
detectIndentation: editorSettings?.detectIndentation ?? this.#defaultSettings.detectIndentation,
103+
endOfLine: eol
107104
};
108105

109-
// Merge settings with proper priority
110106
const fullSettings = {
111107
...this.#defaultSettings,
112-
...settings,
108+
...extensionSettings,
113109
...indentationSettings
114110
};
111+
115112
this.#settings = /** @type DocumentSettings */ (fullSettings);
116113
this.#matcher = undefined;
117114
}
115+
118116
return /** @type DocumentSettings */ (this.#settings);
119117
}
120118

language-server/src/util/util.js

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { getKeywordId, getKeywordName } from "@hyperjump/json-schema/experimental";
22
import { resolveIri as hyperjumpResolveIri } from "@hyperjump/uri";
3-
import { readdir, readFile } from "node:fs/promises";
3+
import { readdir } from "node:fs/promises";
44
import { join, relative } from "node:path";
55
import { URI } from "vscode-uri";
66
import detectIndent from "detect-indent";
@@ -10,7 +10,6 @@ import * as jsoncParser from "jsonc-parser";
1010
* @import { SchemaNode as SchemaNodeType } from "../model/schema-node.js"
1111
* @import { Ignore } from "ignore"
1212
* @import { TextEdit } from "vscode-languageserver"
13-
* @import { TextDocument } from "vscode-languageserver-textdocument"
1413
*/
1514

1615

@@ -113,12 +112,10 @@ export const readDirRecursive = async function* (path, filter, cwd) {
113112
}
114113
};
115114

116-
/** @type (uri: string, defaultTabSize: number, insertSpaces: boolean, detectIndentation: boolean) => Promise<{ type: 'tabs' | 'spaces', size: number }> */
117-
const detectIndentationFromContent = async (uri, defaultTabSize, insertSpaces, detectIndentation) => {
115+
/** @type (text: string, defaultTabSize: number, insertSpaces: boolean, detectIndentation: boolean) => { type: 'tabs' | 'spaces', size: number } */
116+
const detectIndentationFromContent = (text, defaultTabSize, insertSpaces, detectIndentation) => {
118117
try {
119-
const filePath = URI.parse(uri).fsPath;
120-
const content = await readFile(filePath, "utf-8");
121-
const { amount } = detectIndent(content);
118+
const { amount } = detectIndent(text);
122119

123120
if (!detectIndentation) {
124121
return { type: "spaces", size: defaultTabSize };
@@ -132,18 +129,15 @@ const detectIndentationFromContent = async (uri, defaultTabSize, insertSpaces, d
132129
}
133130
};
134131

135-
/**
136-
* @type (textDocument: TextDocument, text: string, textEdit: TextEdit,
137-
* defaultTabSize: number, insertSpaces: boolean, detectIndentation: boolean, offset: number) => Promise<TextEdit>
138-
*/
139-
export const withFormatting = async (textDocument, text, textEdit, defaultTabSize, insertSpaces, detectIndentation, offset) => {
140-
const detectedIndent = await detectIndentationFromContent(textDocument.uri, defaultTabSize, insertSpaces, detectIndentation);
132+
/** @type (text: string, textEdit: TextEdit,defaultTabSize: number, insertSpaces: boolean, detectIndentation: boolean, eol: string, offset: number) => TextEdit */
133+
export const withFormatting = (text, textEdit, defaultTabSize, insertSpaces, detectIndentation, eol, offset) => {
134+
const detectedIndent = detectIndentationFromContent(text, defaultTabSize, insertSpaces, detectIndentation);
141135

142136
const formattingOptions = {
143137
insertSpaces: detectedIndent?.type === "spaces",
144138
tabSize: detectedIndent?.size ?? defaultTabSize,
145139
keepLines: true,
146-
eol: "\n"
140+
eol: eol
147141
};
148142

149143
const newText = jsoncParser.applyEdits(text, [

0 commit comments

Comments
 (0)