@likec4/language-server 1.1.1 → 1.2.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.
- package/contrib/likec4.monarch.ts +4 -4
- package/contrib/likec4.tmLanguage.json +1 -1
- package/package.json +8 -10
- package/src/Rpc.ts +108 -0
- package/src/ast.ts +443 -0
- package/src/browser/index.ts +30 -0
- package/src/elementRef.ts +26 -0
- package/src/generated/ast.ts +1632 -0
- package/src/generated/grammar.ts +10 -0
- package/src/generated/module.ts +32 -0
- package/src/index.ts +4 -0
- package/src/like-c4.langium +395 -0
- package/src/logger.ts +54 -0
- package/src/lsp/CodeLensProvider.ts +51 -0
- package/src/lsp/DocumentHighlightProvider.ts +12 -0
- package/src/lsp/DocumentLinkProvider.test.ts +66 -0
- package/src/lsp/DocumentLinkProvider.ts +53 -0
- package/src/lsp/DocumentSymbolProvider.ts +201 -0
- package/src/lsp/HoverProvider.ts +58 -0
- package/{dist/lsp/SemanticTokenProvider.js → src/lsp/SemanticTokenProvider.ts} +58 -43
- package/src/lsp/index.ts +6 -0
- package/src/model/fqn-computation.ts +47 -0
- package/src/model/fqn-index.ts +161 -0
- package/src/model/index.ts +5 -0
- package/src/model/model-builder.ts +447 -0
- package/src/model/model-locator.ts +130 -0
- package/src/model/model-parser.ts +580 -0
- package/src/model-change/ModelChanges.ts +120 -0
- package/src/model-change/changeElementStyle.ts +176 -0
- package/src/model-change/changeViewLayout.ts +41 -0
- package/src/module.ts +197 -0
- package/src/node/index.ts +20 -0
- package/src/protocol.ts +87 -0
- package/src/references/index.ts +2 -0
- package/src/references/scope-computation.ts +142 -0
- package/src/references/scope-provider.ts +166 -0
- package/src/shared/NodeKindProvider.ts +67 -0
- package/src/shared/WorkspaceManager.ts +39 -0
- package/src/shared/WorkspaceSymbolProvider.ts +3 -0
- package/src/shared/index.ts +3 -0
- package/src/test/index.ts +1 -0
- package/src/test/testServices.ts +119 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/printDocs.ts +3 -0
- package/src/utils/stringHash.ts +6 -0
- package/src/validation/dynamic-view-rule.ts +35 -0
- package/src/validation/dynamic-view-step.ts +39 -0
- package/src/validation/element.ts +52 -0
- package/{dist/validation/index.js → src/validation/index.ts} +25 -17
- package/src/validation/property-checks.ts +17 -0
- package/src/validation/relation.ts +57 -0
- package/src/validation/specification.ts +118 -0
- package/src/validation/view-predicates/custom-element-expr.ts +21 -0
- package/src/validation/view-predicates/expanded-element.ts +34 -0
- package/src/validation/view-predicates/incoming.ts +19 -0
- package/src/validation/view-predicates/index.ts +4 -0
- package/src/validation/view-predicates/outgoing.ts +19 -0
- package/src/validation/view.ts +26 -0
- package/src/view-utils/assignNavigateTo.ts +30 -0
- package/src/view-utils/index.ts +3 -0
- package/src/view-utils/resolve-extended-views.ts +57 -0
- package/src/view-utils/resolve-relative-paths.ts +84 -0
- package/dist/Rpc.d.ts +0 -10
- package/dist/Rpc.js +0 -98
- package/dist/ast.d.ts +0 -133
- package/dist/ast.js +0 -267
- package/dist/browser/index.d.ts +0 -9
- package/dist/browser/index.js +0 -16
- package/dist/elementRef.d.ts +0 -12
- package/dist/elementRef.js +0 -15
- package/dist/generated/ast.d.ts +0 -559
- package/dist/generated/ast.js +0 -868
- package/dist/generated/grammar.d.ts +0 -7
- package/dist/generated/grammar.js +0 -3
- package/dist/generated/module.d.ts +0 -14
- package/dist/generated/module.js +0 -22
- package/dist/index.d.ts +0 -5
- package/dist/index.js +0 -2
- package/dist/logger.d.ts +0 -12
- package/dist/logger.js +0 -51
- package/dist/lsp/CodeLensProvider.d.ts +0 -10
- package/dist/lsp/CodeLensProvider.js +0 -37
- package/dist/lsp/DocumentHighlightProvider.d.ts +0 -10
- package/dist/lsp/DocumentHighlightProvider.js +0 -10
- package/dist/lsp/DocumentLinkProvider.d.ts +0 -11
- package/dist/lsp/DocumentLinkProvider.js +0 -41
- package/dist/lsp/DocumentLinkProvider.test.d.ts +0 -2
- package/dist/lsp/DocumentLinkProvider.test.js +0 -54
- package/dist/lsp/DocumentSymbolProvider.d.ts +0 -22
- package/dist/lsp/DocumentSymbolProvider.js +0 -184
- package/dist/lsp/HoverProvider.d.ts +0 -10
- package/dist/lsp/HoverProvider.js +0 -36
- package/dist/lsp/SemanticTokenProvider.d.ts +0 -8
- package/dist/lsp/index.d.ts +0 -7
- package/dist/lsp/index.js +0 -6
- package/dist/model/fqn-computation.d.ts +0 -4
- package/dist/model/fqn-computation.js +0 -43
- package/dist/model/fqn-index.d.ts +0 -26
- package/dist/model/fqn-index.js +0 -114
- package/dist/model/index.d.ts +0 -6
- package/dist/model/index.js +0 -5
- package/dist/model/model-builder.d.ts +0 -20
- package/dist/model/model-builder.js +0 -352
- package/dist/model/model-locator.d.ts +0 -22
- package/dist/model/model-locator.js +0 -119
- package/dist/model/model-parser.d.ts +0 -27
- package/dist/model/model-parser.js +0 -410
- package/dist/model-change/ModelChanges.d.ts +0 -15
- package/dist/model-change/ModelChanges.js +0 -100
- package/dist/model-change/changeElementStyle.d.ts +0 -15
- package/dist/model-change/changeElementStyle.js +0 -141
- package/dist/model-change/changeViewLayout.d.ts +0 -13
- package/dist/model-change/changeViewLayout.js +0 -30
- package/dist/module.d.ts +0 -59
- package/dist/module.js +0 -121
- package/dist/node/index.d.ts +0 -6
- package/dist/node/index.js +0 -13
- package/dist/protocol.d.ts +0 -58
- package/dist/protocol.js +0 -14
- package/dist/references/index.d.ts +0 -3
- package/dist/references/index.js +0 -2
- package/dist/references/scope-computation.d.ts +0 -11
- package/dist/references/scope-computation.js +0 -108
- package/dist/references/scope-provider.d.ts +0 -18
- package/dist/references/scope-provider.js +0 -136
- package/dist/shared/NodeKindProvider.d.ts +0 -16
- package/dist/shared/NodeKindProvider.js +0 -58
- package/dist/shared/WorkspaceManager.d.ts +0 -17
- package/dist/shared/WorkspaceManager.js +0 -29
- package/dist/shared/WorkspaceSymbolProvider.d.ts +0 -4
- package/dist/shared/WorkspaceSymbolProvider.js +0 -3
- package/dist/shared/index.d.ts +0 -4
- package/dist/shared/index.js +0 -3
- package/dist/test/index.d.ts +0 -2
- package/dist/test/index.js +0 -1
- package/dist/test/testServices.d.ts +0 -23
- package/dist/test/testServices.js +0 -102
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +0 -1
- package/dist/utils/printDocs.d.ts +0 -3
- package/dist/utils/printDocs.js +0 -1
- package/dist/utils/stringHash.d.ts +0 -2
- package/dist/utils/stringHash.js +0 -5
- package/dist/validation/element.d.ts +0 -6
- package/dist/validation/element.js +0 -38
- package/dist/validation/index.d.ts +0 -3
- package/dist/validation/property-checks.d.ts +0 -5
- package/dist/validation/property-checks.js +0 -11
- package/dist/validation/relation.d.ts +0 -5
- package/dist/validation/relation.js +0 -50
- package/dist/validation/specification.d.ts +0 -10
- package/dist/validation/specification.js +0 -97
- package/dist/validation/view-predicates/custom-element-expr.d.ts +0 -5
- package/dist/validation/view-predicates/custom-element-expr.js +0 -16
- package/dist/validation/view-predicates/expanded-element.d.ts +0 -5
- package/dist/validation/view-predicates/expanded-element.js +0 -28
- package/dist/validation/view-predicates/incoming.d.ts +0 -5
- package/dist/validation/view-predicates/incoming.js +0 -14
- package/dist/validation/view-predicates/index.d.ts +0 -5
- package/dist/validation/view-predicates/index.js +0 -4
- package/dist/validation/view-predicates/outgoing.d.ts +0 -5
- package/dist/validation/view-predicates/outgoing.js +0 -14
- package/dist/validation/view.d.ts +0 -5
- package/dist/validation/view.js +0 -18
- package/dist/view-utils/assignNavigateTo.d.ts +0 -3
- package/dist/view-utils/assignNavigateTo.js +0 -23
- package/dist/view-utils/index.d.ts +0 -4
- package/dist/view-utils/index.js +0 -3
- package/dist/view-utils/resolve-extended-views.d.ts +0 -7
- package/dist/view-utils/resolve-extended-views.js +0 -41
- package/dist/view-utils/resolve-relative-paths.d.ts +0 -3
- package/dist/view-utils/resolve-relative-paths.js +0 -76
- /package/{dist → src}/reset.d.ts +0 -0
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
compareByFqnHierarchically,
|
|
3
|
-
isStrictElementView,
|
|
4
|
-
parentFqn
|
|
5
|
-
} from "@likec4/core";
|
|
6
|
-
import { computeView, LikeC4ModelGraph } from "@likec4/graph";
|
|
7
|
-
import { deepEqual as eq } from "fast-equals";
|
|
8
|
-
import { DocumentState, interruptAndCheck } from "langium";
|
|
9
|
-
import {
|
|
10
|
-
filter,
|
|
11
|
-
find,
|
|
12
|
-
flatMap,
|
|
13
|
-
forEach,
|
|
14
|
-
isNullish,
|
|
15
|
-
isTruthy,
|
|
16
|
-
map,
|
|
17
|
-
mapToObj,
|
|
18
|
-
pipe,
|
|
19
|
-
prop,
|
|
20
|
-
reduce,
|
|
21
|
-
sort,
|
|
22
|
-
values
|
|
23
|
-
} from "remeda";
|
|
24
|
-
import { Disposable } from "vscode-languageserver";
|
|
25
|
-
import { isParsedLikeC4LangiumDocument } from "../ast.js";
|
|
26
|
-
import { logError, logger, logWarnError } from "../logger.js";
|
|
27
|
-
import { printDocs } from "../utils/printDocs.js";
|
|
28
|
-
import { assignNavigateTo, resolveRelativePaths, resolveRulesExtendedViews } from "../view-utils/index.js";
|
|
29
|
-
function buildModel(services, docs) {
|
|
30
|
-
const c4Specification = {
|
|
31
|
-
kinds: {},
|
|
32
|
-
relationships: {}
|
|
33
|
-
};
|
|
34
|
-
forEach(map(docs, prop("c4Specification")), (spec) => {
|
|
35
|
-
Object.assign(c4Specification.kinds, spec.kinds);
|
|
36
|
-
Object.assign(c4Specification.relationships, spec.relationships);
|
|
37
|
-
});
|
|
38
|
-
const resolveLinks = (doc, links) => {
|
|
39
|
-
return links.map((l) => services.lsp.DocumentLinkProvider.resolveLink(doc, l));
|
|
40
|
-
};
|
|
41
|
-
const toModelElement = (doc) => {
|
|
42
|
-
return ({
|
|
43
|
-
tags,
|
|
44
|
-
links,
|
|
45
|
-
style: {
|
|
46
|
-
color,
|
|
47
|
-
shape,
|
|
48
|
-
icon,
|
|
49
|
-
opacity,
|
|
50
|
-
border
|
|
51
|
-
},
|
|
52
|
-
id,
|
|
53
|
-
kind,
|
|
54
|
-
title,
|
|
55
|
-
description,
|
|
56
|
-
technology
|
|
57
|
-
}) => {
|
|
58
|
-
try {
|
|
59
|
-
const __kind = c4Specification.kinds[kind];
|
|
60
|
-
if (!__kind) {
|
|
61
|
-
logger.warn(`No kind '${kind}' found for ${id}`);
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
color ??= __kind.color;
|
|
65
|
-
shape ??= __kind.shape;
|
|
66
|
-
icon ??= __kind.icon;
|
|
67
|
-
opacity ??= __kind.opacity;
|
|
68
|
-
border ??= __kind.border;
|
|
69
|
-
return {
|
|
70
|
-
...color && { color },
|
|
71
|
-
...shape && { shape },
|
|
72
|
-
...icon && { icon },
|
|
73
|
-
style: {
|
|
74
|
-
...border && { border },
|
|
75
|
-
...opacity && { opacity }
|
|
76
|
-
},
|
|
77
|
-
links: links ? resolveLinks(doc, links) : null,
|
|
78
|
-
tags: tags ?? null,
|
|
79
|
-
technology: technology ?? null,
|
|
80
|
-
description: description ?? null,
|
|
81
|
-
title,
|
|
82
|
-
kind,
|
|
83
|
-
id
|
|
84
|
-
};
|
|
85
|
-
} catch (e) {
|
|
86
|
-
logWarnError(e);
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
};
|
|
90
|
-
};
|
|
91
|
-
const elements = pipe(
|
|
92
|
-
docs,
|
|
93
|
-
flatMap((d) => d.c4Elements.map(toModelElement(d))),
|
|
94
|
-
filter(isTruthy),
|
|
95
|
-
sort(compareByFqnHierarchically),
|
|
96
|
-
reduce(
|
|
97
|
-
(acc, el) => {
|
|
98
|
-
const parent = parentFqn(el.id);
|
|
99
|
-
if (parent && isNullish(acc[parent])) {
|
|
100
|
-
logWarnError(`No parent found for ${el.id}`);
|
|
101
|
-
return acc;
|
|
102
|
-
}
|
|
103
|
-
if (el.id in acc) {
|
|
104
|
-
logWarnError(`Duplicate element id: ${el.id}`);
|
|
105
|
-
return acc;
|
|
106
|
-
}
|
|
107
|
-
acc[el.id] = el;
|
|
108
|
-
return acc;
|
|
109
|
-
},
|
|
110
|
-
{}
|
|
111
|
-
)
|
|
112
|
-
);
|
|
113
|
-
const toModelRelation = (doc) => {
|
|
114
|
-
return ({
|
|
115
|
-
astPath,
|
|
116
|
-
source,
|
|
117
|
-
target,
|
|
118
|
-
kind,
|
|
119
|
-
links,
|
|
120
|
-
id,
|
|
121
|
-
...model
|
|
122
|
-
}) => {
|
|
123
|
-
if (isNullish(elements[source]) || isNullish(elements[target])) {
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
if (!!kind && kind in c4Specification.relationships) {
|
|
127
|
-
return {
|
|
128
|
-
...links && { links: resolveLinks(doc, links) },
|
|
129
|
-
...c4Specification.relationships[kind],
|
|
130
|
-
...model,
|
|
131
|
-
source,
|
|
132
|
-
target,
|
|
133
|
-
kind,
|
|
134
|
-
id
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
...links && { links: resolveLinks(doc, links) },
|
|
139
|
-
...model,
|
|
140
|
-
source,
|
|
141
|
-
target,
|
|
142
|
-
id
|
|
143
|
-
};
|
|
144
|
-
};
|
|
145
|
-
};
|
|
146
|
-
const relations = pipe(
|
|
147
|
-
flatMap(docs, (d) => map(d.c4Relations, toModelRelation(d))),
|
|
148
|
-
filter(isTruthy),
|
|
149
|
-
mapToObj((r) => [r.id, r])
|
|
150
|
-
);
|
|
151
|
-
const toElementView = (doc) => {
|
|
152
|
-
const docUri = doc.uri.toString();
|
|
153
|
-
return (view) => {
|
|
154
|
-
let { astPath, rules, title, description, tags, links, ...model } = view;
|
|
155
|
-
if (!title && "viewOf" in view) {
|
|
156
|
-
title = elements[view.viewOf]?.title;
|
|
157
|
-
}
|
|
158
|
-
if (!title && view.id === "index") {
|
|
159
|
-
title = "Landscape view";
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
...model,
|
|
163
|
-
title: title ?? null,
|
|
164
|
-
description: description ?? null,
|
|
165
|
-
tags: tags ?? null,
|
|
166
|
-
links: links ? resolveLinks(doc, links) : null,
|
|
167
|
-
docUri,
|
|
168
|
-
rules
|
|
169
|
-
};
|
|
170
|
-
};
|
|
171
|
-
};
|
|
172
|
-
const views = pipe(
|
|
173
|
-
flatMap(docs, (d) => map(d.c4Views, toElementView(d))),
|
|
174
|
-
resolveRelativePaths,
|
|
175
|
-
mapToObj((v) => [v.id, v]),
|
|
176
|
-
resolveRulesExtendedViews
|
|
177
|
-
);
|
|
178
|
-
if (!("index" in views)) {
|
|
179
|
-
views["index"] = {
|
|
180
|
-
id: "index",
|
|
181
|
-
title: "Landscape",
|
|
182
|
-
description: null,
|
|
183
|
-
tags: null,
|
|
184
|
-
links: null,
|
|
185
|
-
rules: [
|
|
186
|
-
{
|
|
187
|
-
include: [
|
|
188
|
-
{
|
|
189
|
-
wildcard: true
|
|
190
|
-
}
|
|
191
|
-
]
|
|
192
|
-
}
|
|
193
|
-
]
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
return {
|
|
197
|
-
elements,
|
|
198
|
-
relations,
|
|
199
|
-
views
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
const RAW_MODEL_CACHE = "LikeC4RawModel";
|
|
203
|
-
const MODEL_CACHE = "LikeC4Model";
|
|
204
|
-
export class LikeC4ModelBuilder {
|
|
205
|
-
constructor(services) {
|
|
206
|
-
this.services = services;
|
|
207
|
-
this.langiumDocuments = services.shared.workspace.LangiumDocuments;
|
|
208
|
-
const parser = services.likec4.ModelParser;
|
|
209
|
-
services.shared.workspace.DocumentBuilder.onUpdate((changed, deleted) => {
|
|
210
|
-
if (deleted.length > 0) {
|
|
211
|
-
this.notifyListeners(deleted);
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
services.shared.workspace.DocumentBuilder.onBuildPhase(
|
|
215
|
-
DocumentState.Validated,
|
|
216
|
-
async (docs, _cancelToken) => {
|
|
217
|
-
let parsed = [];
|
|
218
|
-
logger.debug(`[ModelBuilder] onValidated (${docs.length} docs)
|
|
219
|
-
${printDocs(docs)}`);
|
|
220
|
-
for (const doc of parser.parse(docs)) {
|
|
221
|
-
parsed.push(doc.uri);
|
|
222
|
-
}
|
|
223
|
-
if (parsed.length > 0) {
|
|
224
|
-
this.notifyListeners(parsed);
|
|
225
|
-
}
|
|
226
|
-
return await Promise.resolve();
|
|
227
|
-
}
|
|
228
|
-
);
|
|
229
|
-
logger.debug(`[ModelBuilder] Created`);
|
|
230
|
-
}
|
|
231
|
-
langiumDocuments;
|
|
232
|
-
listeners = [];
|
|
233
|
-
async buildModel(cancelToken) {
|
|
234
|
-
return await this.services.shared.workspace.WorkspaceLock.read(async () => {
|
|
235
|
-
if (cancelToken) {
|
|
236
|
-
await interruptAndCheck(cancelToken);
|
|
237
|
-
}
|
|
238
|
-
const cache = this.services.WorkspaceCache;
|
|
239
|
-
return cache.get(RAW_MODEL_CACHE, () => {
|
|
240
|
-
const docs = this.documents();
|
|
241
|
-
if (docs.length === 0) {
|
|
242
|
-
logger.debug("[ModelBuilder] No documents to build model from");
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
logger.debug(`[ModelBuilder] buildModel from ${docs.length} docs:
|
|
246
|
-
${printDocs(docs)}`);
|
|
247
|
-
return buildModel(this.services, docs);
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
previousViews = {};
|
|
252
|
-
async buildComputedModel(cancelToken) {
|
|
253
|
-
const model = await this.buildModel(cancelToken);
|
|
254
|
-
if (!model) {
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
return await this.services.shared.workspace.WorkspaceLock.read(async () => {
|
|
258
|
-
if (cancelToken) {
|
|
259
|
-
await interruptAndCheck(cancelToken);
|
|
260
|
-
}
|
|
261
|
-
const cache = this.services.WorkspaceCache;
|
|
262
|
-
const viewsCache = this.services.WorkspaceCache;
|
|
263
|
-
return cache.get(MODEL_CACHE, () => {
|
|
264
|
-
const index = new LikeC4ModelGraph(model);
|
|
265
|
-
const allViews = [];
|
|
266
|
-
for (const view of values(model.views)) {
|
|
267
|
-
const result = computeView(view, index);
|
|
268
|
-
if (!result.isSuccess) {
|
|
269
|
-
logWarnError(result.error);
|
|
270
|
-
continue;
|
|
271
|
-
}
|
|
272
|
-
allViews.push(result.view);
|
|
273
|
-
}
|
|
274
|
-
assignNavigateTo(allViews);
|
|
275
|
-
const views = mapToObj(allViews, (v) => {
|
|
276
|
-
const previous = this.previousViews[v.id];
|
|
277
|
-
const view = previous && eq(v, previous) ? previous : v;
|
|
278
|
-
viewsCache.set(computedViewKey(v.id), view);
|
|
279
|
-
return [v.id, view];
|
|
280
|
-
});
|
|
281
|
-
this.previousViews = { ...views };
|
|
282
|
-
return {
|
|
283
|
-
elements: model.elements,
|
|
284
|
-
relations: model.relations,
|
|
285
|
-
views
|
|
286
|
-
};
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
async computeView(viewId, cancelToken) {
|
|
291
|
-
const model = await this.buildModel(cancelToken);
|
|
292
|
-
const view = model?.views[viewId];
|
|
293
|
-
if (!view) {
|
|
294
|
-
logger.warn(`[ModelBuilder] Cannot find view ${viewId}`);
|
|
295
|
-
return null;
|
|
296
|
-
}
|
|
297
|
-
return await this.services.shared.workspace.WorkspaceLock.read(async () => {
|
|
298
|
-
if (cancelToken) {
|
|
299
|
-
await interruptAndCheck(cancelToken);
|
|
300
|
-
}
|
|
301
|
-
const cache = this.services.WorkspaceCache;
|
|
302
|
-
return cache.get(computedViewKey(viewId), () => {
|
|
303
|
-
const index = new LikeC4ModelGraph(model);
|
|
304
|
-
const result = computeView(view, index);
|
|
305
|
-
if (!result.isSuccess) {
|
|
306
|
-
logError(result.error);
|
|
307
|
-
return null;
|
|
308
|
-
}
|
|
309
|
-
const allElementViews = values(model.views).filter(
|
|
310
|
-
(v) => isStrictElementView(v) && v.id !== viewId
|
|
311
|
-
);
|
|
312
|
-
let computedView = result.view;
|
|
313
|
-
computedView.nodes.forEach((node) => {
|
|
314
|
-
if (!node.navigateTo) {
|
|
315
|
-
const navigateTo = find(allElementViews, (v) => v.viewOf === node.id);
|
|
316
|
-
if (navigateTo) {
|
|
317
|
-
node.navigateTo = navigateTo.id;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
});
|
|
321
|
-
const previous = this.previousViews[viewId];
|
|
322
|
-
computedView = previous && eq(computedView, previous) ? previous : computedView;
|
|
323
|
-
this.previousViews[viewId] = computedView;
|
|
324
|
-
return computedView;
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
onModelParsed(callback) {
|
|
329
|
-
this.listeners.push(callback);
|
|
330
|
-
return Disposable.create(() => {
|
|
331
|
-
const index = this.listeners.indexOf(callback);
|
|
332
|
-
if (index >= 0) {
|
|
333
|
-
this.listeners.splice(index, 1);
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
documents() {
|
|
338
|
-
return this.langiumDocuments.all.filter(isParsedLikeC4LangiumDocument).toArray();
|
|
339
|
-
}
|
|
340
|
-
notifyListeners(docs) {
|
|
341
|
-
for (const listener of this.listeners) {
|
|
342
|
-
try {
|
|
343
|
-
listener(docs);
|
|
344
|
-
} catch (e) {
|
|
345
|
-
logError(e);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
function computedViewKey(viewId) {
|
|
351
|
-
return `computed-view-${viewId}`;
|
|
352
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { likec4 as c4 } from '@likec4/core';
|
|
2
|
-
import type { Location } from 'vscode-languageserver-protocol';
|
|
3
|
-
import type { ParsedAstElement } from '../ast';
|
|
4
|
-
import { ast } from '../ast';
|
|
5
|
-
import type { LikeC4Services } from '../module';
|
|
6
|
-
export declare class LikeC4ModelLocator {
|
|
7
|
-
private services;
|
|
8
|
-
private fqnIndex;
|
|
9
|
-
private langiumDocuments;
|
|
10
|
-
constructor(services: LikeC4Services);
|
|
11
|
-
private documents;
|
|
12
|
-
getParsedElement(astNode: ast.Element): ParsedAstElement | null;
|
|
13
|
-
locateElement(fqn: c4.Fqn, property?: string): Location | null;
|
|
14
|
-
locateRelation(relationId: c4.RelationID): Location | null;
|
|
15
|
-
locateViewAst(viewId: c4.ViewID): {
|
|
16
|
-
doc: import("../ast").ParsedLikeC4LangiumDocument;
|
|
17
|
-
view: import("../ast").ParsedAstElementView;
|
|
18
|
-
viewAst: ast.ElementView;
|
|
19
|
-
} | null;
|
|
20
|
-
locateView(viewId: c4.ViewID): Location | null;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=model-locator.d.ts.map
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { AstUtils, GrammarUtils } from "langium";
|
|
2
|
-
import { ast, isParsedLikeC4LangiumDocument } from "../ast.js";
|
|
3
|
-
const { findNodeForKeyword, findNodeForProperty } = GrammarUtils;
|
|
4
|
-
const { getDocument } = AstUtils;
|
|
5
|
-
export class LikeC4ModelLocator {
|
|
6
|
-
constructor(services) {
|
|
7
|
-
this.services = services;
|
|
8
|
-
this.fqnIndex = services.likec4.FqnIndex;
|
|
9
|
-
this.langiumDocuments = services.shared.workspace.LangiumDocuments;
|
|
10
|
-
}
|
|
11
|
-
fqnIndex;
|
|
12
|
-
langiumDocuments;
|
|
13
|
-
documents() {
|
|
14
|
-
return this.langiumDocuments.all.filter(isParsedLikeC4LangiumDocument);
|
|
15
|
-
}
|
|
16
|
-
getParsedElement(astNode) {
|
|
17
|
-
const fqn = this.fqnIndex.getFqn(astNode);
|
|
18
|
-
if (!fqn)
|
|
19
|
-
return null;
|
|
20
|
-
const doc = getDocument(astNode);
|
|
21
|
-
if (!isParsedLikeC4LangiumDocument(doc)) {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
return doc.c4Elements.find((e) => e.id === fqn) ?? null;
|
|
25
|
-
}
|
|
26
|
-
locateElement(fqn, property = "name") {
|
|
27
|
-
const entry = this.fqnIndex.byFqn(fqn).head();
|
|
28
|
-
if (!entry) {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
const propertyNode = findNodeForProperty(entry.el.$cstNode, property) ?? entry.el.$cstNode;
|
|
32
|
-
if (!propertyNode) {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
return {
|
|
36
|
-
uri: entry.doc.uri.toString(),
|
|
37
|
-
range: propertyNode.range
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
locateRelation(relationId) {
|
|
41
|
-
for (const doc of this.documents()) {
|
|
42
|
-
const relation = doc.c4Relations.find((r) => r.id === relationId);
|
|
43
|
-
if (!relation) {
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
const node = this.services.workspace.AstNodeLocator.getAstNode(
|
|
47
|
-
doc.parseResult.value,
|
|
48
|
-
relation.astPath
|
|
49
|
-
);
|
|
50
|
-
if (!ast.isRelation(node)) {
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
if (node.title) {
|
|
54
|
-
const targetNode2 = findNodeForProperty(node.$cstNode, "title");
|
|
55
|
-
if (targetNode2) {
|
|
56
|
-
return {
|
|
57
|
-
uri: doc.uri.toString(),
|
|
58
|
-
range: {
|
|
59
|
-
start: targetNode2.range.start,
|
|
60
|
-
end: targetNode2.range.end
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
const targetNode = (node.kind ? findNodeForProperty(node.$cstNode, "kind") : findNodeForKeyword(node.$cstNode, "->")) ?? findNodeForProperty(node.$cstNode, "target");
|
|
66
|
-
return targetNode ? {
|
|
67
|
-
uri: doc.uri.toString(),
|
|
68
|
-
range: {
|
|
69
|
-
start: targetNode.range.start,
|
|
70
|
-
end: targetNode.range.end
|
|
71
|
-
}
|
|
72
|
-
} : null;
|
|
73
|
-
}
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
locateViewAst(viewId) {
|
|
77
|
-
for (const doc of this.documents()) {
|
|
78
|
-
const view = doc.c4Views.find((r) => r.id === viewId);
|
|
79
|
-
if (!view) {
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
const viewAst = this.services.workspace.AstNodeLocator.getAstNode(
|
|
83
|
-
doc.parseResult.value,
|
|
84
|
-
view.astPath
|
|
85
|
-
);
|
|
86
|
-
if (ast.isElementView(viewAst)) {
|
|
87
|
-
return {
|
|
88
|
-
doc,
|
|
89
|
-
view,
|
|
90
|
-
viewAst
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
locateView(viewId) {
|
|
97
|
-
const res = this.locateViewAst(viewId);
|
|
98
|
-
if (!res) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
const node = res.viewAst;
|
|
102
|
-
let targetNode = node.$cstNode;
|
|
103
|
-
if (node.name) {
|
|
104
|
-
targetNode = findNodeForProperty(node.$cstNode, "name") ?? targetNode;
|
|
105
|
-
} else if ("viewOf" in node) {
|
|
106
|
-
targetNode = findNodeForProperty(node.$cstNode, "viewOf") ?? targetNode;
|
|
107
|
-
}
|
|
108
|
-
if (!targetNode) {
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
uri: res.doc.uri.toString(),
|
|
113
|
-
range: {
|
|
114
|
-
start: targetNode.range.start,
|
|
115
|
-
end: targetNode.range.start
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { type c4 } from '@likec4/core';
|
|
2
|
-
import type { LangiumDocument } from 'langium';
|
|
3
|
-
import type { FqnIndexedDocument, ParsedLikeC4LangiumDocument } from '../ast';
|
|
4
|
-
import { ast } from '../ast';
|
|
5
|
-
import type { LikeC4Services } from '../module';
|
|
6
|
-
export type ModelParsedListener = () => void;
|
|
7
|
-
export declare class LikeC4ModelParser {
|
|
8
|
-
private services;
|
|
9
|
-
private fqnIndex;
|
|
10
|
-
constructor(services: LikeC4Services);
|
|
11
|
-
parse(doc: LangiumDocument | LangiumDocument[]): ParsedLikeC4LangiumDocument[];
|
|
12
|
-
protected parseLikeC4Document(_doc: FqnIndexedDocument): ParsedLikeC4LangiumDocument;
|
|
13
|
-
private parseSpecification;
|
|
14
|
-
private parseModel;
|
|
15
|
-
private parseElement;
|
|
16
|
-
private parseRelation;
|
|
17
|
-
private parseViews;
|
|
18
|
-
private parseElementExpr;
|
|
19
|
-
private parseCustomElementExpr;
|
|
20
|
-
private parsePredicateExpr;
|
|
21
|
-
private parseViewRule;
|
|
22
|
-
private parseElementView;
|
|
23
|
-
protected resolveFqn(node: ast.Element | ast.ExtendElement): c4.Fqn;
|
|
24
|
-
private getAstNodePath;
|
|
25
|
-
private convertTags;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=model-parser.d.ts.map
|