@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.
Files changed (2) hide show
  1. package/dist/server.js +63 -9
  2. 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
- start: {
1806
- line: region.startLine + diag.range.start.line,
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.1.0",
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.1.0",
32
- "@lokascript/semantic": "^3.1.0",
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.11"
34
+ "vscode-languageserver-textdocument": "^1.0.15"
35
35
  },
36
36
  "peerDependencies": {
37
- "@hyperfixi/core": "^3.1.0"
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.1.0",
46
- "@types/node": "^26.1.2",
47
- "@vitest/coverage-v8": "^4.0.0",
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.1",
49
+ "tsx": "^4.23.15",
50
50
  "typescript": "^5.0.0",
51
- "vitest": "^4.1.5"
51
+ "vitest": "^5.0.2"
52
52
  },
53
53
  "files": [
54
54
  "dist",