@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.
Files changed (173) hide show
  1. package/contrib/likec4.monarch.ts +4 -4
  2. package/contrib/likec4.tmLanguage.json +1 -1
  3. package/package.json +8 -10
  4. package/src/Rpc.ts +108 -0
  5. package/src/ast.ts +443 -0
  6. package/src/browser/index.ts +30 -0
  7. package/src/elementRef.ts +26 -0
  8. package/src/generated/ast.ts +1632 -0
  9. package/src/generated/grammar.ts +10 -0
  10. package/src/generated/module.ts +32 -0
  11. package/src/index.ts +4 -0
  12. package/src/like-c4.langium +395 -0
  13. package/src/logger.ts +54 -0
  14. package/src/lsp/CodeLensProvider.ts +51 -0
  15. package/src/lsp/DocumentHighlightProvider.ts +12 -0
  16. package/src/lsp/DocumentLinkProvider.test.ts +66 -0
  17. package/src/lsp/DocumentLinkProvider.ts +53 -0
  18. package/src/lsp/DocumentSymbolProvider.ts +201 -0
  19. package/src/lsp/HoverProvider.ts +58 -0
  20. package/{dist/lsp/SemanticTokenProvider.js → src/lsp/SemanticTokenProvider.ts} +58 -43
  21. package/src/lsp/index.ts +6 -0
  22. package/src/model/fqn-computation.ts +47 -0
  23. package/src/model/fqn-index.ts +161 -0
  24. package/src/model/index.ts +5 -0
  25. package/src/model/model-builder.ts +447 -0
  26. package/src/model/model-locator.ts +130 -0
  27. package/src/model/model-parser.ts +580 -0
  28. package/src/model-change/ModelChanges.ts +120 -0
  29. package/src/model-change/changeElementStyle.ts +176 -0
  30. package/src/model-change/changeViewLayout.ts +41 -0
  31. package/src/module.ts +197 -0
  32. package/src/node/index.ts +20 -0
  33. package/src/protocol.ts +87 -0
  34. package/src/references/index.ts +2 -0
  35. package/src/references/scope-computation.ts +142 -0
  36. package/src/references/scope-provider.ts +166 -0
  37. package/src/shared/NodeKindProvider.ts +67 -0
  38. package/src/shared/WorkspaceManager.ts +39 -0
  39. package/src/shared/WorkspaceSymbolProvider.ts +3 -0
  40. package/src/shared/index.ts +3 -0
  41. package/src/test/index.ts +1 -0
  42. package/src/test/testServices.ts +119 -0
  43. package/src/utils/index.ts +1 -0
  44. package/src/utils/printDocs.ts +3 -0
  45. package/src/utils/stringHash.ts +6 -0
  46. package/src/validation/dynamic-view-rule.ts +35 -0
  47. package/src/validation/dynamic-view-step.ts +39 -0
  48. package/src/validation/element.ts +52 -0
  49. package/{dist/validation/index.js → src/validation/index.ts} +25 -17
  50. package/src/validation/property-checks.ts +17 -0
  51. package/src/validation/relation.ts +57 -0
  52. package/src/validation/specification.ts +118 -0
  53. package/src/validation/view-predicates/custom-element-expr.ts +21 -0
  54. package/src/validation/view-predicates/expanded-element.ts +34 -0
  55. package/src/validation/view-predicates/incoming.ts +19 -0
  56. package/src/validation/view-predicates/index.ts +4 -0
  57. package/src/validation/view-predicates/outgoing.ts +19 -0
  58. package/src/validation/view.ts +26 -0
  59. package/src/view-utils/assignNavigateTo.ts +30 -0
  60. package/src/view-utils/index.ts +3 -0
  61. package/src/view-utils/resolve-extended-views.ts +57 -0
  62. package/src/view-utils/resolve-relative-paths.ts +84 -0
  63. package/dist/Rpc.d.ts +0 -10
  64. package/dist/Rpc.js +0 -98
  65. package/dist/ast.d.ts +0 -133
  66. package/dist/ast.js +0 -267
  67. package/dist/browser/index.d.ts +0 -9
  68. package/dist/browser/index.js +0 -16
  69. package/dist/elementRef.d.ts +0 -12
  70. package/dist/elementRef.js +0 -15
  71. package/dist/generated/ast.d.ts +0 -559
  72. package/dist/generated/ast.js +0 -868
  73. package/dist/generated/grammar.d.ts +0 -7
  74. package/dist/generated/grammar.js +0 -3
  75. package/dist/generated/module.d.ts +0 -14
  76. package/dist/generated/module.js +0 -22
  77. package/dist/index.d.ts +0 -5
  78. package/dist/index.js +0 -2
  79. package/dist/logger.d.ts +0 -12
  80. package/dist/logger.js +0 -51
  81. package/dist/lsp/CodeLensProvider.d.ts +0 -10
  82. package/dist/lsp/CodeLensProvider.js +0 -37
  83. package/dist/lsp/DocumentHighlightProvider.d.ts +0 -10
  84. package/dist/lsp/DocumentHighlightProvider.js +0 -10
  85. package/dist/lsp/DocumentLinkProvider.d.ts +0 -11
  86. package/dist/lsp/DocumentLinkProvider.js +0 -41
  87. package/dist/lsp/DocumentLinkProvider.test.d.ts +0 -2
  88. package/dist/lsp/DocumentLinkProvider.test.js +0 -54
  89. package/dist/lsp/DocumentSymbolProvider.d.ts +0 -22
  90. package/dist/lsp/DocumentSymbolProvider.js +0 -184
  91. package/dist/lsp/HoverProvider.d.ts +0 -10
  92. package/dist/lsp/HoverProvider.js +0 -36
  93. package/dist/lsp/SemanticTokenProvider.d.ts +0 -8
  94. package/dist/lsp/index.d.ts +0 -7
  95. package/dist/lsp/index.js +0 -6
  96. package/dist/model/fqn-computation.d.ts +0 -4
  97. package/dist/model/fqn-computation.js +0 -43
  98. package/dist/model/fqn-index.d.ts +0 -26
  99. package/dist/model/fqn-index.js +0 -114
  100. package/dist/model/index.d.ts +0 -6
  101. package/dist/model/index.js +0 -5
  102. package/dist/model/model-builder.d.ts +0 -20
  103. package/dist/model/model-builder.js +0 -352
  104. package/dist/model/model-locator.d.ts +0 -22
  105. package/dist/model/model-locator.js +0 -119
  106. package/dist/model/model-parser.d.ts +0 -27
  107. package/dist/model/model-parser.js +0 -410
  108. package/dist/model-change/ModelChanges.d.ts +0 -15
  109. package/dist/model-change/ModelChanges.js +0 -100
  110. package/dist/model-change/changeElementStyle.d.ts +0 -15
  111. package/dist/model-change/changeElementStyle.js +0 -141
  112. package/dist/model-change/changeViewLayout.d.ts +0 -13
  113. package/dist/model-change/changeViewLayout.js +0 -30
  114. package/dist/module.d.ts +0 -59
  115. package/dist/module.js +0 -121
  116. package/dist/node/index.d.ts +0 -6
  117. package/dist/node/index.js +0 -13
  118. package/dist/protocol.d.ts +0 -58
  119. package/dist/protocol.js +0 -14
  120. package/dist/references/index.d.ts +0 -3
  121. package/dist/references/index.js +0 -2
  122. package/dist/references/scope-computation.d.ts +0 -11
  123. package/dist/references/scope-computation.js +0 -108
  124. package/dist/references/scope-provider.d.ts +0 -18
  125. package/dist/references/scope-provider.js +0 -136
  126. package/dist/shared/NodeKindProvider.d.ts +0 -16
  127. package/dist/shared/NodeKindProvider.js +0 -58
  128. package/dist/shared/WorkspaceManager.d.ts +0 -17
  129. package/dist/shared/WorkspaceManager.js +0 -29
  130. package/dist/shared/WorkspaceSymbolProvider.d.ts +0 -4
  131. package/dist/shared/WorkspaceSymbolProvider.js +0 -3
  132. package/dist/shared/index.d.ts +0 -4
  133. package/dist/shared/index.js +0 -3
  134. package/dist/test/index.d.ts +0 -2
  135. package/dist/test/index.js +0 -1
  136. package/dist/test/testServices.d.ts +0 -23
  137. package/dist/test/testServices.js +0 -102
  138. package/dist/utils/index.d.ts +0 -2
  139. package/dist/utils/index.js +0 -1
  140. package/dist/utils/printDocs.d.ts +0 -3
  141. package/dist/utils/printDocs.js +0 -1
  142. package/dist/utils/stringHash.d.ts +0 -2
  143. package/dist/utils/stringHash.js +0 -5
  144. package/dist/validation/element.d.ts +0 -6
  145. package/dist/validation/element.js +0 -38
  146. package/dist/validation/index.d.ts +0 -3
  147. package/dist/validation/property-checks.d.ts +0 -5
  148. package/dist/validation/property-checks.js +0 -11
  149. package/dist/validation/relation.d.ts +0 -5
  150. package/dist/validation/relation.js +0 -50
  151. package/dist/validation/specification.d.ts +0 -10
  152. package/dist/validation/specification.js +0 -97
  153. package/dist/validation/view-predicates/custom-element-expr.d.ts +0 -5
  154. package/dist/validation/view-predicates/custom-element-expr.js +0 -16
  155. package/dist/validation/view-predicates/expanded-element.d.ts +0 -5
  156. package/dist/validation/view-predicates/expanded-element.js +0 -28
  157. package/dist/validation/view-predicates/incoming.d.ts +0 -5
  158. package/dist/validation/view-predicates/incoming.js +0 -14
  159. package/dist/validation/view-predicates/index.d.ts +0 -5
  160. package/dist/validation/view-predicates/index.js +0 -4
  161. package/dist/validation/view-predicates/outgoing.d.ts +0 -5
  162. package/dist/validation/view-predicates/outgoing.js +0 -14
  163. package/dist/validation/view.d.ts +0 -5
  164. package/dist/validation/view.js +0 -18
  165. package/dist/view-utils/assignNavigateTo.d.ts +0 -3
  166. package/dist/view-utils/assignNavigateTo.js +0 -23
  167. package/dist/view-utils/index.d.ts +0 -4
  168. package/dist/view-utils/index.js +0 -3
  169. package/dist/view-utils/resolve-extended-views.d.ts +0 -7
  170. package/dist/view-utils/resolve-extended-views.js +0 -41
  171. package/dist/view-utils/resolve-relative-paths.d.ts +0 -3
  172. package/dist/view-utils/resolve-relative-paths.js +0 -76
  173. /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