@likec4/language-server 1.47.0 → 1.48.0

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 (316) hide show
  1. package/LICENSE +1 -1
  2. package/browser/package.json +2 -2
  3. package/browser-worker/package.json +2 -2
  4. package/bundled/package.json +4 -0
  5. package/dist/LikeC4LanguageServices.d.mts +4 -0
  6. package/dist/LikeC4LanguageServices.mjs +3 -0
  7. package/dist/_chunks/ConfigurableLayouter.mjs +1956 -0
  8. package/dist/_chunks/LikeC4LanguageServices.d.mts +1978 -0
  9. package/dist/_chunks/LikeC4LanguageServices.mjs +725 -0
  10. package/dist/_chunks/ast.d.mts +1444 -0
  11. package/dist/_chunks/ast.mjs +2375 -0
  12. package/dist/_chunks/ast2.mjs +176 -0
  13. package/dist/_chunks/common-exports.mjs +0 -0
  14. package/dist/_chunks/filesystem.mjs +58 -0
  15. package/dist/_chunks/grammar.mjs +8 -0
  16. package/dist/_chunks/icons.mjs +5211 -0
  17. package/dist/_chunks/libs/@hono/node-server.mjs +436 -0
  18. package/dist/_chunks/libs/@msgpack/msgpack.mjs +805 -0
  19. package/dist/_chunks/libs/eventemitter3.mjs +243 -0
  20. package/dist/_chunks/libs/fast-equals.mjs +446 -0
  21. package/dist/_chunks/libs/hono.mjs +1829 -0
  22. package/dist/_chunks/libs/p-queue.mjs +449 -0
  23. package/dist/_chunks/libs/parse-ms.mjs +36 -0
  24. package/dist/_chunks/libs/picomatch.mjs +1673 -0
  25. package/dist/_chunks/libs/pretty-ms.mjs +80 -0
  26. package/dist/_chunks/libs/remeda.mjs +482 -0
  27. package/dist/_chunks/libs/strip-indent.mjs +15 -0
  28. package/dist/_chunks/libs/ufo.mjs +166 -0
  29. package/dist/_chunks/likec4lib.mjs +9 -0
  30. package/dist/_chunks/mcp.mjs +33 -0
  31. package/dist/_chunks/module.mjs +28 -0
  32. package/dist/_chunks/module2.mjs +6576 -0
  33. package/dist/_chunks/protocol.d.mts +311 -0
  34. package/dist/_chunks/protocol.mjs +78 -0
  35. package/dist/_chunks/rolldown-runtime.mjs +42 -0
  36. package/dist/ast.d.mts +4 -0
  37. package/dist/ast.mjs +4 -0
  38. package/dist/browser-worker.d.mts +1 -0
  39. package/dist/browser-worker.mjs +6 -0
  40. package/dist/browser.d.mts +11 -0
  41. package/dist/browser.mjs +27 -0
  42. package/dist/bundled.d.mts +28 -0
  43. package/dist/bundled.mjs +51 -4853
  44. package/dist/common-exports.d.mts +4 -0
  45. package/dist/common-exports.mjs +5 -0
  46. package/dist/filesystem/index.d.mts +4 -0
  47. package/dist/filesystem/index.mjs +3 -0
  48. package/dist/generated/ast.d.mts +2 -0
  49. package/dist/generated/ast.mjs +3 -0
  50. package/dist/generated/grammar.d.mts +6 -0
  51. package/dist/generated/grammar.mjs +3 -0
  52. package/dist/generated/module.d.mts +14 -0
  53. package/dist/generated/module.mjs +3 -0
  54. package/dist/generated-lib/icons.d.mts +4 -0
  55. package/dist/generated-lib/icons.mjs +3 -0
  56. package/dist/index.d.mts +4 -0
  57. package/dist/index.mjs +48 -0
  58. package/dist/likec4lib.d.mts +9 -0
  59. package/dist/likec4lib.mjs +4 -0
  60. package/dist/mcp/index.d.mts +4 -0
  61. package/dist/mcp/index.mjs +3 -0
  62. package/dist/module.d.mts +4 -0
  63. package/dist/module.mjs +3 -0
  64. package/dist/protocol.d.mts +2 -0
  65. package/dist/protocol.mjs +3 -0
  66. package/likec4lib/package.json +2 -2
  67. package/package.json +106 -63
  68. package/protocol/package.json +2 -2
  69. package/dist/LikeC4LanguageServices.d.ts +0 -115
  70. package/dist/LikeC4LanguageServices.js +0 -164
  71. package/dist/Rpc.d.ts +0 -9
  72. package/dist/Rpc.js +0 -276
  73. package/dist/ast.d.ts +0 -226
  74. package/dist/ast.js +0 -264
  75. package/dist/browser-worker.d.ts +0 -1
  76. package/dist/browser-worker.js +0 -4
  77. package/dist/browser.d.ts +0 -10
  78. package/dist/browser.js +0 -34
  79. package/dist/bundled.d.ts +0 -8
  80. package/dist/bundled.js +0 -44
  81. package/dist/documentation/documentation-provider.d.ts +0 -8
  82. package/dist/documentation/documentation-provider.js +0 -51
  83. package/dist/documentation/index.d.ts +0 -1
  84. package/dist/documentation/index.js +0 -1
  85. package/dist/empty.d.ts +0 -2
  86. package/dist/empty.js +0 -2
  87. package/dist/filesystem/ChokidarWatcher.d.ts +0 -19
  88. package/dist/filesystem/ChokidarWatcher.js +0 -133
  89. package/dist/filesystem/FileSystemWatcher.d.ts +0 -19
  90. package/dist/filesystem/FileSystemWatcher.js +0 -14
  91. package/dist/filesystem/LikeC4FileSystem.d.ts +0 -3
  92. package/dist/filesystem/LikeC4FileSystem.js +0 -140
  93. package/dist/filesystem/index.d.ts +0 -55
  94. package/dist/filesystem/index.js +0 -29
  95. package/dist/formatting/LikeC4Formatter.d.ts +0 -59
  96. package/dist/formatting/LikeC4Formatter.js +0 -637
  97. package/dist/formatting/utils.d.ts +0 -6
  98. package/dist/formatting/utils.js +0 -18
  99. package/dist/generated/ast.d.ts +0 -1411
  100. package/dist/generated/ast.js +0 -2207
  101. package/dist/generated/grammar.d.ts +0 -6
  102. package/dist/generated/grammar.js +0 -7
  103. package/dist/generated/module.d.ts +0 -14
  104. package/dist/generated/module.js +0 -27
  105. package/dist/generated-lib/icons.d.ts +0 -1
  106. package/dist/generated-lib/icons.js +0 -18
  107. package/dist/index.d.ts +0 -37
  108. package/dist/index.js +0 -54
  109. package/dist/likec4lib.d.ts +0 -6
  110. package/dist/likec4lib.js +0 -7
  111. package/dist/logger.d.ts +0 -17
  112. package/dist/logger.js +0 -81
  113. package/dist/lsp/CodeActionProvider.d.ts +0 -14
  114. package/dist/lsp/CodeActionProvider.js +0 -33
  115. package/dist/lsp/CodeLensProvider.d.ts +0 -9
  116. package/dist/lsp/CodeLensProvider.js +0 -44
  117. package/dist/lsp/CompletionProvider.d.ts +0 -13
  118. package/dist/lsp/CompletionProvider.js +0 -238
  119. package/dist/lsp/DocumentHighlightProvider.d.ts +0 -9
  120. package/dist/lsp/DocumentHighlightProvider.js +0 -10
  121. package/dist/lsp/DocumentLinkProvider.d.ts +0 -11
  122. package/dist/lsp/DocumentLinkProvider.js +0 -58
  123. package/dist/lsp/DocumentSymbolProvider.d.ts +0 -33
  124. package/dist/lsp/DocumentSymbolProvider.js +0 -317
  125. package/dist/lsp/HoverProvider.d.ts +0 -10
  126. package/dist/lsp/HoverProvider.js +0 -106
  127. package/dist/lsp/RenameProvider.d.ts +0 -5
  128. package/dist/lsp/RenameProvider.js +0 -6
  129. package/dist/lsp/SemanticTokenProvider.d.ts +0 -19
  130. package/dist/lsp/SemanticTokenProvider.js +0 -305
  131. package/dist/lsp/index.d.ts +0 -8
  132. package/dist/lsp/index.js +0 -9
  133. package/dist/mcp/MCPServerFactory.d.ts +0 -8
  134. package/dist/mcp/MCPServerFactory.js +0 -73
  135. package/dist/mcp/NoopLikeC4MCPServer.d.ts +0 -9
  136. package/dist/mcp/NoopLikeC4MCPServer.js +0 -17
  137. package/dist/mcp/interfaces.d.ts +0 -13
  138. package/dist/mcp/interfaces.js +0 -4
  139. package/dist/mcp/server/StdioLikeC4MCPServer.d.ts +0 -16
  140. package/dist/mcp/server/StdioLikeC4MCPServer.js +0 -51
  141. package/dist/mcp/server/StreamableLikeC4MCPServer.d.ts +0 -16
  142. package/dist/mcp/server/StreamableLikeC4MCPServer.js +0 -121
  143. package/dist/mcp/server/WithMCPServer.d.ts +0 -4
  144. package/dist/mcp/server/WithMCPServer.js +0 -54
  145. package/dist/mcp/tools/_common.d.ts +0 -88
  146. package/dist/mcp/tools/_common.js +0 -49
  147. package/dist/mcp/tools/find-relationships.d.ts +0 -202
  148. package/dist/mcp/tools/find-relationships.js +0 -150
  149. package/dist/mcp/tools/list-projects.d.ts +0 -194
  150. package/dist/mcp/tools/list-projects.js +0 -62
  151. package/dist/mcp/tools/open-view.d.ts +0 -200
  152. package/dist/mcp/tools/open-view.js +0 -52
  153. package/dist/mcp/tools/read-deployment.d.ts +0 -200
  154. package/dist/mcp/tools/read-deployment.js +0 -150
  155. package/dist/mcp/tools/read-element.d.ts +0 -200
  156. package/dist/mcp/tools/read-element.js +0 -218
  157. package/dist/mcp/tools/read-project-summary.d.ts +0 -198
  158. package/dist/mcp/tools/read-project-summary.js +0 -176
  159. package/dist/mcp/tools/read-view.d.ts +0 -200
  160. package/dist/mcp/tools/read-view.js +0 -203
  161. package/dist/mcp/tools/search-element.d.ts +0 -198
  162. package/dist/mcp/tools/search-element.js +0 -177
  163. package/dist/mcp/utils.d.ts +0 -18
  164. package/dist/mcp/utils.js +0 -48
  165. package/dist/model/builder/MergedExtends.d.ts +0 -13
  166. package/dist/model/builder/MergedExtends.js +0 -74
  167. package/dist/model/builder/MergedSpecification.d.ts +0 -32
  168. package/dist/model/builder/MergedSpecification.js +0 -175
  169. package/dist/model/builder/buildModel.d.ts +0 -16
  170. package/dist/model/builder/buildModel.js +0 -245
  171. package/dist/model/deployments-index.d.ts +0 -10
  172. package/dist/model/deployments-index.js +0 -102
  173. package/dist/model/fqn-index.d.ts +0 -61
  174. package/dist/model/fqn-index.js +0 -253
  175. package/dist/model/index.d.ts +0 -6
  176. package/dist/model/index.js +0 -6
  177. package/dist/model/model-builder.d.ts +0 -54
  178. package/dist/model/model-builder.js +0 -233
  179. package/dist/model/model-locator.d.ts +0 -39
  180. package/dist/model/model-locator.js +0 -240
  181. package/dist/model/model-parser-where.d.ts +0 -4
  182. package/dist/model/model-parser-where.js +0 -81
  183. package/dist/model/model-parser.d.ts +0 -645
  184. package/dist/model/model-parser.js +0 -133
  185. package/dist/model/parser/Base.d.ts +0 -69
  186. package/dist/model/parser/Base.js +0 -382
  187. package/dist/model/parser/DeploymentModelParser.d.ts +0 -71
  188. package/dist/model/parser/DeploymentModelParser.js +0 -176
  189. package/dist/model/parser/DeploymentViewParser.d.ts +0 -75
  190. package/dist/model/parser/DeploymentViewParser.js +0 -86
  191. package/dist/model/parser/FqnRefParser.d.ts +0 -66
  192. package/dist/model/parser/FqnRefParser.js +0 -382
  193. package/dist/model/parser/GlobalsParser.d.ts +0 -109
  194. package/dist/model/parser/GlobalsParser.js +0 -84
  195. package/dist/model/parser/ImportsParser.d.ts +0 -46
  196. package/dist/model/parser/ImportsParser.js +0 -24
  197. package/dist/model/parser/ModelParser.d.ts +0 -71
  198. package/dist/model/parser/ModelParser.js +0 -209
  199. package/dist/model/parser/PredicatesParser.d.ts +0 -75
  200. package/dist/model/parser/PredicatesParser.js +0 -45
  201. package/dist/model/parser/SpecificationParser.d.ts +0 -53
  202. package/dist/model/parser/SpecificationParser.js +0 -113
  203. package/dist/model/parser/ValueConverter.d.ts +0 -4
  204. package/dist/model/parser/ValueConverter.js +0 -12
  205. package/dist/model/parser/ViewsParser.d.ts +0 -112
  206. package/dist/model/parser/ViewsParser.js +0 -492
  207. package/dist/model-change/ModelChanges.d.ts +0 -18
  208. package/dist/model-change/ModelChanges.js +0 -129
  209. package/dist/model-change/changeElementStyle.d.ts +0 -16
  210. package/dist/model-change/changeElementStyle.js +0 -134
  211. package/dist/model-change/changeViewLayout.d.ts +0 -12
  212. package/dist/model-change/changeViewLayout.js +0 -28
  213. package/dist/model-change/removeManualLayoutV1.d.ts +0 -7
  214. package/dist/model-change/removeManualLayoutV1.js +0 -27
  215. package/dist/module.d.ts +0 -92
  216. package/dist/module.js +0 -143
  217. package/dist/protocol.d.ts +0 -289
  218. package/dist/protocol.js +0 -123
  219. package/dist/references/index.d.ts +0 -3
  220. package/dist/references/index.js +0 -3
  221. package/dist/references/name-provider.d.ts +0 -9
  222. package/dist/references/name-provider.js +0 -37
  223. package/dist/references/scope-computation.d.ts +0 -20
  224. package/dist/references/scope-computation.js +0 -288
  225. package/dist/references/scope-provider.d.ts +0 -40
  226. package/dist/references/scope-provider.js +0 -239
  227. package/dist/shared/NodeKindProvider.d.ts +0 -15
  228. package/dist/shared/NodeKindProvider.js +0 -57
  229. package/dist/shared/WorkspaceSymbolProvider.d.ts +0 -3
  230. package/dist/shared/WorkspaceSymbolProvider.js +0 -3
  231. package/dist/shared/index.d.ts +0 -2
  232. package/dist/shared/index.js +0 -2
  233. package/dist/test/index.d.ts +0 -1
  234. package/dist/test/index.js +0 -1
  235. package/dist/test/testServices.d.ts +0 -64
  236. package/dist/test/testServices.js +0 -210
  237. package/dist/utils/disposable.d.ts +0 -8
  238. package/dist/utils/disposable.js +0 -26
  239. package/dist/utils/elementRef.d.ts +0 -11
  240. package/dist/utils/elementRef.js +0 -33
  241. package/dist/utils/fqnRef.d.ts +0 -11
  242. package/dist/utils/fqnRef.js +0 -63
  243. package/dist/utils/index.d.ts +0 -11
  244. package/dist/utils/index.js +0 -35
  245. package/dist/utils/printDocs.d.ts +0 -2
  246. package/dist/utils/printDocs.js +0 -1
  247. package/dist/utils/projectId.d.ts +0 -4
  248. package/dist/utils/projectId.js +0 -16
  249. package/dist/utils/stringHash.d.ts +0 -1
  250. package/dist/utils/stringHash.js +0 -5
  251. package/dist/validation/DocumentValidator.d.ts +0 -11
  252. package/dist/validation/DocumentValidator.js +0 -17
  253. package/dist/validation/_shared.d.ts +0 -3
  254. package/dist/validation/_shared.js +0 -26
  255. package/dist/validation/deployment-checks.d.ts +0 -7
  256. package/dist/validation/deployment-checks.js +0 -140
  257. package/dist/validation/dynamic-view.d.ts +0 -6
  258. package/dist/validation/dynamic-view.js +0 -67
  259. package/dist/validation/element-ref.d.ts +0 -4
  260. package/dist/validation/element-ref.js +0 -12
  261. package/dist/validation/element.d.ts +0 -4
  262. package/dist/validation/element.js +0 -49
  263. package/dist/validation/imports.d.ts +0 -4
  264. package/dist/validation/imports.js +0 -46
  265. package/dist/validation/index.d.ts +0 -15
  266. package/dist/validation/index.js +0 -167
  267. package/dist/validation/property-checks.d.ts +0 -7
  268. package/dist/validation/property-checks.js +0 -108
  269. package/dist/validation/relation.d.ts +0 -6
  270. package/dist/validation/relation.js +0 -141
  271. package/dist/validation/specification.d.ts +0 -12
  272. package/dist/validation/specification.js +0 -190
  273. package/dist/validation/view-checks.d.ts +0 -4
  274. package/dist/validation/view-checks.js +0 -46
  275. package/dist/validation/view-predicates/fqn-expr-with.d.ts +0 -4
  276. package/dist/validation/view-predicates/fqn-expr-with.js +0 -43
  277. package/dist/validation/view-predicates/fqn-ref-expr.d.ts +0 -4
  278. package/dist/validation/view-predicates/fqn-ref-expr.js +0 -51
  279. package/dist/validation/view-predicates/incoming.d.ts +0 -4
  280. package/dist/validation/view-predicates/incoming.js +0 -16
  281. package/dist/validation/view-predicates/index.d.ts +0 -6
  282. package/dist/validation/view-predicates/index.js +0 -6
  283. package/dist/validation/view-predicates/outgoing.d.ts +0 -4
  284. package/dist/validation/view-predicates/outgoing.js +0 -20
  285. package/dist/validation/view-predicates/relation-expr.d.ts +0 -4
  286. package/dist/validation/view-predicates/relation-expr.js +0 -46
  287. package/dist/validation/view-predicates/relation-with.d.ts +0 -4
  288. package/dist/validation/view-predicates/relation-with.js +0 -16
  289. package/dist/validation/view.d.ts +0 -4
  290. package/dist/validation/view.js +0 -42
  291. package/dist/view-utils/assignNavigateTo.d.ts +0 -2
  292. package/dist/view-utils/assignNavigateTo.js +0 -27
  293. package/dist/view-utils/index.d.ts +0 -2
  294. package/dist/view-utils/index.js +0 -2
  295. package/dist/view-utils/manual-layout.d.ts +0 -13
  296. package/dist/view-utils/manual-layout.js +0 -149
  297. package/dist/views/ConfigurableLayouter.d.ts +0 -7
  298. package/dist/views/ConfigurableLayouter.js +0 -51
  299. package/dist/views/LikeC4ManualLayouts.d.ts +0 -42
  300. package/dist/views/LikeC4ManualLayouts.js +0 -209
  301. package/dist/views/LikeC4Views.d.ts +0 -89
  302. package/dist/views/LikeC4Views.js +0 -216
  303. package/dist/views/index.d.ts +0 -4
  304. package/dist/views/index.js +0 -11
  305. package/dist/workspace/AstNodeDescriptionProvider.d.ts +0 -7
  306. package/dist/workspace/AstNodeDescriptionProvider.js +0 -18
  307. package/dist/workspace/IndexManager.d.ts +0 -10
  308. package/dist/workspace/IndexManager.js +0 -26
  309. package/dist/workspace/LangiumDocuments.d.ts +0 -29
  310. package/dist/workspace/LangiumDocuments.js +0 -104
  311. package/dist/workspace/ProjectsManager.d.ts +0 -134
  312. package/dist/workspace/ProjectsManager.js +0 -610
  313. package/dist/workspace/WorkspaceManager.d.ts +0 -31
  314. package/dist/workspace/WorkspaceManager.js +0 -132
  315. package/dist/workspace/index.d.ts +0 -5
  316. package/dist/workspace/index.js +0 -5
@@ -1,61 +0,0 @@
1
- import { type ProjectId, Fqn } from '@likec4/core/types';
2
- import { DefaultWeakMap, MultiMap } from '@likec4/core/utils';
3
- import { type Stream, WorkspaceCache } from 'langium';
4
- import { type AstNodeDescriptionWithFqn, type LikeC4LangiumDocument, ast } from '../ast';
5
- import type { LikeC4Services } from '../module';
6
- import { ADisposable } from '../utils';
7
- import { type LangiumDocuments, ProjectsManager } from '../workspace';
8
- export declare class FqnIndex<AstNd = ast.Element> extends ADisposable {
9
- protected services: LikeC4Services;
10
- protected projects: ProjectsManager;
11
- protected langiumDocuments: LangiumDocuments;
12
- protected documentCache: DefaultWeakMap<LikeC4LangiumDocument, DocumentFqnIndex>;
13
- protected workspaceCache: WorkspaceCache<string, AstNodeDescriptionWithFqn[]>;
14
- constructor(services: LikeC4Services);
15
- private documents;
16
- get(document: LikeC4LangiumDocument): DocumentFqnIndex;
17
- resolve(reference: ast.Referenceable): Fqn;
18
- getFqn(el: AstNd): Fqn;
19
- byFqn(projectId: ProjectId, fqn: Fqn): Stream<AstNodeDescriptionWithFqn>;
20
- rootElements(projectId: ProjectId): Stream<AstNodeDescriptionWithFqn>;
21
- directChildrenOf(projectId: ProjectId, parent: Fqn): Stream<AstNodeDescriptionWithFqn>;
22
- /**
23
- * Returns descedant elements with unique names in the scope
24
- */
25
- uniqueDescedants(projectId: ProjectId, parent: Fqn): Stream<AstNodeDescriptionWithFqn>;
26
- protected createDocumentIndex(document: LikeC4LangiumDocument): DocumentFqnIndex;
27
- }
28
- export declare class DocumentFqnIndex {
29
- private _rootElements;
30
- /**
31
- * direct children of elements
32
- */
33
- private _children;
34
- /**
35
- * All descendants of an element (unique by name)
36
- */
37
- private _descendants;
38
- /**
39
- * All elements by FQN
40
- */
41
- private _byfqn;
42
- readonly projectId: ProjectId;
43
- static readonly EMPTY: DocumentFqnIndex;
44
- constructor(_rootElements: Array<AstNodeDescriptionWithFqn>,
45
- /**
46
- * direct children of elements
47
- */
48
- _children: MultiMap<Fqn, AstNodeDescriptionWithFqn>,
49
- /**
50
- * All descendants of an element (unique by name)
51
- */
52
- _descendants: MultiMap<Fqn, AstNodeDescriptionWithFqn>,
53
- /**
54
- * All elements by FQN
55
- */
56
- _byfqn: MultiMap<Fqn, AstNodeDescriptionWithFqn>, projectId: ProjectId);
57
- rootElements(): readonly AstNodeDescriptionWithFqn[];
58
- byFqn(fqn: Fqn): readonly AstNodeDescriptionWithFqn[];
59
- children(parent: Fqn): readonly AstNodeDescriptionWithFqn[];
60
- descendants(nodeName: Fqn): readonly AstNodeDescriptionWithFqn[];
61
- }
@@ -1,253 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- //
3
- // Copyright (c) 2023-2025 Denis Davydkov
4
- // Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
5
- //
6
- // Portions of this file have been modified by NVIDIA CORPORATION & AFFILIATES.
7
- import { invariant, nonNullable } from '@likec4/core';
8
- import { Fqn } from '@likec4/core/types';
9
- import { ancestorsFqn, compareNatural, DefaultWeakMap, MultiMap, sortNaturalByFqn } from '@likec4/core/utils';
10
- import { AstUtils, DocumentState, stream, WorkspaceCache, } from 'langium';
11
- import { isDefined, isEmpty, isTruthy } from 'remeda';
12
- import { ast, ElementOps, isLikeC4LangiumDocument, } from '../ast';
13
- import { logWarnError } from '../logger';
14
- import { ADisposable } from '../utils';
15
- import { readStrictFqn } from '../utils/elementRef';
16
- import { ProjectsManager } from '../workspace';
17
- export class FqnIndex extends ADisposable {
18
- services;
19
- projects;
20
- langiumDocuments;
21
- documentCache;
22
- workspaceCache;
23
- constructor(services) {
24
- super();
25
- this.services = services;
26
- this.langiumDocuments = services.shared.workspace.LangiumDocuments;
27
- this.projects = services.shared.workspace.ProjectsManager;
28
- this.documentCache = new DefaultWeakMap(doc => this.createDocumentIndex(doc));
29
- this.workspaceCache = new WorkspaceCache(services.shared, DocumentState.IndexedContent);
30
- this.onDispose(services.shared.workspace.DocumentBuilder.onDocumentPhase(DocumentState.IndexedContent, (doc) => {
31
- if (isLikeC4LangiumDocument(doc)) {
32
- this.documentCache.delete(doc);
33
- }
34
- }));
35
- }
36
- documents(projectId) {
37
- return this.langiumDocuments.projectDocuments(projectId).filter((d) => isLikeC4LangiumDocument(d)
38
- && d.state >= DocumentState.IndexedContent);
39
- }
40
- get(document) {
41
- if (document.state < DocumentState.IndexedContent) {
42
- logWarnError(`Document ${document.uri.path} is not indexed`);
43
- }
44
- return this.documentCache.get(document);
45
- }
46
- resolve(reference) {
47
- if (reference.$type === 'Imported') {
48
- return this.getFqn(reference.imported.ref);
49
- }
50
- if (reference.$type === 'Element') {
51
- return this.getFqn(reference);
52
- }
53
- return this.services.likec4.DeploymentsIndex.getFqn(reference);
54
- }
55
- getFqn(el) {
56
- invariant(ast.isElement(el) || ast.isDeploymentElement(el));
57
- let id = ElementOps.readId(el);
58
- if (isTruthy(id)) {
59
- return id;
60
- }
61
- // Document index is not yet created
62
- const doc = AstUtils.getDocument(el);
63
- invariant(isLikeC4LangiumDocument(doc));
64
- // Ensure the document is indexed
65
- this.get(doc);
66
- // This will create the document index
67
- return nonNullable(ElementOps.readId(el), 'Element fqn must be set, invalid state');
68
- }
69
- byFqn(projectId, fqn) {
70
- return stream(this.workspaceCache.get(`${projectId}:fqn:${fqn}`, () => {
71
- return this
72
- .documents(projectId)
73
- .flatMap(doc => {
74
- return this.get(doc).byFqn(fqn);
75
- })
76
- .toArray();
77
- }));
78
- }
79
- rootElements(projectId) {
80
- return stream(this.workspaceCache.get(`${projectId}:rootElements`, () => {
81
- const allchildren = this.documents(projectId)
82
- .reduce((map, doc) => {
83
- this.get(doc).rootElements().forEach(desc => {
84
- map.set(desc.name, desc);
85
- });
86
- return map;
87
- }, new MultiMap());
88
- return uniqueByName(allchildren);
89
- }));
90
- }
91
- directChildrenOf(projectId, parent) {
92
- return stream(this.workspaceCache.get(`${projectId}:directChildrenOf:${parent}`, () => {
93
- const allchildren = this.documents(projectId)
94
- .reduce((map, doc) => {
95
- this.get(doc).children(parent).forEach(desc => {
96
- map.set(desc.name, desc);
97
- });
98
- return map;
99
- }, new MultiMap());
100
- return uniqueByName(allchildren);
101
- }));
102
- }
103
- /**
104
- * Returns descedant elements with unique names in the scope
105
- */
106
- uniqueDescedants(projectId, parent) {
107
- return stream(this.workspaceCache.get(`${projectId}:uniqueDescedants:${parent}`, () => {
108
- const { children, descendants } = this.documents(projectId)
109
- .reduce((map, doc) => {
110
- const docIndex = this.get(doc);
111
- docIndex.children(parent).forEach(desc => {
112
- map.children.set(desc.name, desc);
113
- });
114
- docIndex.descendants(parent).forEach(desc => {
115
- map.descendants.set(desc.name, desc);
116
- });
117
- return map;
118
- }, {
119
- children: new MultiMap(),
120
- descendants: new MultiMap(),
121
- });
122
- const uniqueChildren = uniqueByName(children);
123
- const uniqueDescendants = [...descendants.associations()]
124
- .flatMap(([_name, descs]) => descs.length === 1 && !children.has(_name) ? descs : []);
125
- return [
126
- ...uniqueChildren,
127
- ...sortNaturalByFqn(uniqueDescendants),
128
- ];
129
- }));
130
- }
131
- createDocumentIndex(document) {
132
- const rootElements = document.parseResult.value.models.flatMap(m => m.elements);
133
- if (rootElements.length === 0) {
134
- return DocumentFqnIndex.EMPTY;
135
- }
136
- const projectId = document.likec4ProjectId ?? this.projects.belongsTo(document);
137
- const root = new Array();
138
- const children = new MultiMap();
139
- const descendants = new MultiMap();
140
- const byfqn = new MultiMap();
141
- const Descriptions = this.services.workspace.AstNodeDescriptionProvider;
142
- const createAndSaveDescription = (node, name, fqn) => {
143
- const desc = Object.assign(Descriptions.createDescription(node, name, document), {
144
- id: fqn,
145
- likec4ProjectId: projectId,
146
- });
147
- ElementOps.writeId(node, fqn);
148
- byfqn.set(fqn, desc);
149
- return desc;
150
- };
151
- const traverseNode = (el, parentFqn) => {
152
- let thisFqn;
153
- if (ast.isElement(el)) {
154
- thisFqn = Fqn(el.name, parentFqn);
155
- const desc = createAndSaveDescription(el, el.name, thisFqn);
156
- if (!parentFqn) {
157
- root.push(desc);
158
- }
159
- else {
160
- children.set(parentFqn, desc);
161
- }
162
- }
163
- else {
164
- thisFqn = readStrictFqn(el.element);
165
- }
166
- let _nested = [];
167
- if (isDefined(el.body) && !isEmpty(el.body.elements)) {
168
- for (const child of el.body.elements) {
169
- if (!ast.isRelation(child) && !ast.isExtendRelation(child)) {
170
- try {
171
- _nested.push(...traverseNode(child, thisFqn));
172
- }
173
- catch (e) {
174
- logWarnError(e);
175
- }
176
- }
177
- }
178
- }
179
- const directChildren = children.get(thisFqn) ?? [];
180
- _nested = [
181
- ...directChildren,
182
- ..._nested,
183
- ];
184
- for (const child of _nested) {
185
- descendants.set(thisFqn, child);
186
- }
187
- if (ast.isExtendElement(el)) {
188
- for (const ancestor of ancestorsFqn(thisFqn)) {
189
- for (const child of _nested) {
190
- descendants.set(ancestor, child);
191
- }
192
- }
193
- }
194
- return descendants.get(thisFqn) ?? [];
195
- };
196
- for (const node of rootElements) {
197
- try {
198
- if (ast.isRelation(node) || ast.isExtendRelation(node)) {
199
- continue;
200
- }
201
- traverseNode(node, null);
202
- }
203
- catch (e) {
204
- logWarnError(e);
205
- }
206
- }
207
- return new DocumentFqnIndex(root, children, descendants, byfqn, projectId);
208
- }
209
- }
210
- function uniqueByName(multimap) {
211
- return [...multimap.associations()]
212
- .flatMap(([_name, descs]) => (descs.length === 1 ? descs : []))
213
- .sort((a, b) => compareNatural(a.name, b.name));
214
- }
215
- export class DocumentFqnIndex {
216
- _rootElements;
217
- _children;
218
- _descendants;
219
- _byfqn;
220
- projectId;
221
- static EMPTY = new DocumentFqnIndex([], new MultiMap(), new MultiMap(), new MultiMap(), ProjectsManager.DefaultProjectId);
222
- constructor(_rootElements,
223
- /**
224
- * direct children of elements
225
- */
226
- _children,
227
- /**
228
- * All descendants of an element (unique by name)
229
- */
230
- _descendants,
231
- /**
232
- * All elements by FQN
233
- */
234
- _byfqn, projectId) {
235
- this._rootElements = _rootElements;
236
- this._children = _children;
237
- this._descendants = _descendants;
238
- this._byfqn = _byfqn;
239
- this.projectId = projectId;
240
- }
241
- rootElements() {
242
- return this._rootElements;
243
- }
244
- byFqn(fqn) {
245
- return this._byfqn.get(fqn) ?? [];
246
- }
247
- children(parent) {
248
- return this._children.get(parent) ?? [];
249
- }
250
- descendants(nodeName) {
251
- return this._descendants.get(nodeName) ?? [];
252
- }
253
- }
@@ -1,6 +0,0 @@
1
- export * from './deployments-index';
2
- export * from './fqn-index';
3
- export * from './model-builder';
4
- export * from './model-locator';
5
- export * from './model-parser';
6
- export * from './parser/ValueConverter';
@@ -1,6 +0,0 @@
1
- export * from './deployments-index';
2
- export * from './fqn-index';
3
- export * from './model-builder';
4
- export * from './model-locator';
5
- export * from './model-parser';
6
- export * from './parser/ValueConverter';
@@ -1,54 +0,0 @@
1
- import { type LayoutedView, type ProjectId, type UnknownComputed, type UnknownParsed, type ViewId } from '@likec4/core';
2
- import { LikeC4Model } from '@likec4/core/model';
3
- import type * as c4 from '@likec4/core/types';
4
- import { type URI, Disposable } from 'langium';
5
- import type { CancellationToken } from 'vscode-jsonrpc';
6
- import type { LikeC4Services } from '../module';
7
- import { ADisposable } from '../utils';
8
- type ModelParsedListener = (docs: URI[]) => void;
9
- type ManualLayouts = Record<ViewId, LayoutedView> | null;
10
- export interface LikeC4ModelBuilder extends Disposable {
11
- parseModel(projectId?: ProjectId | undefined, cancelToken?: CancellationToken): Promise<LikeC4Model<UnknownParsed> | null>;
12
- unsafeSyncComputeModel(projectId: ProjectId): LikeC4Model<UnknownComputed>;
13
- computeModel(projectId?: ProjectId | undefined, cancelToken?: CancellationToken): Promise<LikeC4Model<UnknownComputed>>;
14
- onModelParsed(callback: ModelParsedListener): Disposable;
15
- clearCache(): void;
16
- }
17
- export declare class DefaultLikeC4ModelBuilder extends ADisposable implements LikeC4ModelBuilder {
18
- private projects;
19
- private parser;
20
- private listeners;
21
- private cache;
22
- private DocumentBuilder;
23
- private manualLayouts;
24
- private mutex;
25
- constructor(services: LikeC4Services);
26
- /**
27
- * WARNING:
28
- * This method is internal and should to be called only when all documents are known to be parsed.
29
- * Otherwise, the model may be incomplete.
30
- *
31
- * To avoid circular dependencies, we do not resolve imports here.
32
- */
33
- private unsafeSyncParseModelData;
34
- /**
35
- * To avoid circular dependencies, first we parse all documents and then we join them.
36
- */
37
- private unsafeSyncJoinedModelData;
38
- parseModel(projectId?: c4.ProjectId | undefined, cancelToken?: CancellationToken): Promise<LikeC4Model<UnknownParsed>>;
39
- private previousViews;
40
- /**
41
- * WARNING:
42
- * This method is internal and should to be called only when all documents are known to be parsed.
43
- * Otherwise, the model may be incomplete.
44
- *
45
- * @internal
46
- */
47
- unsafeSyncComputeModel(projectId: c4.ProjectId, manualLayouts?: ManualLayouts): LikeC4Model<UnknownComputed>;
48
- computeModel(projectId?: c4.ProjectId | undefined, cancelToken?: CancellationToken): Promise<LikeC4Model<UnknownComputed>>;
49
- onModelParsed(callback: ModelParsedListener): Disposable;
50
- clearCache(): void;
51
- private documents;
52
- private notifyListeners;
53
- }
54
- export {};
@@ -1,233 +0,0 @@
1
- import { _stage, } from '@likec4/core';
2
- import { computeView } from '@likec4/core/compute-view';
3
- import { LikeC4Model } from '@likec4/core/model';
4
- import { loggable } from '@likec4/log';
5
- import { deepEqual as eq } from 'fast-equals';
6
- import { Disposable, DocumentState, interruptAndCheck, WorkspaceCache, } from 'langium';
7
- import { hasAtLeast, isEmpty, mapToObj, values, } from 'remeda';
8
- import { isLikeC4Builtin } from '../likec4lib';
9
- import { logger as mainLogger } from '../logger';
10
- import { ADisposable, performanceMark } from '../utils';
11
- import { assignNavigateTo } from '../view-utils';
12
- import { buildModelData } from './builder/buildModel';
13
- const parsedWithoutImportsCacheKey = (projectId) => `parsed-without-imports-${projectId}`;
14
- const parsedModelCacheKey = (projectId) => `parsed-model-${projectId}`;
15
- const computedModelCacheKey = (projectId) => `computed-model-${projectId}`;
16
- const builderLogger = mainLogger.getChild('model-builder');
17
- export class DefaultLikeC4ModelBuilder extends ADisposable {
18
- projects;
19
- parser;
20
- listeners = [];
21
- cache;
22
- DocumentBuilder;
23
- manualLayouts;
24
- mutex;
25
- constructor(services) {
26
- super();
27
- this.projects = services.shared.workspace.ProjectsManager;
28
- this.parser = services.likec4.ModelParser;
29
- this.cache = services.shared.workspace.Cache;
30
- this.DocumentBuilder = services.shared.workspace.DocumentBuilder;
31
- this.mutex = services.shared.workspace.WorkspaceLock;
32
- this.manualLayouts = services.likec4.ManualLayouts;
33
- this.onDispose(this.DocumentBuilder.onUpdate((_changed, deleted) => {
34
- if (deleted.length > 0) {
35
- this.notifyListeners(deleted);
36
- }
37
- }));
38
- this.onDispose(this.DocumentBuilder.onBuildPhase(DocumentState.Validated, (docs, _cancelToken) => {
39
- const validated = docs.flatMap(d => isLikeC4Builtin(d.uri) || this.projects.isExcluded(d) ? [] : d.uri);
40
- if (validated.length > 0) {
41
- this.notifyListeners(validated);
42
- }
43
- }));
44
- builderLogger.debug `created`;
45
- }
46
- /**
47
- * WARNING:
48
- * This method is internal and should to be called only when all documents are known to be parsed.
49
- * Otherwise, the model may be incomplete.
50
- *
51
- * To avoid circular dependencies, we do not resolve imports here.
52
- */
53
- unsafeSyncParseModelData(projectId) {
54
- const cache = this.cache;
55
- const key = parsedWithoutImportsCacheKey(projectId);
56
- return cache.get(key, () => {
57
- const logger = builderLogger.getChild(projectId);
58
- try {
59
- const project = this.projects.getProject(projectId);
60
- const docs = this.documents(projectId);
61
- if (docs.length === 0) {
62
- logger.debug `unsafeSyncParseModelData: skipped due to no documents`;
63
- return null;
64
- }
65
- logger.debug `unsafeSyncParseModelData: completed`;
66
- return buildModelData(project, docs);
67
- }
68
- catch (err) {
69
- builderLogger.warn(`unsafeSyncParseModelData failed for project ${projectId}`, { err });
70
- return null;
71
- }
72
- });
73
- }
74
- /**
75
- * To avoid circular dependencies, first we parse all documents and then we join them.
76
- */
77
- unsafeSyncJoinedModelData(projectId) {
78
- const logger = builderLogger.getChild(projectId);
79
- const result = this.unsafeSyncParseModelData(projectId);
80
- if (!result) {
81
- return null;
82
- }
83
- if (result.imports.size === 0) {
84
- return result.data;
85
- }
86
- logger.debug `processing imports of ${projectId}`;
87
- const imports = [...result.imports.associations()].reduce((acc, [projectId, fqns]) => {
88
- if (fqns.size === 0) {
89
- return acc;
90
- }
91
- const anotherProject = this.unsafeSyncParseModelData(projectId);
92
- if (anotherProject) {
93
- const imported = [...fqns].flatMap(fqn => anotherProject.data.elements[fqn] ?? []);
94
- if (hasAtLeast(imported, 1)) {
95
- acc[projectId] = structuredClone(imported);
96
- }
97
- }
98
- return acc;
99
- }, {});
100
- return {
101
- ...result.data,
102
- imports,
103
- };
104
- }
105
- async parseModel(projectId, cancelToken) {
106
- projectId = this.projects.ensureProjectId(projectId);
107
- const logger = builderLogger.getChild(projectId);
108
- const cache = this.cache;
109
- const t0 = performanceMark();
110
- return await this.mutex.read(async () => {
111
- if (cancelToken?.isCancellationRequested) {
112
- await interruptAndCheck(cancelToken);
113
- }
114
- const key = parsedModelCacheKey(projectId);
115
- if (cache.has(key)) {
116
- logger.debug `parseModel from cache`;
117
- }
118
- return cache.get(key, () => {
119
- const parsedModel = this.unsafeSyncJoinedModelData(projectId);
120
- if (!parsedModel) {
121
- logger.debug `parseModel: returning EMPTY`;
122
- return LikeC4Model.EMPTY.asParsed;
123
- }
124
- logger.debug `parseModel in ${t0.pretty}`;
125
- return LikeC4Model.create(parsedModel);
126
- });
127
- });
128
- }
129
- previousViews = {};
130
- /**
131
- * WARNING:
132
- * This method is internal and should to be called only when all documents are known to be parsed.
133
- * Otherwise, the model may be incomplete.
134
- *
135
- * @internal
136
- */
137
- unsafeSyncComputeModel(projectId, manualLayouts) {
138
- const cache = this.cache;
139
- const hasManualLayouts = !!manualLayouts && !isEmpty(manualLayouts);
140
- const key = computedModelCacheKey(projectId) + (hasManualLayouts ? '+manualLayouts' : '');
141
- return cache.get(key, () => {
142
- const logger = builderLogger.getChild(projectId);
143
- const parsedModelData = this.unsafeSyncJoinedModelData(projectId);
144
- if (!parsedModelData) {
145
- logger.debug `unsafeSyncComputeModel: returning EMPTY`;
146
- return LikeC4Model.EMPTY.asComputed;
147
- }
148
- const parsedModel = LikeC4Model.create(parsedModelData);
149
- const allViews = [];
150
- for (const view of values(parsedModelData.views)) {
151
- const result = computeView(view, parsedModel);
152
- if (!result.isSuccess) {
153
- logger.warn(loggable(result.error));
154
- continue;
155
- }
156
- if (manualLayouts?.[view.id]) {
157
- Object.assign(result.view,
158
- // satisfies enforces that the object has the property
159
- { hasManualLayout: true });
160
- }
161
- allViews.push(result.view);
162
- }
163
- assignNavigateTo(allViews);
164
- const views = mapToObj(allViews, v => {
165
- const key = computedViewKey(projectId, v.id);
166
- const previous = this.previousViews[key];
167
- const view = previous && eq(v, previous) ? previous : v;
168
- this.previousViews[key] = view;
169
- return [v.id, view];
170
- });
171
- const data = {
172
- ...parsedModelData,
173
- [_stage]: 'computed',
174
- views,
175
- };
176
- if (hasManualLayouts) {
177
- data.manualLayouts = manualLayouts;
178
- }
179
- logger.debug(`unsafeSyncComputeModel${hasManualLayouts ? ' with manual layouts' : ''}: completed`);
180
- return LikeC4Model.create(data);
181
- });
182
- }
183
- async computeModel(projectId, cancelToken) {
184
- projectId = this.projects.ensureProjectId(projectId);
185
- const logger = builderLogger.getChild(projectId);
186
- const t0 = performanceMark();
187
- return await this.mutex.read(async () => {
188
- if (cancelToken?.isCancellationRequested) {
189
- await interruptAndCheck(cancelToken);
190
- }
191
- const project = this.projects.getProject(projectId);
192
- const manualLayouts = await this.manualLayouts.read(project);
193
- const result = this.unsafeSyncComputeModel(projectId, manualLayouts);
194
- if (result === LikeC4Model.EMPTY) {
195
- logger.debug(`computeModel returned EMPTY`);
196
- }
197
- else if (t0.ms > 10) {
198
- logger.debug(`computeModel completed in ${t0.pretty}`);
199
- }
200
- return result;
201
- });
202
- }
203
- onModelParsed(callback) {
204
- this.listeners.push(callback);
205
- return Disposable.create(() => {
206
- const index = this.listeners.indexOf(callback);
207
- if (index >= 0) {
208
- this.listeners.splice(index, 1);
209
- }
210
- });
211
- }
212
- clearCache() {
213
- builderLogger.debug(`clearCache`);
214
- this.cache.clear();
215
- this.previousViews = {};
216
- }
217
- documents(projectId) {
218
- return this.parser.documents(projectId).toArray();
219
- }
220
- notifyListeners(docs) {
221
- for (const listener of this.listeners) {
222
- try {
223
- listener(docs);
224
- }
225
- catch (e) {
226
- builderLogger.warn(loggable(e));
227
- }
228
- }
229
- }
230
- }
231
- function computedViewKey(projectId, viewId) {
232
- return `computed-view-${projectId}-${viewId}`;
233
- }
@@ -1,39 +0,0 @@
1
- import type * as c4 from '@likec4/core';
2
- import type { Cancellation } from 'langium';
3
- import type { Location, Range } from 'vscode-languageserver-types';
4
- import { URI } from 'vscode-uri';
5
- import type { ParsedAstElement, ParsedAstView, ParsedLikeC4LangiumDocument } from '../ast';
6
- import { ast } from '../ast';
7
- import type { LikeC4Services } from '../module';
8
- export type ViewLocateResult = {
9
- doc: ParsedLikeC4LangiumDocument;
10
- view: ParsedAstView;
11
- viewAst: ast.LikeC4View;
12
- };
13
- export declare class LikeC4ModelLocator {
14
- private services;
15
- private fqnIndex;
16
- private deploymentsIndex;
17
- private langiumDocuments;
18
- private parser;
19
- private projects;
20
- constructor(services: LikeC4Services);
21
- private documents;
22
- getParsedElement(...args: [ast.Element] | [c4.Fqn] | [c4.Fqn, c4.ProjectId]): ParsedAstElement | null;
23
- locateElement(fqn: c4.Fqn, projectId?: c4.ProjectId | undefined): Location | null;
24
- locateDeploymentElement(deploymentFqn: c4.DeploymentFqn, projectId?: c4.ProjectId | undefined): Location | null;
25
- locateRelation(relationId: c4.RelationId, projectId?: c4.ProjectId): Location | null;
26
- locateViewAst(viewId: c4.ViewId, projectId?: c4.ProjectId | undefined): null | ViewLocateResult;
27
- locateView(viewId: c4.ViewId, projectId?: c4.ProjectId): Location | null;
28
- locateDocumentTags(documentUri: URI, cancelToken?: Cancellation.CancellationToken): Promise<Array<{
29
- name: string;
30
- color: string;
31
- range: Range;
32
- isSpecification: boolean;
33
- }>>;
34
- locateDynamicViewStep(params: {
35
- view: c4.ViewId;
36
- astPath: string;
37
- projectId?: c4.ProjectId | undefined;
38
- }): Location | null;
39
- }