umple-lsp-server 0.4.2 → 1.0.1

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 (72) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +36 -0
  3. package/completions.scm +9 -3
  4. package/definitions.scm +5 -0
  5. package/highlights.scm +487 -0
  6. package/out/codeActions.d.ts +31 -0
  7. package/out/codeActions.js +361 -0
  8. package/out/codeActions.js.map +1 -0
  9. package/out/completionAnalysis.d.ts +9 -1
  10. package/out/completionAnalysis.js +1211 -64
  11. package/out/completionAnalysis.js.map +1 -1
  12. package/out/completionBuilder.d.ts +1 -1
  13. package/out/completionBuilder.js +463 -319
  14. package/out/completionBuilder.js.map +1 -1
  15. package/out/completionTriggers.d.ts +20 -0
  16. package/out/completionTriggers.js +69 -0
  17. package/out/completionTriggers.js.map +1 -0
  18. package/out/diagnosticSources.d.ts +3 -0
  19. package/out/diagnosticSources.js +11 -0
  20. package/out/diagnosticSources.js.map +1 -0
  21. package/out/diagramNavigation.js +3 -3
  22. package/out/diagramNavigation.js.map +1 -1
  23. package/out/documentSymbolBuilder.js +2 -37
  24. package/out/documentSymbolBuilder.js.map +1 -1
  25. package/out/formatter.d.ts +13 -1
  26. package/out/formatter.js +303 -10
  27. package/out/formatter.js.map +1 -1
  28. package/out/hoverBuilder.js +90 -23
  29. package/out/hoverBuilder.js.map +1 -1
  30. package/out/inlayHints.d.ts +21 -0
  31. package/out/inlayHints.js +98 -0
  32. package/out/inlayHints.js.map +1 -0
  33. package/out/referenceSearch.d.ts +1 -1
  34. package/out/referenceSearch.js +134 -7
  35. package/out/referenceSearch.js.map +1 -1
  36. package/out/resolver.js +82 -3
  37. package/out/resolver.js.map +1 -1
  38. package/out/semanticTokens.d.ts +32 -0
  39. package/out/semanticTokens.js +228 -0
  40. package/out/semanticTokens.js.map +1 -0
  41. package/out/server.js +216 -36
  42. package/out/server.js.map +1 -1
  43. package/out/snippets.d.ts +39 -0
  44. package/out/snippets.js +328 -0
  45. package/out/snippets.js.map +1 -0
  46. package/out/symbolIndex.d.ts +50 -0
  47. package/out/symbolIndex.js +170 -7
  48. package/out/symbolIndex.js.map +1 -1
  49. package/out/symbolPresentation.d.ts +3 -0
  50. package/out/symbolPresentation.js +45 -0
  51. package/out/symbolPresentation.js.map +1 -0
  52. package/out/symbolTypes.d.ts +1 -0
  53. package/out/tokenAnalysis.js +77 -4
  54. package/out/tokenAnalysis.js.map +1 -1
  55. package/out/tokenTypes.d.ts +8 -1
  56. package/out/tokenTypes.js +2 -0
  57. package/out/tokenTypes.js.map +1 -1
  58. package/out/treeUtils.js +17 -4
  59. package/out/treeUtils.js.map +1 -1
  60. package/out/workspaceSymbolBuilder.d.ts +3 -0
  61. package/out/workspaceSymbolBuilder.js +117 -0
  62. package/out/workspaceSymbolBuilder.js.map +1 -0
  63. package/package.json +5 -2
  64. package/references.scm +31 -3
  65. package/tree-sitter-umple.wasm +0 -0
  66. package/out/bin.d.ts +0 -2
  67. package/out/bin.js +0 -5
  68. package/out/bin.js.map +0 -1
  69. package/out/log.d.ts +0 -7
  70. package/out/log.js +0 -22
  71. package/out/log.js.map +0 -1
  72. package/out/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildQuickFixActions = buildQuickFixActions;
4
+ exports.splitCodeAndComment = splitCodeAndComment;
5
+ /**
6
+ * Quick-fix code actions for Umple diagnostics (topics 056, 057).
7
+ *
8
+ * Pure logic only: takes a TextDocument + Diagnostic[] and returns the
9
+ * CodeActions that apply. No LSP transport, no compiler invocation.
10
+ *
11
+ * Currently produces a single user-visible action: `Add missing semicolon`.
12
+ * Three trigger codes, three classifiers:
13
+ *
14
+ * - W1007 (class-content): isA / implementsReq / inline assoc / interface
15
+ * method signature / attribute declaration (incl. simple default value).
16
+ * - W1006 (state-machine): transition with optional guard + action body.
17
+ * - E1502 (filter-body): include / includeFilter / namespace statements.
18
+ * The diagnostic line points to the filter HEADER, so this branch
19
+ * scans the filter block for an unterminated single-line statement and
20
+ * emits the action only when EXACTLY ONE candidate is found.
21
+ *
22
+ * Each classifier rejects line shapes where appending `;` either doesn't
23
+ * fix the diagnostic or introduces a new one.
24
+ */
25
+ const node_1 = require("vscode-languageserver/node");
26
+ const diagnosticSources_1 = require("./diagnosticSources");
27
+ const W1007 = "W1007";
28
+ const W1006 = "W1006";
29
+ const E1502 = "E1502";
30
+ const SEMICOLON_TITLE = "Add missing semicolon";
31
+ /**
32
+ * Build all quick-fix CodeActions that apply to the given diagnostic set.
33
+ * Currently this is just `Add missing semicolon`.
34
+ */
35
+ function buildQuickFixActions(document, diagnostics) {
36
+ const actions = [];
37
+ const text = document.getText();
38
+ const lines = text.split(/\r?\n/);
39
+ for (const diag of diagnostics) {
40
+ const action = buildSemicolonAction(document, lines, diag);
41
+ if (action)
42
+ actions.push(action);
43
+ }
44
+ return actions;
45
+ }
46
+ function buildSemicolonAction(document, lines, diag) {
47
+ if (!(0, diagnosticSources_1.isUmpleDiagnosticSource)(diag.source))
48
+ return null;
49
+ if (diag.message?.startsWith("In imported file"))
50
+ return null;
51
+ if (diag.code === W1007) {
52
+ return buildLineLocalSemicolonAction(document, lines, diag, classifyW1007);
53
+ }
54
+ if (diag.code === W1006) {
55
+ return buildLineLocalSemicolonAction(document, lines, diag, classifyW1006);
56
+ }
57
+ if (diag.code === E1502) {
58
+ return buildFilterStatementSemicolonAction(document, lines, diag);
59
+ }
60
+ return null;
61
+ }
62
+ /**
63
+ * Common shape for W1007 / W1006 actions: the diagnostic line IS the line
64
+ * we want to edit. The classifier callback decides whether the trimmed
65
+ * code matches a known semicolon-fix shape.
66
+ */
67
+ function buildLineLocalSemicolonAction(document, lines, diag, classify) {
68
+ const line = diag.range.start.line;
69
+ if (line < 0 || line >= lines.length)
70
+ return null;
71
+ const lineText = lines[line];
72
+ const split = splitCodeAndComment(lineText);
73
+ const codeTrimmed = split.code.trimEnd();
74
+ if (codeTrimmed.length === 0)
75
+ return null;
76
+ const lastChar = codeTrimmed[codeTrimmed.length - 1];
77
+ if (lastChar === ";" || lastChar === "{" || lastChar === "}" || lastChar === ",") {
78
+ return null;
79
+ }
80
+ if (!classify(codeTrimmed.trimStart(), lines, line))
81
+ return null;
82
+ return makeAction(document, diag, line, codeTrimmed.length);
83
+ }
84
+ /**
85
+ * E1502 (filter-body) action. Diagnostic line is the filter header, NOT
86
+ * the bad statement line. Find the enclosing filter block, scan inside
87
+ * for unterminated single-line statements, and emit an action only when
88
+ * EXACTLY ONE candidate exists. Multiple candidates → no action (E1502
89
+ * doesn't tell us which to fix).
90
+ */
91
+ function buildFilterStatementSemicolonAction(document, lines, diag) {
92
+ const block = findEnclosingFilterBlock(lines, diag.range.start.line);
93
+ if (!block)
94
+ return null;
95
+ // Track nested brace depth as we walk through the filter body. Only
96
+ // statements at the top level of the filter body (depth === 0) are
97
+ // candidates for the semicolon fix. A nested `hops { include C }`
98
+ // doesn't help E1502 even if `include C;` looks like a valid
99
+ // filter-statement shape — the compiler diagnostic is still raised.
100
+ const candidates = [];
101
+ let depth = 0;
102
+ for (let i = block.bodyStart; i <= block.bodyEnd; i++) {
103
+ const lineText = lines[i] ?? "";
104
+ const split = splitCodeAndComment(lineText);
105
+ const codeTrimmed = split.code.trimEnd();
106
+ // Compute depth-at-start-of-line *before* updating from this line's
107
+ // braces, so a candidate on a line that opens a nested block still
108
+ // counts as filter-top-level if the depth was 0 going in.
109
+ const depthAtLineStart = depth;
110
+ for (let j = 0; j < split.code.length; j++) {
111
+ const c = split.code[j];
112
+ if (c === "{")
113
+ depth++;
114
+ else if (c === "}")
115
+ depth = Math.max(0, depth - 1);
116
+ }
117
+ if (codeTrimmed.length === 0)
118
+ continue;
119
+ if (depthAtLineStart !== 0)
120
+ continue;
121
+ const lastChar = codeTrimmed[codeTrimmed.length - 1];
122
+ if (lastChar === ";" || lastChar === "{" || lastChar === "}" || lastChar === ",") {
123
+ continue;
124
+ }
125
+ if (!looksLikeFilterStatement(codeTrimmed.trimStart()))
126
+ continue;
127
+ candidates.push({ line: i, insertCol: codeTrimmed.length });
128
+ }
129
+ if (candidates.length !== 1)
130
+ return null;
131
+ const c = candidates[0];
132
+ return makeAction(document, diag, c.line, c.insertCol);
133
+ }
134
+ function makeAction(document, diag, line, character) {
135
+ const edit = node_1.TextEdit.insert({ line, character }, ";");
136
+ const workspaceEdit = { changes: { [document.uri]: [edit] } };
137
+ return {
138
+ title: SEMICOLON_TITLE,
139
+ kind: node_1.CodeActionKind.QuickFix,
140
+ diagnostics: [diag],
141
+ edit: workspaceEdit,
142
+ };
143
+ }
144
+ // ── W1007 classifier (class-content) ───────────────────────────────────────
145
+ function classifyW1007(code, lines, diagLine) {
146
+ if (looksLikeIsAList(code))
147
+ return true;
148
+ if (looksLikeImplementsReqList(code))
149
+ return true;
150
+ if (looksLikeInlineAssociation(code))
151
+ return true;
152
+ if (looksLikeMethodSignature(code) && isInsideInterfaceBody(lines, diagLine))
153
+ return true;
154
+ if (looksLikeAttributeDeclaration(code))
155
+ return true;
156
+ return false;
157
+ }
158
+ const ID = "[A-Za-z_][A-Za-z_0-9]*";
159
+ const ID_LIST = `${ID}(\\s*,\\s*${ID})*`;
160
+ function looksLikeIsAList(code) {
161
+ return new RegExp(`^isA\\s+${ID_LIST}$`).test(code);
162
+ }
163
+ function looksLikeImplementsReqList(code) {
164
+ return new RegExp(`^implementsReq\\s+${ID_LIST}$`).test(code);
165
+ }
166
+ const ARROW = /(<@>-|-<@>|>->|<-<|->|<-|--)/;
167
+ const ASSOC_REJECT_CHARS = /[+=&|!?:;{}()\[\]]/;
168
+ const MULTIPLICITY = /(?:^|\s)(?:\*|\d+(?:\.\.(?:\*|\d+))?)(?:\s|$)/;
169
+ function looksLikeInlineAssociation(code) {
170
+ if (!ARROW.test(code))
171
+ return false;
172
+ if (ASSOC_REJECT_CHARS.test(code))
173
+ return false;
174
+ if (!MULTIPLICITY.test(code))
175
+ return false;
176
+ const trimmed = code.trim();
177
+ if (!/[A-Za-z_]\w*$/.test(trimmed))
178
+ return false;
179
+ return true;
180
+ }
181
+ function looksLikeMethodSignature(code) {
182
+ return new RegExp(`^(${ID}(\\s*<[\\w\\s,<>]+>)?\\s+)?${ID}\\s*\\([^)]*\\)\\s*$`).test(code);
183
+ }
184
+ const STRUCTURAL_FIRST_TOKENS = new Set([
185
+ "class",
186
+ "interface",
187
+ "trait",
188
+ "associationClass",
189
+ "enum",
190
+ "state",
191
+ "statemachine",
192
+ "stateMachine",
193
+ "filter",
194
+ "req",
195
+ "mixset",
196
+ "namespace",
197
+ "use",
198
+ ]);
199
+ function looksLikeAttributeDeclaration(code) {
200
+ const first = code.split(/\s+/, 1)[0];
201
+ if (STRUCTURAL_FIRST_TOKENS.has(first))
202
+ return false;
203
+ // Path 1 (topic 056): two or more whitespace-separated bare identifiers.
204
+ if (new RegExp(`^${ID}(\\s+${ID})+$`).test(code))
205
+ return true;
206
+ // Path 2 (topic 057 item 3): default-value attribute. `<type> <name> =
207
+ // <literal>` where literal is number, single-token quoted string, true,
208
+ // false, or another bare identifier. Reject expression operators on RHS.
209
+ return looksLikeDefaultValueAttribute(code);
210
+ }
211
+ const NUMBER_LITERAL = `-?\\d+(?:\\.\\d+)?`;
212
+ // Conservative quoted string: opening quote, no-quote chars (no escapes),
213
+ // closing quote. Allows spaces inside: `"Bob Smith"`. Backslash escapes
214
+ // not supported — documented as a false negative.
215
+ const STRING_LITERAL = `"[^"\\\\]*"`;
216
+ const RHS_VALUE = `(?:${NUMBER_LITERAL}|${STRING_LITERAL}|true|false|${ID})`;
217
+ function looksLikeDefaultValueAttribute(code) {
218
+ // `<type> <name> = <value>` — two id tokens before `=`, then a value.
219
+ // Type-with-generics (`List<String>`) deliberately rejected (compiler
220
+ // post-fix behavior introduces W46 — not a clean win).
221
+ return new RegExp(`^${ID}\\s+${ID}\\s*=\\s*${RHS_VALUE}\\s*$`).test(code);
222
+ }
223
+ // ── W1006 classifier (state-machine transitions) ──────────────────────────
224
+ function classifyW1006(code, _lines, _diagLine) {
225
+ return looksLikeStateTransition(code);
226
+ }
227
+ /**
228
+ * Match `<event> ([guard])? (/ { action-body })? -> <state>(.<state>)*`.
229
+ *
230
+ * - `<event>` is an identifier.
231
+ * - `[guard]` is bracketed content (no nested `]`).
232
+ * - `/{action}` is balanced single-level braces (no nested `{`).
233
+ * - RHS is an identifier or dotted state path.
234
+ *
235
+ * Nested braces inside the action body are deliberately rejected — the
236
+ * single-line classifier wouldn't see them anyway since multi-line action
237
+ * bodies span multiple diagnostic lines and the W1006 line targeting
238
+ * already points at the transition header line.
239
+ */
240
+ function looksLikeStateTransition(code) {
241
+ return new RegExp(`^${ID}` +
242
+ `(?:\\s*\\[[^\\]]*\\])?` + // optional [guard]
243
+ `(?:\\s*/\\s*\\{[^{}]*\\})?` + // optional /{action}
244
+ `\\s*->\\s*${ID}(?:\\.${ID})*\\s*$`).test(code);
245
+ }
246
+ // ── E1502 classifier (filter-body statements) ─────────────────────────────
247
+ const FILTER_STATEMENT_FIRST_TOKENS = new Set([
248
+ "include",
249
+ "includeFilter",
250
+ "namespace",
251
+ ]);
252
+ /**
253
+ * Match exactly one of:
254
+ * include <id>(.<id>)*
255
+ * includeFilter <id>(.<id>)*
256
+ * namespace <id>(.<id>)*
257
+ *
258
+ * Reject anything else under E1502 — the code is broad and covers many
259
+ * filter parse errors that `;` doesn't fix.
260
+ */
261
+ function looksLikeFilterStatement(code) {
262
+ const first = code.split(/\s+/, 1)[0];
263
+ if (!FILTER_STATEMENT_FIRST_TOKENS.has(first))
264
+ return false;
265
+ return new RegExp(`^(?:include|includeFilter|namespace)\\s+${ID}(?:\\s*\\.\\s*${ID})*\\s*$`).test(code);
266
+ }
267
+ /**
268
+ * Find the `filter <name> { ... }` block that contains (or starts at) the
269
+ * given hint line. Returns inclusive body-line bounds, or null if no
270
+ * single filter block can be unambiguously identified.
271
+ */
272
+ function findEnclosingFilterBlock(lines, hintLine) {
273
+ // Locate a filter header at or before the hint line whose `{` opens a
274
+ // block that covers (or comes immediately after) the hint.
275
+ // Walk forward from the start of the hint line, but anchor on the most
276
+ // recent `filter <id> {` header at or before it.
277
+ let headerLine = -1;
278
+ let openCol = -1;
279
+ for (let i = Math.min(hintLine, lines.length - 1); i >= 0; i--) {
280
+ const lineText = lines[i] ?? "";
281
+ const noComment = splitCodeAndComment(lineText).code;
282
+ const m = noComment.match(/\bfilter\s+[A-Za-z_]\w*\s*\{/);
283
+ if (m && m.index !== undefined) {
284
+ headerLine = i;
285
+ openCol = m.index + m[0].length - 1;
286
+ break;
287
+ }
288
+ }
289
+ if (headerLine === -1)
290
+ return null;
291
+ // Now walk forward from the `{` counting braces to find the matching `}`.
292
+ let depth = 0;
293
+ let bodyEnd = -1;
294
+ for (let i = headerLine; i < lines.length; i++) {
295
+ const lineText = lines[i] ?? "";
296
+ const noComment = splitCodeAndComment(lineText).code;
297
+ const startCol = i === headerLine ? openCol : 0;
298
+ for (let j = startCol; j < noComment.length; j++) {
299
+ const c = noComment[j];
300
+ if (c === "{")
301
+ depth++;
302
+ else if (c === "}") {
303
+ depth--;
304
+ if (depth === 0) {
305
+ bodyEnd = i;
306
+ break;
307
+ }
308
+ }
309
+ }
310
+ if (bodyEnd !== -1)
311
+ break;
312
+ }
313
+ if (bodyEnd === -1)
314
+ return null;
315
+ // Body content is the lines between the header `{` and the matching `}`.
316
+ const bodyStart = headerLine + 1;
317
+ if (bodyEnd < bodyStart)
318
+ return null;
319
+ // Confirm the hint line is at the header or inside the block; if it's
320
+ // outside (e.g., diag pointed elsewhere) refuse.
321
+ if (hintLine < headerLine || hintLine > bodyEnd)
322
+ return null;
323
+ return { headerLine, bodyStart, bodyEnd: bodyEnd - 1 };
324
+ }
325
+ // ── Shared helpers ────────────────────────────────────────────────────────
326
+ function isInsideInterfaceBody(lines, diagLine) {
327
+ let depth = 0;
328
+ for (let i = diagLine; i >= 0; i--) {
329
+ const lineText = lines[i] ?? "";
330
+ const noComment = splitCodeAndComment(lineText).code;
331
+ for (let j = noComment.length - 1; j >= 0; j--) {
332
+ const c = noComment[j];
333
+ if (c === "}")
334
+ depth++;
335
+ else if (c === "{") {
336
+ if (depth === 0) {
337
+ const headerHere = noComment.slice(0, j);
338
+ if (/\binterface\b/.test(headerHere))
339
+ return true;
340
+ for (let k = i - 1; k >= Math.max(0, i - 3); k--) {
341
+ const prev = splitCodeAndComment(lines[k] ?? "").code;
342
+ if (/\binterface\b/.test(prev))
343
+ return true;
344
+ if (/\b(class|trait|associationClass|enum|filter|statemachine|req)\b/.test(prev))
345
+ return false;
346
+ }
347
+ return false;
348
+ }
349
+ depth--;
350
+ }
351
+ }
352
+ }
353
+ return false;
354
+ }
355
+ function splitCodeAndComment(lineText) {
356
+ const idx = lineText.indexOf("//");
357
+ if (idx === -1)
358
+ return { code: lineText, comment: "" };
359
+ return { code: lineText.slice(0, idx), comment: lineText.slice(idx) };
360
+ }
361
+ //# sourceMappingURL=codeActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeActions.js","sourceRoot":"","sources":["../src/codeActions.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export interface CompletionInfo {
16
16
  /** Operators the parser expects at this position. */
17
17
  operators: string[];
18
18
  /** Which symbol kinds to offer, or null for none. */
19
- symbolKinds: SymbolKind[] | "suppress" | "use_path" | "own_attribute" | "guard_attribute_method" | "trace_attribute_method" | "trace_state" | "trace_method" | "trace_state_method" | "trace_attribute" | "sorted_attribute" | "trait_sm_op_sm" | "trait_sm_op_state" | "trait_sm_op_state_event" | "trait_sm_op_event" | "top_level" | "class_body" | "trait_body" | "interface_body" | "assoc_class_body" | "mixset_body" | "statemachine_body" | "state_body" | "filter_body" | "transition_target" | "userstory_body" | "usecase_body" | "association_multiplicity" | "association_type" | "association_typed_prefix" | null;
19
+ symbolKinds: SymbolKind[] | "suppress" | "use_path" | "own_attribute" | "guard_attribute_method" | "trace_attribute_method" | "trace_state" | "trace_method" | "trace_state_method" | "trace_attribute" | "trace_event" | "sorted_attribute" | "trait_sm_op_sm" | "trait_sm_op_state" | "trait_sm_op_state_event" | "trait_sm_op_event" | "top_level" | "class_body" | "trait_body" | "interface_body" | "assoc_class_body" | "mixset_body" | "statemachine_body" | "state_body" | "filter_body" | "transition_target" | "userstory_body" | "usecase_body" | "association_multiplicity" | "association_type" | "association_typed_prefix" | "association_arrow" | "isa_typed_prefix" | "decl_type_typed_prefix" | "return_type_typed_prefix" | "code_injection_method" | "filter_include_target" | "param_type_typed_prefix" | "referenced_sm_target" | "trait_sm_binding_target" | "trait_sm_binding_state_target" | null;
20
20
  /** True if cursor is at a definition-name position (suppress all). */
21
21
  isDefinitionName: boolean;
22
22
  /** True if cursor is inside a comment. */
@@ -37,6 +37,14 @@ export interface CompletionInfo {
37
37
  smName?: string;
38
38
  statePath?: string[];
39
39
  };
40
+ /** Topic 055 — SM name when scope is `trait_sm_binding_state_target`. */
41
+ traitSmBindingSmName?: string;
42
+ /**
43
+ * Topic 055 — Path segments AFTER the SM name when scope is
44
+ * `trait_sm_binding_state_target`. Empty for `Sm.|`, `["S1"]` for
45
+ * `Sm.S1.|` / `Sm.S1.I|`, etc.
46
+ */
47
+ traitSmBindingStatePrefix?: string[];
40
48
  }
41
49
  /**
42
50
  * Analyze the completion context at a given position in a parsed tree.