umple-lsp-server 0.2.0 → 0.2.2

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 (46) hide show
  1. package/completions.scm +21 -6
  2. package/definitions.scm +4 -0
  3. package/out/completionAnalysis.d.ts +44 -0
  4. package/out/completionAnalysis.js +391 -0
  5. package/out/completionAnalysis.js.map +1 -0
  6. package/out/completionBuilder.d.ts +28 -0
  7. package/out/completionBuilder.js +251 -0
  8. package/out/completionBuilder.js.map +1 -0
  9. package/out/documentSymbolBuilder.d.ts +13 -0
  10. package/out/documentSymbolBuilder.js +95 -0
  11. package/out/documentSymbolBuilder.js.map +1 -0
  12. package/out/formatter.d.ts +31 -0
  13. package/out/formatter.js +96 -0
  14. package/out/formatter.js.map +1 -0
  15. package/out/hoverBuilder.d.ts +21 -0
  16. package/out/hoverBuilder.js +308 -0
  17. package/out/hoverBuilder.js.map +1 -0
  18. package/out/importGraph.d.ts +28 -0
  19. package/out/importGraph.js +91 -0
  20. package/out/importGraph.js.map +1 -0
  21. package/out/referenceSearch.d.ts +22 -0
  22. package/out/referenceSearch.js +271 -0
  23. package/out/referenceSearch.js.map +1 -0
  24. package/out/resolver.d.ts +21 -0
  25. package/out/resolver.js +174 -0
  26. package/out/resolver.js.map +1 -0
  27. package/out/server.js +350 -328
  28. package/out/server.js.map +1 -1
  29. package/out/symbolIndex.d.ts +86 -94
  30. package/out/symbolIndex.js +357 -399
  31. package/out/symbolIndex.js.map +1 -1
  32. package/out/symbolTypes.d.ts +34 -0
  33. package/out/symbolTypes.js +9 -0
  34. package/out/symbolTypes.js.map +1 -0
  35. package/out/tokenAnalysis.d.ts +24 -0
  36. package/out/tokenAnalysis.js +195 -0
  37. package/out/tokenAnalysis.js.map +1 -0
  38. package/out/tokenTypes.d.ts +46 -0
  39. package/out/tokenTypes.js +28 -0
  40. package/out/tokenTypes.js.map +1 -0
  41. package/out/treeUtils.d.ts +32 -0
  42. package/out/treeUtils.js +89 -0
  43. package/out/treeUtils.js.map +1 -0
  44. package/package.json +4 -2
  45. package/references.scm +78 -10
  46. package/tree-sitter-umple.wasm +0 -0
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ /**
3
+ * Reference search logic.
4
+ *
5
+ * Finds all references to a symbol across indexed files using
6
+ * references.scm query captures and semantic filtering.
7
+ * No dependency on SymbolIndex class.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.searchReferences = searchReferences;
11
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
12
+ const TreeSitter = require("web-tree-sitter");
13
+ const tokenTypes_1 = require("./tokenTypes");
14
+ const treeUtils_1 = require("./treeUtils");
15
+ /**
16
+ * Find all references to a symbol across the given files.
17
+ *
18
+ * @param declarations Target symbol declaration(s)
19
+ * @param includeDeclaration Whether to include declaration sites in results
20
+ * @param referencesQuery Loaded references.scm query
21
+ * @param fileTreeMap filePath → cached parse tree (only files to search)
22
+ * @param isAGraph className → parent class names (for inheritance checks)
23
+ */
24
+ function searchReferences(declarations, includeDeclaration, referencesQuery, fileTreeMap, isAGraph) {
25
+ if (declarations.length === 0)
26
+ return [];
27
+ const sym = declarations[0];
28
+ const symName = sym.name;
29
+ const symKind = sym.kind;
30
+ const symContainer = sym.container;
31
+ // Collect definition positions for deduplication and includeDeclaration
32
+ const defPositions = new Set();
33
+ for (const d of declarations) {
34
+ defPositions.add(`${d.file}:${d.line}:${d.column}:${d.endLine}:${d.endColumn}`);
35
+ }
36
+ // Container-scoped kinds need enclosing scope verification
37
+ const containerScopedKinds = new Set([
38
+ "attribute", "const", "method", "template", "state", "statemachine", "tracecase",
39
+ ]);
40
+ const isContainerScoped = containerScopedKinds.has(symKind);
41
+ const results = [];
42
+ const seen = new Set();
43
+ const addResult = (file, line, column, endLine, endColumn) => {
44
+ const key = `${file}:${line}:${column}:${endLine}:${endColumn}`;
45
+ if (seen.has(key))
46
+ return;
47
+ if (!includeDeclaration && defPositions.has(key))
48
+ return;
49
+ seen.add(key);
50
+ results.push({ file, line, column, endLine, endColumn });
51
+ };
52
+ // If includeDeclaration, add all definition sites first
53
+ if (includeDeclaration) {
54
+ for (const d of declarations) {
55
+ addResult(d.file, d.line, d.column, d.endLine, d.endColumn);
56
+ }
57
+ }
58
+ // Scan each file
59
+ for (const [filePath, tree] of fileTreeMap) {
60
+ const captures = referencesQuery.captures(tree.rootNode);
61
+ for (const capture of captures) {
62
+ const node = capture.node;
63
+ if (node.text !== symName)
64
+ continue;
65
+ // Parse capture name to get reference kinds
66
+ const refKinds = parseCaptureKinds(capture.name);
67
+ if (!refKinds || !refKinds.includes(symKind))
68
+ continue;
69
+ // For container-scoped kinds, verify enclosing scope matches
70
+ if (isContainerScoped && symContainer) {
71
+ const enclosing = resolveEnclosingScopeFromNode(node, symKind);
72
+ if (enclosing && enclosing !== symContainer) {
73
+ if (symKind === "state" || symKind === "statemachine") {
74
+ continue;
75
+ }
76
+ const containerClass = symContainer;
77
+ if (!isInheritanceChain(enclosing, containerClass, isAGraph)) {
78
+ continue;
79
+ }
80
+ }
81
+ }
82
+ // For trait_sm_binding value paths, filter by segment position and depth
83
+ const valSegIdx = getTraitSmBindingValueSegmentIndex(node);
84
+ if (valSegIdx !== undefined) {
85
+ if (valSegIdx === 0 && symKind !== "statemachine")
86
+ continue;
87
+ if (valSegIdx > 0 && symKind !== "state")
88
+ continue;
89
+ if (symKind === "state" && sym.statePath &&
90
+ valSegIdx !== sym.statePath.length)
91
+ continue;
92
+ }
93
+ // For nested states, disambiguate by path context
94
+ if (symKind === "state" && sym.statePath && sym.statePath.length >= 1) {
95
+ const pathCtx = extractPathContextFromNode(node);
96
+ if (pathCtx) {
97
+ let preceding = pathCtx.preceding;
98
+ if (node.parent?.parent?.type === "trait_sm_binding" &&
99
+ node.parent?.parent?.childForFieldName("value")?.id ===
100
+ node.parent?.id) {
101
+ preceding = preceding.slice(1);
102
+ }
103
+ const targetPrecedingPath = sym.statePath.slice(0, sym.statePath.length - 1);
104
+ if (!pathMatches(preceding, targetPrecedingPath, true)) {
105
+ continue;
106
+ }
107
+ }
108
+ else if (node.parent?.type === "state") {
109
+ const candidatePath = (0, treeUtils_1.resolveStatePath)(node);
110
+ if (!pathMatches(candidatePath, sym.statePath, false)) {
111
+ continue;
112
+ }
113
+ }
114
+ }
115
+ addResult(filePath, node.startPosition.row, node.startPosition.column, node.endPosition.row, node.endPosition.column);
116
+ }
117
+ }
118
+ return results;
119
+ }
120
+ // ── Private helpers ─────────────────────────────────────────────────────────
121
+ function parseCaptureKinds(captureName) {
122
+ const prefix = "reference.";
123
+ if (!captureName.startsWith(prefix))
124
+ return null;
125
+ let rest = captureName.substring(prefix.length);
126
+ const kinds = [];
127
+ while (rest.length > 0) {
128
+ const match = tokenTypes_1.SYMBOL_KINDS_LONGEST_FIRST.find((k) => rest.startsWith(k));
129
+ if (!match)
130
+ break;
131
+ kinds.push(match);
132
+ rest = rest.substring(match.length);
133
+ if (rest.startsWith("_"))
134
+ rest = rest.substring(1);
135
+ }
136
+ return kinds.length > 0 ? kinds : null;
137
+ }
138
+ function resolveEnclosingScopeFromNode(node, targetKind) {
139
+ let current = node.parent;
140
+ let enclosingClass;
141
+ let enclosingSM;
142
+ while (current) {
143
+ if (current.type === "state_machine" || current.type === "statemachine_definition") {
144
+ enclosingSM = current.childForFieldName("name")?.text ?? enclosingSM;
145
+ }
146
+ if (!enclosingClass &&
147
+ ["class_definition", "trait_definition", "interface_definition", "association_class_definition"].includes(current.type)) {
148
+ enclosingClass = current.childForFieldName("name")?.text;
149
+ }
150
+ current = current.parent;
151
+ }
152
+ if (targetKind === "state" || targetKind === "statemachine") {
153
+ if (enclosingClass && enclosingSM)
154
+ return `${enclosingClass}.${enclosingSM}`;
155
+ if (enclosingSM)
156
+ return enclosingSM;
157
+ if (enclosingClass) {
158
+ const smName = resolveTraitSmBindingValueSM(node);
159
+ if (smName)
160
+ return `${enclosingClass}.${smName}`;
161
+ const refSmName = resolveReferencedSmDefinition(node);
162
+ if (refSmName)
163
+ return `${enclosingClass}.${refSmName}`;
164
+ }
165
+ return undefined;
166
+ }
167
+ if (!enclosingClass && targetKind === "method") {
168
+ const parent = node.parent;
169
+ if (parent?.type === "toplevel_code_injection" &&
170
+ parent.childForFieldName("operation")?.id === node.id) {
171
+ const targetNode = parent.childForFieldName("target");
172
+ if (targetNode)
173
+ return targetNode.text;
174
+ }
175
+ }
176
+ return enclosingClass;
177
+ }
178
+ function resolveTraitSmBindingValueSM(node) {
179
+ const parent = node.parent;
180
+ if (parent?.type !== "qualified_name")
181
+ return undefined;
182
+ const grandparent = parent.parent;
183
+ if (grandparent?.type !== "trait_sm_binding")
184
+ return undefined;
185
+ if (grandparent.childForFieldName("value")?.id !== parent.id)
186
+ return undefined;
187
+ const firstId = parent.namedChild(0);
188
+ return firstId?.type === "identifier" ? firstId.text : undefined;
189
+ }
190
+ function resolveReferencedSmDefinition(node) {
191
+ const parent = node.parent;
192
+ if (parent?.type !== "referenced_statemachine")
193
+ return undefined;
194
+ if (parent.childForFieldName("definition")?.id !== node.id)
195
+ return undefined;
196
+ return node.text;
197
+ }
198
+ function getTraitSmBindingValueSegmentIndex(node) {
199
+ const parent = node.parent;
200
+ if (parent?.type !== "qualified_name")
201
+ return undefined;
202
+ const grandparent = parent.parent;
203
+ if (grandparent?.type !== "trait_sm_binding")
204
+ return undefined;
205
+ if (grandparent.childForFieldName("value")?.id !== parent.id)
206
+ return undefined;
207
+ let idx = 0;
208
+ for (let i = 0; i < parent.namedChildCount; i++) {
209
+ const child = parent.namedChild(i);
210
+ if (child?.type === "identifier") {
211
+ if (child.id === node.id)
212
+ return idx;
213
+ idx++;
214
+ }
215
+ }
216
+ return undefined;
217
+ }
218
+ function isInheritanceChain(childClass, parentClass, isAGraph) {
219
+ const visited = new Set();
220
+ const queue = [childClass];
221
+ while (queue.length > 0) {
222
+ const cls = queue.pop();
223
+ if (cls === parentClass)
224
+ return true;
225
+ if (visited.has(cls))
226
+ continue;
227
+ visited.add(cls);
228
+ const parents = isAGraph.get(cls);
229
+ if (parents)
230
+ queue.push(...parents);
231
+ }
232
+ return false;
233
+ }
234
+ function extractPathContextFromNode(node) {
235
+ const parent = node.parent;
236
+ if (!parent || parent.type !== "qualified_name")
237
+ return null;
238
+ const segments = [];
239
+ let nodeIndex = -1;
240
+ for (let i = 0; i < parent.namedChildCount; i++) {
241
+ const child = parent.namedChild(i);
242
+ if (child?.type === "identifier") {
243
+ if (child.id === node.id)
244
+ nodeIndex = segments.length;
245
+ segments.push(child.text);
246
+ }
247
+ }
248
+ if (nodeIndex <= 0)
249
+ return null;
250
+ return { preceding: segments.slice(0, nodeIndex) };
251
+ }
252
+ function pathMatches(actual, target, suffix) {
253
+ if (suffix) {
254
+ if (actual.length > target.length)
255
+ return false;
256
+ const offset = target.length - actual.length;
257
+ for (let i = 0; i < actual.length; i++) {
258
+ if (actual[i] !== target[offset + i])
259
+ return false;
260
+ }
261
+ return true;
262
+ }
263
+ if (actual.length !== target.length)
264
+ return false;
265
+ for (let i = 0; i < actual.length; i++) {
266
+ if (actual[i] !== target[i])
267
+ return false;
268
+ }
269
+ return true;
270
+ }
271
+ //# sourceMappingURL=referenceSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referenceSearch.js","sourceRoot":"","sources":["../src/referenceSearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared symbol resolution logic.
3
+ *
4
+ * Used by go-to-definition, hover, rename, and the semantic test harness.
5
+ * Extracted from server.ts to ensure tests exercise the real production path.
6
+ *
7
+ * Phase 2: Uses the discriminated LookupContext model for primary resolution
8
+ * and orthogonal DottedStateRef/StateDefinitionRef for post-lookup disambiguation.
9
+ */
10
+ import { SymbolIndex, SymbolEntry } from "./symbolIndex";
11
+ /** The token info returned by getTokenAtPosition, minus null. */
12
+ export type TokenResult = NonNullable<ReturnType<SymbolIndex["getTokenAtPosition"]>>;
13
+ /**
14
+ * Resolve symbol(s) at a given position. Returns the token info plus
15
+ * matching SymbolEntry[] filtered to reachable files, or null if no
16
+ * identifier is found at the position.
17
+ */
18
+ export declare function resolveSymbolAtPosition(si: SymbolIndex, docPath: string, content: string, line: number, col: number, reachableFiles: Set<string>): {
19
+ token: TokenResult;
20
+ symbols: SymbolEntry[];
21
+ } | null;
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Shared symbol resolution logic.
4
+ *
5
+ * Used by go-to-definition, hover, rename, and the semantic test harness.
6
+ * Extracted from server.ts to ensure tests exercise the real production path.
7
+ *
8
+ * Phase 2: Uses the discriminated LookupContext model for primary resolution
9
+ * and orthogonal DottedStateRef/StateDefinitionRef for post-lookup disambiguation.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.resolveSymbolAtPosition = resolveSymbolAtPosition;
13
+ const path = require("path");
14
+ /**
15
+ * Resolve symbol(s) at a given position. Returns the token info plus
16
+ * matching SymbolEntry[] filtered to reachable files, or null if no
17
+ * identifier is found at the position.
18
+ */
19
+ function resolveSymbolAtPosition(si, docPath, content, line, col, reachableFiles) {
20
+ const token = si.getTokenAtPosition(docPath, content, line, col);
21
+ if (!token)
22
+ return null;
23
+ // If references.scm didn't match any pattern, there's no valid target
24
+ if (!token.kinds)
25
+ return { token, symbols: [] };
26
+ const containerKinds = new Set([
27
+ "attribute",
28
+ "const",
29
+ "method",
30
+ "template",
31
+ "state",
32
+ "statemachine",
33
+ "tracecase",
34
+ ]);
35
+ const isScoped = token.kinds.some((k) => containerKinds.has(k));
36
+ let container;
37
+ if (isScoped) {
38
+ container = token.kinds.some((k) => k === "state" || k === "statemachine")
39
+ ? token.enclosingStateMachine
40
+ : token.enclosingClass;
41
+ }
42
+ // ── Primary lookup: switch on context type ──────────────────────────────
43
+ let symbols = [];
44
+ switch (token.context.type) {
45
+ case "trait_sm_param": {
46
+ // trait_sm_binding param (e.g., sm1 in isA T1<sm1 as sm.s2>).
47
+ // The SM lives in the trait's scope, not the current class.
48
+ const smContainer = `${token.context.traitName}.${token.word}`;
49
+ symbols = si
50
+ .getSymbols({
51
+ name: token.word,
52
+ kind: ["statemachine"],
53
+ container: smContainer,
54
+ })
55
+ .filter((s) => reachableFiles.has(path.normalize(s.file)));
56
+ break;
57
+ }
58
+ case "trait_sm_value": {
59
+ // trait_sm_binding value (e.g., sm.s2 in isA T1<sm1 as sm.s2>).
60
+ // First segment = statemachine in current class, later = states in that SM.
61
+ const { pathSegments, segmentIndex } = token.context;
62
+ const smName = pathSegments[0];
63
+ const smContainer = `${token.enclosingClass}.${smName}`;
64
+ if (segmentIndex === 0) {
65
+ symbols = si
66
+ .getSymbols({
67
+ name: smName,
68
+ kind: ["statemachine"],
69
+ container: smContainer,
70
+ })
71
+ .filter((s) => reachableFiles.has(path.normalize(s.file)));
72
+ }
73
+ else {
74
+ symbols = si
75
+ .getSymbols({
76
+ name: token.word,
77
+ kind: ["state"],
78
+ container: smContainer,
79
+ })
80
+ .filter((s) => reachableFiles.has(path.normalize(s.file)));
81
+ // Disambiguate by direct-child depth (compiler uses direct-child-per-segment)
82
+ const precedingStatePath = pathSegments.slice(1, segmentIndex);
83
+ if (precedingStatePath.length === 0) {
84
+ // Direct child of SM root: require statePath.length === 1
85
+ symbols = symbols.filter((s) => !s.statePath || s.statePath.length === 1);
86
+ }
87
+ else if (symbols.length > 1) {
88
+ const resolved = si.resolveStateInPath(precedingStatePath, token.word, smContainer, reachableFiles);
89
+ if (resolved)
90
+ symbols = [resolved];
91
+ }
92
+ }
93
+ break;
94
+ }
95
+ case "referenced_sm": {
96
+ // referenced_statemachine: "door as status" — SM lives in the enclosing class.
97
+ // Container is "ClassName.smName" (self-qualified SM container format).
98
+ const className = token.enclosingClass;
99
+ const smContainer = `${className}.${token.word}`;
100
+ symbols = si
101
+ .getSymbols({
102
+ name: token.word,
103
+ kind: ["statemachine"],
104
+ container: smContainer,
105
+ })
106
+ .filter((s) => reachableFiles.has(path.normalize(s.file)));
107
+ break;
108
+ }
109
+ case "toplevel_injection": {
110
+ // toplevel_code_injection: "before { Counter } increment()"
111
+ // Resolve operation name against the target class's own methods only.
112
+ // The Umple compiler does not resolve inherited methods here (W1012).
113
+ symbols = si
114
+ .getSymbols({
115
+ name: token.word,
116
+ kind: ["method"],
117
+ container: token.context.targetClass,
118
+ })
119
+ .filter((s) => reachableFiles.has(path.normalize(s.file)));
120
+ break;
121
+ }
122
+ case "default_value_qualifier":
123
+ case "normal": {
124
+ // Split kinds into scoped (class/SM-local) and unscoped (global).
125
+ // Try scoped first; only fall through to unscoped if scoped finds nothing.
126
+ // Scoped kinds never go global — preserves cross-class isolation.
127
+ const scopedKinds = token.kinds.filter((k) => containerKinds.has(k));
128
+ const unscopedKinds = token.kinds.filter((k) => !containerKinds.has(k));
129
+ if (scopedKinds.length > 0 && container) {
130
+ symbols = si
131
+ .getSymbols({
132
+ name: token.word,
133
+ kind: scopedKinds,
134
+ container,
135
+ inherited: true,
136
+ })
137
+ .filter((s) => reachableFiles.has(path.normalize(s.file)));
138
+ }
139
+ if (symbols.length === 0 && unscopedKinds.length > 0) {
140
+ symbols = si
141
+ .getSymbols({ name: token.word, kind: unscopedKinds })
142
+ .filter((s) => reachableFiles.has(path.normalize(s.file)));
143
+ }
144
+ break;
145
+ }
146
+ }
147
+ // ── Post-lookup disambiguation (orthogonal to context type) ─────────────
148
+ // Dotted state paths (e.g., EEE.Open.Inner → only Inner inside Open)
149
+ if (token.dottedStateRef &&
150
+ token.dottedStateRef.pathIndex > 0 &&
151
+ symbols.length > 1 &&
152
+ token.enclosingStateMachine) {
153
+ const precedingPath = token.dottedStateRef.qualifiedPath.slice(0, token.dottedStateRef.pathIndex);
154
+ const resolved = si.resolveStateInPath(precedingPath, token.word, token.enclosingStateMachine, reachableFiles);
155
+ if (resolved) {
156
+ symbols = [resolved];
157
+ }
158
+ }
159
+ // State definition sites (e.g., cursor on Inner in `Inner {}` inside EEE.Open)
160
+ if (token.stateDefinitionRef &&
161
+ token.kinds?.includes("state") &&
162
+ symbols.length > 1) {
163
+ const defPath = token.stateDefinitionRef.definitionPath;
164
+ const narrowed = symbols.filter((s) => s.kind === "state" &&
165
+ s.statePath &&
166
+ s.statePath.length === defPath.length &&
167
+ s.statePath.every((seg, i) => seg === defPath[i]));
168
+ if (narrowed.length > 0) {
169
+ symbols = narrowed;
170
+ }
171
+ }
172
+ return { token, symbols };
173
+ }
174
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}