@lokascript/language-server 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.js +63 -9
- package/package.json +10 -10
package/dist/server.js
CHANGED
|
@@ -1798,18 +1798,23 @@ async function validateDocument(document) {
|
|
|
1798
1798
|
...d,
|
|
1799
1799
|
source: getBranding(resolvedMode)
|
|
1800
1800
|
})) : await getDiagnostics(region.code, globalSettings.language);
|
|
1801
|
+
const toDocument = (range) => ({
|
|
1802
|
+
start: {
|
|
1803
|
+
line: region.startLine + range.start.line,
|
|
1804
|
+
character: range.start.line === 0 ? region.startChar + range.start.character : range.start.character
|
|
1805
|
+
},
|
|
1806
|
+
end: {
|
|
1807
|
+
line: region.startLine + range.end.line,
|
|
1808
|
+
character: range.end.line === 0 ? region.startChar + range.end.character : range.end.character
|
|
1809
|
+
}
|
|
1810
|
+
});
|
|
1801
1811
|
for (const diag of diagnostics) {
|
|
1812
|
+
const collision = nameCollisionData(diag);
|
|
1802
1813
|
allDiagnostics.push({
|
|
1803
1814
|
...diag,
|
|
1804
|
-
range:
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
character: diag.range.start.line === 0 ? region.startChar + diag.range.start.character : diag.range.start.character
|
|
1808
|
-
},
|
|
1809
|
-
end: {
|
|
1810
|
-
line: region.startLine + diag.range.end.line,
|
|
1811
|
-
character: diag.range.end.line === 0 ? region.startChar + diag.range.end.character : diag.range.end.character
|
|
1812
|
-
}
|
|
1815
|
+
range: toDocument(diag.range),
|
|
1816
|
+
...collision && {
|
|
1817
|
+
data: { ...collision, ranges: collision.ranges.map(toDocument) }
|
|
1813
1818
|
}
|
|
1814
1819
|
});
|
|
1815
1820
|
}
|
|
@@ -1819,6 +1824,33 @@ async function validateDocument(document) {
|
|
|
1819
1824
|
}
|
|
1820
1825
|
connection.sendDiagnostics({ uri, diagnostics: allDiagnostics });
|
|
1821
1826
|
}
|
|
1827
|
+
function nameCollisionData(diagnostic) {
|
|
1828
|
+
const data = diagnostic.data;
|
|
1829
|
+
return diagnostic.code === "name-collision" && data?.name && data.rename && data.ranges ? data : void 0;
|
|
1830
|
+
}
|
|
1831
|
+
function nameCollisionDiagnostics(code, language, source) {
|
|
1832
|
+
const find = semanticPackage?.findNameCollisions;
|
|
1833
|
+
if (typeof find !== "function") return [];
|
|
1834
|
+
const diagnostics = [];
|
|
1835
|
+
for (const finding of find(code, language)) {
|
|
1836
|
+
const ranges = finding.occurrences.map(({ start, end }) => ({
|
|
1837
|
+
start: offsetToPosition(code, start),
|
|
1838
|
+
end: offsetToPosition(code, end)
|
|
1839
|
+
}));
|
|
1840
|
+
const message = finding.rename ? `${finding.message} Rename it (to \`${finding.rename}\`, say).` : finding.message;
|
|
1841
|
+
for (const range of ranges) {
|
|
1842
|
+
diagnostics.push({
|
|
1843
|
+
range,
|
|
1844
|
+
severity: DiagnosticSeverity2.Warning,
|
|
1845
|
+
code: "name-collision",
|
|
1846
|
+
source,
|
|
1847
|
+
message,
|
|
1848
|
+
...finding.rename && { data: { name: finding.name, rename: finding.rename, ranges } }
|
|
1849
|
+
});
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
return diagnostics;
|
|
1853
|
+
}
|
|
1822
1854
|
async function getDiagnostics(code, language) {
|
|
1823
1855
|
const diagnostics = [];
|
|
1824
1856
|
const brand = getBranding(resolvedMode);
|
|
@@ -1886,6 +1918,9 @@ async function getDiagnostics(code, language) {
|
|
|
1886
1918
|
});
|
|
1887
1919
|
}
|
|
1888
1920
|
semanticParsedForeign = result.confidence >= 0.5 && usedLanguage !== "en";
|
|
1921
|
+
if (semanticParsedForeign) {
|
|
1922
|
+
diagnostics.push(...nameCollisionDiagnostics(code, usedLanguage, brand));
|
|
1923
|
+
}
|
|
1889
1924
|
if (result.confidence >= 0.5 && result.command) {
|
|
1890
1925
|
const cmd = result.command.name;
|
|
1891
1926
|
const roles = result.command.roles;
|
|
@@ -2775,7 +2810,26 @@ function extractSymbols(code, language) {
|
|
|
2775
2810
|
connection.onCodeAction((params) => {
|
|
2776
2811
|
const diagnostics = params.context.diagnostics;
|
|
2777
2812
|
const actions = [];
|
|
2813
|
+
const renamed = /* @__PURE__ */ new Set();
|
|
2778
2814
|
for (const diagnostic of diagnostics) {
|
|
2815
|
+
const collision = nameCollisionData(diagnostic);
|
|
2816
|
+
if (collision && !renamed.has(collision.name)) {
|
|
2817
|
+
renamed.add(collision.name);
|
|
2818
|
+
actions.push({
|
|
2819
|
+
title: `Rename \`${collision.name}\` to \`${collision.rename}\``,
|
|
2820
|
+
kind: CodeActionKind.QuickFix,
|
|
2821
|
+
diagnostics: [diagnostic],
|
|
2822
|
+
isPreferred: true,
|
|
2823
|
+
edit: {
|
|
2824
|
+
changes: {
|
|
2825
|
+
[params.textDocument.uri]: collision.ranges.map((range) => ({
|
|
2826
|
+
range,
|
|
2827
|
+
newText: collision.rename
|
|
2828
|
+
}))
|
|
2829
|
+
}
|
|
2830
|
+
}
|
|
2831
|
+
});
|
|
2832
|
+
}
|
|
2779
2833
|
if (diagnostic.code === "missing-role" && diagnostic.message.includes("toggle")) {
|
|
2780
2834
|
actions.push({
|
|
2781
2835
|
title: "Add class target to toggle",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lokascript/language-server",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "Language Server Protocol implementation for LokaScript/hyperscript with 24 language support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/server.js",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"author": "LokaScript Contributors",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@lokascript/framework": "^3.
|
|
32
|
-
"@lokascript/semantic": "^3.
|
|
31
|
+
"@lokascript/framework": "^3.2.0",
|
|
32
|
+
"@lokascript/semantic": "^3.2.0",
|
|
33
33
|
"vscode-languageserver": "^9.0.1",
|
|
34
|
-
"vscode-languageserver-textdocument": "^1.0.
|
|
34
|
+
"vscode-languageserver-textdocument": "^1.0.15"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@hyperfixi/core": "^3.
|
|
37
|
+
"@hyperfixi/core": "^3.2.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependenciesMeta": {
|
|
40
40
|
"@hyperfixi/core": {
|
|
@@ -42,13 +42,13 @@
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@hyperfixi/core": "^3.
|
|
46
|
-
"@types/node": "^26.
|
|
47
|
-
"@vitest/coverage-v8": "^
|
|
45
|
+
"@hyperfixi/core": "^3.2.0",
|
|
46
|
+
"@types/node": "^26.6.3",
|
|
47
|
+
"@vitest/coverage-v8": "^5.0.0",
|
|
48
48
|
"tsup": "^8.0.0",
|
|
49
|
-
"tsx": "^4.23.
|
|
49
|
+
"tsx": "^4.23.15",
|
|
50
50
|
"typescript": "^5.0.0",
|
|
51
|
-
"vitest": "^
|
|
51
|
+
"vitest": "^5.0.2"
|
|
52
52
|
},
|
|
53
53
|
"files": [
|
|
54
54
|
"dist",
|