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.
- package/completions.scm +21 -6
- package/definitions.scm +4 -0
- package/out/completionAnalysis.d.ts +44 -0
- package/out/completionAnalysis.js +391 -0
- package/out/completionAnalysis.js.map +1 -0
- package/out/completionBuilder.d.ts +28 -0
- package/out/completionBuilder.js +251 -0
- package/out/completionBuilder.js.map +1 -0
- package/out/documentSymbolBuilder.d.ts +13 -0
- package/out/documentSymbolBuilder.js +95 -0
- package/out/documentSymbolBuilder.js.map +1 -0
- package/out/formatter.d.ts +31 -0
- package/out/formatter.js +96 -0
- package/out/formatter.js.map +1 -0
- package/out/hoverBuilder.d.ts +21 -0
- package/out/hoverBuilder.js +308 -0
- package/out/hoverBuilder.js.map +1 -0
- package/out/importGraph.d.ts +28 -0
- package/out/importGraph.js +91 -0
- package/out/importGraph.js.map +1 -0
- package/out/referenceSearch.d.ts +22 -0
- package/out/referenceSearch.js +271 -0
- package/out/referenceSearch.js.map +1 -0
- package/out/resolver.d.ts +21 -0
- package/out/resolver.js +174 -0
- package/out/resolver.js.map +1 -0
- package/out/server.js +350 -328
- package/out/server.js.map +1 -1
- package/out/symbolIndex.d.ts +86 -94
- package/out/symbolIndex.js +357 -399
- package/out/symbolIndex.js.map +1 -1
- package/out/symbolTypes.d.ts +34 -0
- package/out/symbolTypes.js +9 -0
- package/out/symbolTypes.js.map +1 -0
- package/out/tokenAnalysis.d.ts +24 -0
- package/out/tokenAnalysis.js +195 -0
- package/out/tokenAnalysis.js.map +1 -0
- package/out/tokenTypes.d.ts +46 -0
- package/out/tokenTypes.js +28 -0
- package/out/tokenTypes.js.map +1 -0
- package/out/treeUtils.d.ts +32 -0
- package/out/treeUtils.js +89 -0
- package/out/treeUtils.js.map +1 -0
- package/package.json +4 -2
- package/references.scm +78 -10
- package/tree-sitter-umple.wasm +0 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared completion-item assembly logic.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from server.ts so both the LSP server and the test harness
|
|
6
|
+
* exercise the same production code path.
|
|
7
|
+
*
|
|
8
|
+
* Scope: keyword filtering, operator suppression, built-in types, and
|
|
9
|
+
* symbol-based completions. Does NOT handle use-path file completions,
|
|
10
|
+
* trigger-character gating, or comment/definition-name suppression —
|
|
11
|
+
* those stay in server.ts.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.symbolKindToCompletionKind = symbolKindToCompletionKind;
|
|
15
|
+
exports.buildSemanticCompletionItems = buildSemanticCompletionItems;
|
|
16
|
+
const node_1 = require("vscode-languageserver/node");
|
|
17
|
+
const keywords_1 = require("./keywords");
|
|
18
|
+
const path = require("path");
|
|
19
|
+
// ── Constraint keyword blocklist ────────────────────────────────────────────
|
|
20
|
+
const CONSTRAINT_BLOCKLIST = new Set([
|
|
21
|
+
"ERROR",
|
|
22
|
+
// Top-level definition keywords
|
|
23
|
+
"namespace", "class", "interface", "trait", "abstract",
|
|
24
|
+
"association", "associationClass", "statemachine",
|
|
25
|
+
"enum", "external", "mixset",
|
|
26
|
+
// Generate statement + all targets
|
|
27
|
+
"generate", "Java", "Nothing", "Php", "RTCpp", "SimpleCpp",
|
|
28
|
+
"Ruby", "Python", "Cpp", "Json", "StructureDiagram", "Yuml",
|
|
29
|
+
"Violet", "Umlet", "Simulate", "TextUml", "Scxml",
|
|
30
|
+
"GvStateDiagram", "GvClassDiagram", "GvFeatureDiagram",
|
|
31
|
+
"GvClassTraitDiagram", "GvEntityRelationshipDiagram",
|
|
32
|
+
"Alloy", "NuSMV", "NuSMVOptimizer", "Papyrus", "Ecore", "Xmi",
|
|
33
|
+
"Xtext", "Sql", "StateTables", "EventSequence", "InstanceDiagram",
|
|
34
|
+
"Umple", "UmpleSelf", "USE", "Test", "SimpleMetrics",
|
|
35
|
+
"PlainRequirementsDoc", "Uigu2", "ExternalGrammar", "Mermaid",
|
|
36
|
+
// Other top-level directives
|
|
37
|
+
"use", "strictness",
|
|
38
|
+
// Class-level keywords invalid inside constraints
|
|
39
|
+
"isA", "req", "require", "subfeature", "isFeature",
|
|
40
|
+
"depend", "singleton", "displayColor", "displayColour",
|
|
41
|
+
"implementsReq", "filter", "includeFilter",
|
|
42
|
+
// Trace/SM/attribute keywords that can't appear in expressions
|
|
43
|
+
"trace", "tracecase", "activate", "deactivate",
|
|
44
|
+
"onAllObjects", "onThisThreadOnly", "onThisObject",
|
|
45
|
+
"where", "until", "giving", "record",
|
|
46
|
+
"queued", "pooled", "as",
|
|
47
|
+
"key", "immutable", "unique", "lazy", "settable",
|
|
48
|
+
"internal", "defaulted", "autounique",
|
|
49
|
+
"entry", "exit", "do",
|
|
50
|
+
"emit", "around", "custom", "generated",
|
|
51
|
+
"include", "hops", "super", "sub",
|
|
52
|
+
]);
|
|
53
|
+
// ── Kind → CompletionItemKind mapping ───────────────────────────────────────
|
|
54
|
+
function symbolKindToCompletionKind(kind) {
|
|
55
|
+
switch (kind) {
|
|
56
|
+
case "class":
|
|
57
|
+
return node_1.CompletionItemKind.Class;
|
|
58
|
+
case "interface":
|
|
59
|
+
return node_1.CompletionItemKind.Interface;
|
|
60
|
+
case "trait":
|
|
61
|
+
return node_1.CompletionItemKind.Class;
|
|
62
|
+
case "enum":
|
|
63
|
+
return node_1.CompletionItemKind.Enum;
|
|
64
|
+
case "state":
|
|
65
|
+
return node_1.CompletionItemKind.EnumMember;
|
|
66
|
+
case "statemachine":
|
|
67
|
+
return node_1.CompletionItemKind.Enum;
|
|
68
|
+
case "attribute":
|
|
69
|
+
return node_1.CompletionItemKind.Field;
|
|
70
|
+
case "const":
|
|
71
|
+
return node_1.CompletionItemKind.Constant;
|
|
72
|
+
case "method":
|
|
73
|
+
return node_1.CompletionItemKind.Method;
|
|
74
|
+
case "association":
|
|
75
|
+
return node_1.CompletionItemKind.Reference;
|
|
76
|
+
case "mixset":
|
|
77
|
+
return node_1.CompletionItemKind.Module;
|
|
78
|
+
case "requirement":
|
|
79
|
+
return node_1.CompletionItemKind.Reference;
|
|
80
|
+
case "template":
|
|
81
|
+
return node_1.CompletionItemKind.Property;
|
|
82
|
+
default:
|
|
83
|
+
return node_1.CompletionItemKind.Text;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ── Main builder ────────────────────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Build semantic completion items from a CompletionInfo + SymbolIndex.
|
|
89
|
+
*
|
|
90
|
+
* Handles: keyword filtering, operator suppression, built-in types,
|
|
91
|
+
* own-attribute completion, guard/trace attribute+method completion,
|
|
92
|
+
* and array-based symbol completions.
|
|
93
|
+
*
|
|
94
|
+
* Does NOT handle: use-path file completions, trigger-character gating,
|
|
95
|
+
* dotted-state dot-trigger fast path, or comment/definition-name suppression.
|
|
96
|
+
*
|
|
97
|
+
* @param symbolKinds - the normalized symbolKinds (after use_path → mixset conversion).
|
|
98
|
+
* Caller should not pass "suppress", "use_path", isComment, or isDefinitionName states.
|
|
99
|
+
*/
|
|
100
|
+
function buildSemanticCompletionItems(info, symbolKinds, symbolIndex, reachableFiles) {
|
|
101
|
+
const items = [];
|
|
102
|
+
const seen = new Set();
|
|
103
|
+
// 1. Keywords from LookaheadIterator (filtered in constraint contexts)
|
|
104
|
+
let keywords = info.keywords;
|
|
105
|
+
if (symbolKinds === "own_attribute" ||
|
|
106
|
+
symbolKinds === "guard_attribute_method" ||
|
|
107
|
+
symbolKinds === "trace_attribute_method") {
|
|
108
|
+
keywords = keywords.filter((kw) => !CONSTRAINT_BLOCKLIST.has(kw));
|
|
109
|
+
}
|
|
110
|
+
for (const kw of keywords) {
|
|
111
|
+
if (!seen.has(kw)) {
|
|
112
|
+
seen.add(kw);
|
|
113
|
+
items.push({ label: kw, kind: node_1.CompletionItemKind.Keyword });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// 2. Operators (skip in guard/constraint/trace contexts)
|
|
117
|
+
if (symbolKinds !== "own_attribute" &&
|
|
118
|
+
symbolKinds !== "guard_attribute_method" &&
|
|
119
|
+
symbolKinds !== "trace_attribute_method") {
|
|
120
|
+
for (const op of info.operators) {
|
|
121
|
+
if (!seen.has(op)) {
|
|
122
|
+
seen.add(op);
|
|
123
|
+
items.push({ label: op, kind: node_1.CompletionItemKind.Operator });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// 3. Built-in types (when in type-compatible scope)
|
|
128
|
+
if (Array.isArray(symbolKinds) &&
|
|
129
|
+
symbolKinds.some((k) => ["class", "interface", "trait", "enum"].includes(k))) {
|
|
130
|
+
for (const typ of keywords_1.BUILTIN_TYPES) {
|
|
131
|
+
if (!seen.has(typ)) {
|
|
132
|
+
seen.add(typ);
|
|
133
|
+
items.push({
|
|
134
|
+
label: typ,
|
|
135
|
+
kind: node_1.CompletionItemKind.TypeParameter,
|
|
136
|
+
detail: "type",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// 4. Constraint scope: only own attributes (Umple E28)
|
|
142
|
+
if (symbolKinds === "own_attribute" && info.enclosingClass) {
|
|
143
|
+
const symbols = symbolIndex
|
|
144
|
+
.getSymbols({ container: info.enclosingClass, kind: "attribute" })
|
|
145
|
+
.filter((s) => reachableFiles.has(path.normalize(s.file)));
|
|
146
|
+
for (const sym of symbols) {
|
|
147
|
+
if (!seen.has(sym.name)) {
|
|
148
|
+
seen.add(sym.name);
|
|
149
|
+
items.push({
|
|
150
|
+
label: sym.name,
|
|
151
|
+
kind: symbolKindToCompletionKind("attribute"),
|
|
152
|
+
detail: "attribute",
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return items;
|
|
157
|
+
}
|
|
158
|
+
// 5. Guard/trace scope: attributes + methods from enclosing class (with inheritance)
|
|
159
|
+
if ((symbolKinds === "guard_attribute_method" ||
|
|
160
|
+
symbolKinds === "trace_attribute_method") &&
|
|
161
|
+
info.enclosingClass) {
|
|
162
|
+
for (const kind of ["attribute", "method"]) {
|
|
163
|
+
const symbols = symbolIndex
|
|
164
|
+
.getSymbols({ container: info.enclosingClass, kind, inherited: true })
|
|
165
|
+
.filter((s) => reachableFiles.has(path.normalize(s.file)));
|
|
166
|
+
for (const sym of symbols) {
|
|
167
|
+
if (!seen.has(sym.name)) {
|
|
168
|
+
seen.add(sym.name);
|
|
169
|
+
items.push({
|
|
170
|
+
label: sym.name,
|
|
171
|
+
kind: symbolKindToCompletionKind(kind),
|
|
172
|
+
detail: kind,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return items;
|
|
178
|
+
}
|
|
179
|
+
// 6. Symbol completions from index (scoped to reachable files)
|
|
180
|
+
if (Array.isArray(symbolKinds)) {
|
|
181
|
+
for (const symKind of symbolKinds) {
|
|
182
|
+
let symbols;
|
|
183
|
+
// Scoped lookups for container-aware kinds
|
|
184
|
+
if (symKind === "attribute" && info.enclosingClass) {
|
|
185
|
+
symbols = symbolIndex
|
|
186
|
+
.getSymbols({
|
|
187
|
+
container: info.enclosingClass,
|
|
188
|
+
kind: "attribute",
|
|
189
|
+
inherited: true,
|
|
190
|
+
})
|
|
191
|
+
.filter((s) => reachableFiles.has(path.normalize(s.file)));
|
|
192
|
+
}
|
|
193
|
+
else if (symKind === "state" && info.enclosingStateMachine) {
|
|
194
|
+
if (info.dottedStatePrefix) {
|
|
195
|
+
const childNames = symbolIndex.getChildStateNames(info.dottedStatePrefix, info.enclosingStateMachine, reachableFiles);
|
|
196
|
+
for (const name of childNames) {
|
|
197
|
+
if (!seen.has(name)) {
|
|
198
|
+
seen.add(name);
|
|
199
|
+
items.push({
|
|
200
|
+
label: name,
|
|
201
|
+
kind: symbolKindToCompletionKind("state"),
|
|
202
|
+
detail: "state",
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
symbols = symbolIndex
|
|
209
|
+
.getSymbols({ container: info.enclosingStateMachine, kind: "state" })
|
|
210
|
+
.filter((s) => reachableFiles.has(path.normalize(s.file)));
|
|
211
|
+
}
|
|
212
|
+
else if (symKind === "statemachine" && info.enclosingClass) {
|
|
213
|
+
symbols = symbolIndex
|
|
214
|
+
.getSymbols({ kind: "statemachine" })
|
|
215
|
+
.filter((s) => s.container?.startsWith(info.enclosingClass + ".") &&
|
|
216
|
+
reachableFiles.has(path.normalize(s.file)));
|
|
217
|
+
}
|
|
218
|
+
else if (symKind === "template" && info.enclosingClass) {
|
|
219
|
+
symbols = symbolIndex
|
|
220
|
+
.getSymbols({ container: info.enclosingClass, kind: "template" })
|
|
221
|
+
.filter((s) => reachableFiles.has(path.normalize(s.file)));
|
|
222
|
+
}
|
|
223
|
+
else if (symKind === "method" && info.enclosingClass) {
|
|
224
|
+
symbols = symbolIndex
|
|
225
|
+
.getSymbols({
|
|
226
|
+
container: info.enclosingClass,
|
|
227
|
+
kind: "method",
|
|
228
|
+
inherited: true,
|
|
229
|
+
})
|
|
230
|
+
.filter((s) => reachableFiles.has(path.normalize(s.file)));
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
symbols = symbolIndex
|
|
234
|
+
.getSymbols({ kind: symKind })
|
|
235
|
+
.filter((s) => reachableFiles.has(path.normalize(s.file)));
|
|
236
|
+
}
|
|
237
|
+
for (const sym of symbols) {
|
|
238
|
+
if (!seen.has(sym.name)) {
|
|
239
|
+
seen.add(sym.name);
|
|
240
|
+
items.push({
|
|
241
|
+
label: sym.name,
|
|
242
|
+
kind: symbolKindToCompletionKind(symKind),
|
|
243
|
+
detail: symKind,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return items;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=completionBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completionBuilder.js","sourceRoot":"","sources":["../src/completionBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document symbol (outline) builder.
|
|
3
|
+
*
|
|
4
|
+
* Converts flat SymbolEntry[] into hierarchical DocumentSymbol[] tree
|
|
5
|
+
* using definition range containment. No LSP connection dependency.
|
|
6
|
+
*/
|
|
7
|
+
import { DocumentSymbol } from "vscode-languageserver/node";
|
|
8
|
+
import type { SymbolEntry } from "./symbolTypes";
|
|
9
|
+
/**
|
|
10
|
+
* Convert a flat list of SymbolEntry[] (single file) into a hierarchical
|
|
11
|
+
* DocumentSymbol[] tree using range containment.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildDocumentSymbolTree(symbols: SymbolEntry[]): DocumentSymbol[];
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Document symbol (outline) builder.
|
|
4
|
+
*
|
|
5
|
+
* Converts flat SymbolEntry[] into hierarchical DocumentSymbol[] tree
|
|
6
|
+
* using definition range containment. No LSP connection dependency.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.buildDocumentSymbolTree = buildDocumentSymbolTree;
|
|
10
|
+
const node_1 = require("vscode-languageserver/node");
|
|
11
|
+
function umpleKindToLspSymbolKind(kind) {
|
|
12
|
+
switch (kind) {
|
|
13
|
+
case "class":
|
|
14
|
+
return node_1.SymbolKind.Class;
|
|
15
|
+
case "interface":
|
|
16
|
+
return node_1.SymbolKind.Interface;
|
|
17
|
+
case "trait":
|
|
18
|
+
return node_1.SymbolKind.Interface;
|
|
19
|
+
case "enum":
|
|
20
|
+
return node_1.SymbolKind.Enum;
|
|
21
|
+
case "enum_value":
|
|
22
|
+
return node_1.SymbolKind.EnumMember;
|
|
23
|
+
case "attribute":
|
|
24
|
+
return node_1.SymbolKind.Field;
|
|
25
|
+
case "const":
|
|
26
|
+
return node_1.SymbolKind.Constant;
|
|
27
|
+
case "method":
|
|
28
|
+
return node_1.SymbolKind.Method;
|
|
29
|
+
case "template":
|
|
30
|
+
return node_1.SymbolKind.Field;
|
|
31
|
+
case "statemachine":
|
|
32
|
+
return node_1.SymbolKind.Struct;
|
|
33
|
+
case "state":
|
|
34
|
+
return node_1.SymbolKind.EnumMember;
|
|
35
|
+
case "association":
|
|
36
|
+
return node_1.SymbolKind.Property;
|
|
37
|
+
case "mixset":
|
|
38
|
+
return node_1.SymbolKind.Module;
|
|
39
|
+
case "requirement":
|
|
40
|
+
return node_1.SymbolKind.String;
|
|
41
|
+
default:
|
|
42
|
+
return node_1.SymbolKind.Variable;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Check if outer's definition range strictly contains inner's. */
|
|
46
|
+
function defRangeContains(outer, inner) {
|
|
47
|
+
const os = outer.defLine * 1e6 + outer.defColumn;
|
|
48
|
+
const oe = outer.defEndLine * 1e6 + outer.defEndColumn;
|
|
49
|
+
const is_ = inner.defLine * 1e6 + inner.defColumn;
|
|
50
|
+
const ie = inner.defEndLine * 1e6 + inner.defEndColumn;
|
|
51
|
+
return os <= is_ && oe >= ie && (os < is_ || oe > ie);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Convert a flat list of SymbolEntry[] (single file) into a hierarchical
|
|
55
|
+
* DocumentSymbol[] tree using range containment.
|
|
56
|
+
*/
|
|
57
|
+
function buildDocumentSymbolTree(symbols) {
|
|
58
|
+
const entries = symbols.filter((s) => s.defLine !== undefined && s.defEndLine !== undefined);
|
|
59
|
+
// Sort by body range start, then largest first (parents before children)
|
|
60
|
+
entries.sort((a, b) => {
|
|
61
|
+
const lineDiff = a.defLine - b.defLine;
|
|
62
|
+
if (lineDiff !== 0)
|
|
63
|
+
return lineDiff;
|
|
64
|
+
const colDiff = a.defColumn - b.defColumn;
|
|
65
|
+
if (colDiff !== 0)
|
|
66
|
+
return colDiff;
|
|
67
|
+
// Same start: larger range first
|
|
68
|
+
const aEnd = a.defEndLine * 1e6 + a.defEndColumn;
|
|
69
|
+
const bEnd = b.defEndLine * 1e6 + b.defEndColumn;
|
|
70
|
+
return bEnd - aEnd;
|
|
71
|
+
});
|
|
72
|
+
const roots = [];
|
|
73
|
+
const stack = [];
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
const docSym = node_1.DocumentSymbol.create(entry.name, entry.kind, umpleKindToLspSymbolKind(entry.kind), node_1.Range.create(node_1.Position.create(entry.defLine, entry.defColumn), node_1.Position.create(entry.defEndLine, entry.defEndColumn)), node_1.Range.create(node_1.Position.create(entry.line, entry.column), node_1.Position.create(entry.endLine, entry.endColumn)));
|
|
76
|
+
// Pop stack until we find a parent that contains this entry
|
|
77
|
+
while (stack.length > 0) {
|
|
78
|
+
if (defRangeContains(stack[stack.length - 1].entry, entry))
|
|
79
|
+
break;
|
|
80
|
+
stack.pop();
|
|
81
|
+
}
|
|
82
|
+
if (stack.length === 0) {
|
|
83
|
+
roots.push(docSym);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const parent = stack[stack.length - 1].sym;
|
|
87
|
+
if (!parent.children)
|
|
88
|
+
parent.children = [];
|
|
89
|
+
parent.children.push(docSym);
|
|
90
|
+
}
|
|
91
|
+
stack.push({ sym: docSym, entry });
|
|
92
|
+
}
|
|
93
|
+
return roots;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=documentSymbolBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentSymbolBuilder.js","sourceRoot":"","sources":["../src/documentSymbolBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document formatting logic.
|
|
3
|
+
*
|
|
4
|
+
* Pure text manipulation + tree walking for skip-range detection.
|
|
5
|
+
* No dependency on LSP connection, documents, or SymbolIndex class.
|
|
6
|
+
*/
|
|
7
|
+
import { TextEdit } from "vscode-languageserver/node";
|
|
8
|
+
/**
|
|
9
|
+
* Collect line ranges of code_content and template_body nodes (embedded code
|
|
10
|
+
* that the formatter should not re-indent).
|
|
11
|
+
*
|
|
12
|
+
* @param tree Pre-parsed tree (caller handles tree acquisition)
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCodeContentRanges(tree: any): {
|
|
15
|
+
startLine: number;
|
|
16
|
+
endLine: number;
|
|
17
|
+
}[];
|
|
18
|
+
/**
|
|
19
|
+
* Compute indent edits for an Umple document.
|
|
20
|
+
*
|
|
21
|
+
* @param text Document text
|
|
22
|
+
* @param options Formatting options (tabSize, insertSpaces)
|
|
23
|
+
* @param skipRanges Ranges to skip (embedded code content)
|
|
24
|
+
*/
|
|
25
|
+
export declare function computeIndentEdits(text: string, options: {
|
|
26
|
+
tabSize: number;
|
|
27
|
+
insertSpaces: boolean;
|
|
28
|
+
}, skipRanges: {
|
|
29
|
+
startLine: number;
|
|
30
|
+
endLine: number;
|
|
31
|
+
}[]): TextEdit[];
|
package/out/formatter.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Document formatting logic.
|
|
4
|
+
*
|
|
5
|
+
* Pure text manipulation + tree walking for skip-range detection.
|
|
6
|
+
* No dependency on LSP connection, documents, or SymbolIndex class.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getCodeContentRanges = getCodeContentRanges;
|
|
10
|
+
exports.computeIndentEdits = computeIndentEdits;
|
|
11
|
+
const node_1 = require("vscode-languageserver/node");
|
|
12
|
+
/**
|
|
13
|
+
* Collect line ranges of code_content and template_body nodes (embedded code
|
|
14
|
+
* that the formatter should not re-indent).
|
|
15
|
+
*
|
|
16
|
+
* @param tree Pre-parsed tree (caller handles tree acquisition)
|
|
17
|
+
*/
|
|
18
|
+
function getCodeContentRanges(tree) {
|
|
19
|
+
const ranges = [];
|
|
20
|
+
const cursor = tree.rootNode.walk();
|
|
21
|
+
let reachedEnd = false;
|
|
22
|
+
while (!reachedEnd) {
|
|
23
|
+
const node = cursor.currentNode;
|
|
24
|
+
if (node.type === "code_content" || node.type === "template_body") {
|
|
25
|
+
ranges.push({
|
|
26
|
+
startLine: node.startPosition.row,
|
|
27
|
+
endLine: node.endPosition.row,
|
|
28
|
+
});
|
|
29
|
+
if (!cursor.gotoNextSibling()) {
|
|
30
|
+
while (!cursor.gotoNextSibling()) {
|
|
31
|
+
if (!cursor.gotoParent()) {
|
|
32
|
+
reachedEnd = true;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (!cursor.gotoFirstChild()) {
|
|
39
|
+
if (!cursor.gotoNextSibling()) {
|
|
40
|
+
while (!cursor.gotoNextSibling()) {
|
|
41
|
+
if (!cursor.gotoParent()) {
|
|
42
|
+
reachedEnd = true;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return ranges;
|
|
50
|
+
}
|
|
51
|
+
function isInSkipRange(line, ranges) {
|
|
52
|
+
return ranges.some((r) => line > r.startLine && line < r.endLine);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Compute indent edits for an Umple document.
|
|
56
|
+
*
|
|
57
|
+
* @param text Document text
|
|
58
|
+
* @param options Formatting options (tabSize, insertSpaces)
|
|
59
|
+
* @param skipRanges Ranges to skip (embedded code content)
|
|
60
|
+
*/
|
|
61
|
+
function computeIndentEdits(text, options, skipRanges) {
|
|
62
|
+
const lines = text.split("\n");
|
|
63
|
+
const edits = [];
|
|
64
|
+
const unit = options.insertSpaces ? " ".repeat(options.tabSize) : "\t";
|
|
65
|
+
let depth = 0;
|
|
66
|
+
for (let i = 0; i < lines.length; i++) {
|
|
67
|
+
const line = lines[i];
|
|
68
|
+
const trimmed = line.trim();
|
|
69
|
+
if (!trimmed || isInSkipRange(i, skipRanges))
|
|
70
|
+
continue;
|
|
71
|
+
let leadingCloses = 0;
|
|
72
|
+
for (const ch of trimmed) {
|
|
73
|
+
if (ch === "}")
|
|
74
|
+
leadingCloses++;
|
|
75
|
+
else
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
depth = Math.max(0, depth - leadingCloses);
|
|
79
|
+
const expected = unit.repeat(depth);
|
|
80
|
+
const currentIndent = line.substring(0, line.length - line.trimStart().length);
|
|
81
|
+
if (currentIndent !== expected) {
|
|
82
|
+
edits.push(node_1.TextEdit.replace(node_1.Range.create(node_1.Position.create(i, 0), node_1.Position.create(i, currentIndent.length)), expected));
|
|
83
|
+
}
|
|
84
|
+
let opens = 0;
|
|
85
|
+
let closes = 0;
|
|
86
|
+
for (const ch of trimmed) {
|
|
87
|
+
if (ch === "{")
|
|
88
|
+
opens++;
|
|
89
|
+
else if (ch === "}")
|
|
90
|
+
closes++;
|
|
91
|
+
}
|
|
92
|
+
depth = Math.max(0, depth + opens - (closes - leadingCloses));
|
|
93
|
+
}
|
|
94
|
+
return edits;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover content builder.
|
|
3
|
+
*
|
|
4
|
+
* Produces markdown hover strings from SymbolEntry data + tree access.
|
|
5
|
+
* No dependency on LSP connection, documents, or SymbolIndex class.
|
|
6
|
+
*/
|
|
7
|
+
import type { SymbolEntry } from "./symbolTypes";
|
|
8
|
+
/** Callbacks for accessing index data without depending on SymbolIndex class. */
|
|
9
|
+
export interface HoverContext {
|
|
10
|
+
getTree: (filePath: string) => /* Tree */ any | null;
|
|
11
|
+
getIsAParents: (className: string) => string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Build markdown hover content for a resolved symbol.
|
|
15
|
+
*
|
|
16
|
+
* @param sym The primary resolved symbol
|
|
17
|
+
* @param allSymbols Full match list (for merging split definitions)
|
|
18
|
+
* @param hoverCtx Callbacks for tree access and isA parents
|
|
19
|
+
* @returns Markdown string, or null if no definition node found
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildHoverMarkdown(sym: SymbolEntry, allSymbols: SymbolEntry[], hoverCtx: HoverContext): string | null;
|