@likec4/language-server 0.37.0 → 0.40.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 (75) hide show
  1. package/dist/Rpc.d.ts +6 -0
  2. package/dist/Rpc.js +130 -0
  3. package/dist/ast.d.ts +0 -97
  4. package/dist/ast.js +127 -143
  5. package/dist/elementRef.d.ts +1 -2
  6. package/dist/elementRef.js +31 -44
  7. package/dist/generated/ast.d.ts +4 -5
  8. package/dist/generated/ast.js +310 -315
  9. package/dist/generated/grammar.d.ts +0 -2
  10. package/dist/generated/grammar.js +2 -3177
  11. package/dist/generated/module.d.ts +1 -6
  12. package/dist/generated/module.js +13 -18
  13. package/dist/index.d.ts +0 -1
  14. package/dist/index.js +2 -3
  15. package/dist/logger.d.ts +0 -1
  16. package/dist/logger.js +39 -42
  17. package/dist/lsp/CodeLensProvider.d.ts +0 -1
  18. package/dist/lsp/CodeLensProvider.js +28 -32
  19. package/dist/lsp/DocumentLinkProvider.d.ts +0 -1
  20. package/dist/lsp/DocumentLinkProvider.js +26 -33
  21. package/dist/lsp/DocumentSymbolProvider.d.ts +0 -1
  22. package/dist/lsp/DocumentSymbolProvider.js +165 -167
  23. package/dist/lsp/HoverProvider.d.ts +0 -1
  24. package/dist/lsp/HoverProvider.js +35 -48
  25. package/dist/lsp/SemanticTokenProvider.d.ts +0 -1
  26. package/dist/lsp/SemanticTokenProvider.js +153 -201
  27. package/dist/lsp/index.d.ts +0 -1
  28. package/dist/lsp/index.js +5 -6
  29. package/dist/model/fqn-computation.d.ts +0 -1
  30. package/dist/model/fqn-computation.js +39 -40
  31. package/dist/model/fqn-index.d.ts +0 -1
  32. package/dist/model/fqn-index.js +112 -142
  33. package/dist/model/index.d.ts +0 -1
  34. package/dist/model/index.js +5 -6
  35. package/dist/model/model-builder.d.ts +10 -6
  36. package/dist/model/model-builder.js +242 -157
  37. package/dist/model/model-locator.d.ts +1 -2
  38. package/dist/model/model-locator.js +102 -100
  39. package/dist/model/model-parser.d.ts +2 -7
  40. package/dist/model/model-parser.js +296 -287
  41. package/dist/module.d.ts +4 -2
  42. package/dist/module.js +69 -60
  43. package/dist/protocol.d.ts +16 -20
  44. package/dist/protocol.js +14 -22
  45. package/dist/references/index.d.ts +0 -1
  46. package/dist/references/index.js +2 -3
  47. package/dist/references/scope-computation.d.ts +2 -3
  48. package/dist/references/scope-computation.js +68 -70
  49. package/dist/references/scope-provider.d.ts +1 -2
  50. package/dist/references/scope-provider.js +126 -116
  51. package/dist/shared/WorkspaceManager.d.ts +2 -4
  52. package/dist/shared/WorkspaceManager.js +13 -16
  53. package/dist/shared/index.d.ts +0 -1
  54. package/dist/shared/index.js +1 -2
  55. package/dist/test/index.d.ts +0 -1
  56. package/dist/test/index.js +1 -2
  57. package/dist/test/testServices.d.ts +6 -7
  58. package/dist/test/testServices.js +64 -61
  59. package/dist/utils.d.ts +1 -1
  60. package/dist/utils.js +4 -3
  61. package/dist/validation/element.d.ts +0 -2
  62. package/dist/validation/element.js +28 -39
  63. package/dist/validation/index.d.ts +0 -1
  64. package/dist/validation/index.js +36 -46
  65. package/dist/validation/relation.d.ts +0 -2
  66. package/dist/validation/relation.js +43 -47
  67. package/dist/validation/specification.d.ts +0 -2
  68. package/dist/validation/specification.js +21 -30
  69. package/dist/validation/view.d.ts +0 -2
  70. package/dist/validation/view.js +16 -22
  71. package/package.json +20 -13
  72. package/contrib/likec4.monarch.ts +0 -48
  73. package/contrib/likec4.tmLanguage.json +0 -73
  74. package/dist/registerProtocolHandlers.d.ts +0 -3
  75. package/dist/registerProtocolHandlers.js +0 -112
package/dist/module.js CHANGED
@@ -1,69 +1,78 @@
1
- import { EmptyFileSystem, createDefaultModule, createDefaultSharedModule, inject } from 'langium';
2
- import { LikeC4GeneratedModule, LikeC4GeneratedSharedModule } from './generated/module';
3
- import { LikeC4CodeLensProvider, LikeC4DocumentLinkProvider, LikeC4DocumentSymbolProvider, LikeC4HoverProvider, LikeC4SemanticTokenProvider } from './lsp';
4
- import { FqnIndex, LikeC4ModelBuilder, LikeC4ModelLocator, LikeC4ModelParser } from './model';
5
- import { LikeC4ScopeComputation, LikeC4ScopeProvider } from './references';
6
- import { registerProtocolHandlers } from './registerProtocolHandlers';
7
- import { LikeC4WorkspaceManager } from './shared';
8
- import { registerValidationChecks } from './validation';
9
- import { logger } from './logger';
10
- import { serializeError } from '@likec4/core';
1
+ import {
2
+ WorkspaceCache
3
+ } from "langium";
4
+ import { EmptyFileSystem, createDefaultModule, createDefaultSharedModule, inject } from "langium";
5
+ import { LikeC4GeneratedModule, LikeC4GeneratedSharedModule } from "./generated/module.js";
6
+ import {
7
+ LikeC4CodeLensProvider,
8
+ LikeC4DocumentLinkProvider,
9
+ LikeC4DocumentSymbolProvider,
10
+ LikeC4HoverProvider,
11
+ LikeC4SemanticTokenProvider
12
+ } from "./lsp/index.js";
13
+ import { FqnIndex, LikeC4ModelBuilder, LikeC4ModelLocator, LikeC4ModelParser } from "./model/index.js";
14
+ import { LikeC4ScopeComputation, LikeC4ScopeProvider } from "./references/index.js";
15
+ import { Rpc } from "./Rpc.js";
16
+ import { LikeC4WorkspaceManager } from "./shared/index.js";
17
+ import { registerValidationChecks } from "./validation/index.js";
18
+ import { logger } from "./logger.js";
19
+ import { serializeError } from "@likec4/core";
11
20
  function bind(Type) {
12
- return (services) => new Type(services);
21
+ return (services) => new Type(services);
13
22
  }
14
23
  export const LikeC4Module = {
15
- likec4: {
16
- FqnIndex: bind(FqnIndex),
17
- ModelParser: bind(LikeC4ModelParser),
18
- ModelBuilder: bind(LikeC4ModelBuilder),
19
- ModelLocator: bind(LikeC4ModelLocator)
20
- },
21
- lsp: {
22
- DocumentSymbolProvider: bind(LikeC4DocumentSymbolProvider),
23
- SemanticTokenProvider: bind(LikeC4SemanticTokenProvider),
24
- HoverProvider: bind(LikeC4HoverProvider),
25
- CodeLensProvider: bind(LikeC4CodeLensProvider),
26
- DocumentLinkProvider: bind(LikeC4DocumentLinkProvider)
27
- },
28
- //
29
- // // Formatter: bind(LikeC4Formatter),
30
- //
31
- // },
32
- references: {
33
- ScopeComputation: bind(LikeC4ScopeComputation),
34
- ScopeProvider: bind(LikeC4ScopeProvider)
35
- }
24
+ WorkspaceCache: (services) => new WorkspaceCache(services.shared),
25
+ Rpc: bind(Rpc),
26
+ likec4: {
27
+ FqnIndex: bind(FqnIndex),
28
+ ModelParser: bind(LikeC4ModelParser),
29
+ ModelBuilder: bind(LikeC4ModelBuilder),
30
+ ModelLocator: bind(LikeC4ModelLocator)
31
+ },
32
+ lsp: {
33
+ DocumentSymbolProvider: bind(LikeC4DocumentSymbolProvider),
34
+ SemanticTokenProvider: bind(LikeC4SemanticTokenProvider),
35
+ HoverProvider: bind(LikeC4HoverProvider),
36
+ CodeLensProvider: bind(LikeC4CodeLensProvider),
37
+ DocumentLinkProvider: bind(LikeC4DocumentLinkProvider)
38
+ },
39
+ references: {
40
+ ScopeComputation: bind(LikeC4ScopeComputation),
41
+ ScopeProvider: bind(LikeC4ScopeProvider)
42
+ }
36
43
  };
37
44
  const LikeC4SharedModule = {
38
- workspace: {
39
- WorkspaceManager: services => new LikeC4WorkspaceManager(services)
40
- }
45
+ workspace: {
46
+ WorkspaceManager: (services) => new LikeC4WorkspaceManager(services)
47
+ }
41
48
  };
42
49
  export function createLanguageServices(context) {
43
- const connection = context?.connection;
44
- if (connection) {
45
- // eslint-disable-next-line @typescript-eslint/unbound-method
46
- const original = logger.error.bind(logger);
47
- logger.error = (arg) => {
48
- if (typeof arg === 'string') {
49
- original(arg);
50
- connection.telemetry.logEvent({ eventName: 'error', error: arg });
51
- return;
52
- }
53
- const { message, error } = serializeError(arg);
54
- original(error);
55
- connection.telemetry.logEvent({ eventName: 'error', error: message });
56
- };
57
- }
58
- const moduleContext = {
59
- ...EmptyFileSystem,
60
- ...context
50
+ const connection = context?.connection;
51
+ if (connection) {
52
+ const original = logger.error.bind(logger);
53
+ logger.error = (arg) => {
54
+ if (typeof arg === "string") {
55
+ original(arg);
56
+ connection.telemetry.logEvent({ eventName: "error", error: arg });
57
+ return;
58
+ }
59
+ const { message, error } = serializeError(arg);
60
+ original(error);
61
+ connection.telemetry.logEvent({ eventName: "error", error: message });
61
62
  };
62
- const shared = inject(createDefaultSharedModule(moduleContext), LikeC4GeneratedSharedModule, LikeC4SharedModule);
63
- const likec4 = inject(createDefaultModule({ shared }), LikeC4GeneratedModule, LikeC4Module);
64
- shared.ServiceRegistry.register(likec4);
65
- registerValidationChecks(likec4);
66
- registerProtocolHandlers(likec4);
67
- return { shared, likec4 };
63
+ }
64
+ const moduleContext = {
65
+ ...EmptyFileSystem,
66
+ ...context
67
+ };
68
+ const shared = inject(
69
+ createDefaultSharedModule(moduleContext),
70
+ LikeC4GeneratedSharedModule,
71
+ LikeC4SharedModule
72
+ );
73
+ const likec4 = inject(createDefaultModule({ shared }), LikeC4GeneratedModule, LikeC4Module);
74
+ shared.ServiceRegistry.register(likec4);
75
+ registerValidationChecks(likec4);
76
+ likec4.Rpc.init();
77
+ return { shared, likec4 };
68
78
  }
69
- //# sourceMappingURL=module.js.map
@@ -1,9 +1,25 @@
1
1
  import type { ComputedView, Fqn, LikeC4Model, LikeC4RawModel, RelationID, ViewID } from '@likec4/core';
2
2
  import type { DocumentUri, Location } from 'vscode-languageserver-protocol';
3
3
  import { NotificationType, RequestType, RequestType0 } from 'vscode-languageserver-protocol';
4
+ export declare const onDidChangeModel: NotificationType<string>;
5
+ export declare const fetchRawModel: RequestType0<{
6
+ rawmodel: LikeC4RawModel | null;
7
+ }, void>;
8
+ export declare const fetchModel: RequestType0<{
9
+ model: LikeC4Model | null;
10
+ }, void>;
11
+ export declare const computeView: RequestType<{
12
+ viewId: ViewID;
13
+ }, {
14
+ view: ComputedView | null;
15
+ }, void>;
16
+ export declare const rebuild: RequestType0<{
17
+ docs: DocumentUri[];
18
+ }, void>;
4
19
  interface BuildDocumentsParams {
5
20
  docs: DocumentUri[];
6
21
  }
22
+ export declare const buildDocuments: RequestType<BuildDocumentsParams, void, void>;
7
23
  export type LocateParams = {
8
24
  element: Fqn;
9
25
  property?: string;
@@ -13,24 +29,4 @@ export type LocateParams = {
13
29
  view: ViewID;
14
30
  };
15
31
  export declare const locate: RequestType<LocateParams, Location | null, void>;
16
- export declare const Rpc: {
17
- readonly onDidChangeModel: NotificationType<string>;
18
- readonly fetchModel: RequestType0<{
19
- model: LikeC4Model | null;
20
- }, void>;
21
- readonly fetchRawModel: RequestType0<{
22
- rawmodel: LikeC4RawModel | null;
23
- }, void>;
24
- readonly computeView: RequestType<{
25
- viewId: ViewID;
26
- }, {
27
- view: ComputedView | null;
28
- }, void>;
29
- readonly rebuild: RequestType0<{
30
- docs: DocumentUri[];
31
- }, void>;
32
- readonly buildDocuments: RequestType<BuildDocumentsParams, void, void>;
33
- readonly locate: RequestType<LocateParams, Location | null, void>;
34
- };
35
32
  export {};
36
- //# sourceMappingURL=protocol.d.ts.map
package/dist/protocol.js CHANGED
@@ -1,22 +1,14 @@
1
- import { NotificationType, RequestType, RequestType0 } from 'vscode-languageserver-protocol';
2
- //#region From server
3
- const onDidChangeModel = new NotificationType('likec4/onDidChangeModel');
4
- //#endregion
5
- //#region To server
6
- const fetchRawModel = new RequestType0('likec4/fetchRaw');
7
- const fetchModel = new RequestType0('likec4/fetchModel');
8
- const computeView = new RequestType('likec4/computeView');
9
- const rebuild = new RequestType0('likec4/rebuildModel');
10
- const buildDocuments = new RequestType('likec4/buildDocuments');
11
- export const locate = new RequestType('likec4/locate');
12
- //#endregion
13
- export const Rpc = {
14
- onDidChangeModel,
15
- fetchModel,
16
- fetchRawModel,
17
- computeView,
18
- rebuild,
19
- buildDocuments,
20
- locate
21
- };
22
- //# sourceMappingURL=protocol.js.map
1
+ import { NotificationType, RequestType, RequestType0 } from "vscode-languageserver-protocol";
2
+ export const onDidChangeModel = new NotificationType("likec4/onDidChangeModel");
3
+ export const fetchRawModel = new RequestType0(
4
+ "likec4/fetchRaw"
5
+ );
6
+ export const fetchModel = new RequestType0("likec4/fetchModel");
7
+ export const computeView = new RequestType(
8
+ "likec4/computeView"
9
+ );
10
+ export const rebuild = new RequestType0("likec4/rebuildModel");
11
+ export const buildDocuments = new RequestType(
12
+ "likec4/buildDocuments"
13
+ );
14
+ export const locate = new RequestType("likec4/locate");
@@ -1,3 +1,2 @@
1
1
  export * from './scope-computation';
2
2
  export * from './scope-provider';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,2 @@
1
- export * from './scope-computation';
2
- export * from './scope-provider';
3
- //# sourceMappingURL=index.js.map
1
+ export * from "./scope-computation.js";
2
+ export * from "./scope-provider.js";
@@ -1,11 +1,10 @@
1
- import { DefaultScopeComputation, MultiMap, type AstNodeDescription, type PrecomputedScopes } from 'langium';
1
+ import { DefaultScopeComputation, type AstNodeDescription, type PrecomputedScopes } from 'langium';
2
2
  import type { CancellationToken } from 'vscode-languageserver';
3
3
  import { ast, type LikeC4LangiumDocument } from '../ast';
4
4
  type ElementsContainer = ast.Model | ast.ElementBody | ast.ExtendElementBody;
5
5
  export declare class LikeC4ScopeComputation extends DefaultScopeComputation {
6
6
  computeExports(document: LikeC4LangiumDocument, _cancelToken: CancellationToken): Promise<AstNodeDescription[]>;
7
7
  computeLocalScopes(document: LikeC4LangiumDocument, _cancelToken: CancellationToken): Promise<PrecomputedScopes>;
8
- protected processContainer(container: ElementsContainer, scopes: PrecomputedScopes, document: LikeC4LangiumDocument): MultiMap<string, AstNodeDescription>;
8
+ protected processContainer(container: ElementsContainer, scopes: PrecomputedScopes, document: LikeC4LangiumDocument): any;
9
9
  }
10
10
  export {};
11
- //# sourceMappingURL=scope-computation.d.ts.map
@@ -1,80 +1,78 @@
1
- import { DefaultScopeComputation, MultiMap } from 'langium';
2
- import { isEmpty } from 'remeda';
3
- import { ast } from '../ast';
1
+ import {
2
+ DefaultScopeComputation,
3
+ MultiMap
4
+ } from "langium";
5
+ import { isEmpty } from "remeda";
6
+ import { ast } from "../ast.js";
4
7
  export class LikeC4ScopeComputation extends DefaultScopeComputation {
5
- computeExports(document, _cancelToken) {
6
- const { specification, model, views } = document.parseResult.value;
7
- const docExports = [];
8
- if (specification) {
9
- for (const spec of specification.elements) {
10
- if (spec.kind && !isEmpty(spec.kind.name)) {
11
- docExports.push(this.descriptions.createDescription(spec.kind, spec.kind.name, document));
12
- }
13
- }
14
- for (const spec of specification.tags) {
15
- if (spec.tag && !isEmpty(spec.tag.name)) {
16
- docExports.push(this.descriptions.createDescription(spec.tag, spec.tag.name, document));
17
- docExports.push(this.descriptions.createDescription(spec.tag, '#' + spec.tag.name, document));
18
- }
19
- }
8
+ computeExports(document, _cancelToken) {
9
+ const { specification, model, views } = document.parseResult.value;
10
+ const docExports = [];
11
+ if (specification) {
12
+ for (const spec of specification.elements) {
13
+ if (spec.kind && !isEmpty(spec.kind.name)) {
14
+ docExports.push(this.descriptions.createDescription(spec.kind, spec.kind.name, document));
20
15
  }
21
- // Only root model elements are exported
22
- if (model && model.elements.length > 0) {
23
- for (const elAst of model.elements) {
24
- if (ast.isElement(elAst) && !isEmpty(elAst.name)) {
25
- docExports.push(this.descriptions.createDescription(elAst, elAst.name, document));
26
- }
27
- }
16
+ }
17
+ for (const spec of specification.tags) {
18
+ if (spec.tag && !isEmpty(spec.tag.name)) {
19
+ docExports.push(this.descriptions.createDescription(spec.tag, spec.tag.name, document));
20
+ docExports.push(this.descriptions.createDescription(spec.tag, "#" + spec.tag.name, document));
28
21
  }
29
- if (views && views.views.length > 0) {
30
- for (const viewAst of views.views) {
31
- if (viewAst.name && !isEmpty(viewAst.name)) {
32
- docExports.push(this.descriptions.createDescription(viewAst, viewAst.name, document));
33
- }
34
- }
35
- }
36
- return Promise.resolve(docExports);
22
+ }
37
23
  }
38
- async computeLocalScopes(document, _cancelToken) {
39
- const root = document.parseResult.value;
40
- const scopes = new MultiMap();
41
- if (root.model) {
42
- const nested = this.processContainer(root.model, scopes, document);
43
- scopes.addAll(root, nested.values());
24
+ if (model && model.elements.length > 0) {
25
+ for (const elAst of model.elements) {
26
+ if (ast.isElement(elAst) && !isEmpty(elAst.name)) {
27
+ docExports.push(this.descriptions.createDescription(elAst, elAst.name, document));
44
28
  }
45
- return Promise.resolve(scopes);
29
+ }
46
30
  }
47
- processContainer(container, scopes, document) {
48
- const localScope = new MultiMap();
49
- const nestedScopes = new MultiMap();
50
- for (const el of container.elements) {
51
- if (ast.isRelation(el)) {
52
- continue;
53
- }
54
- let subcontainer;
55
- if (ast.isElement(el) && !isEmpty(el.name)) {
56
- localScope.add(el.name, this.descriptions.createDescription(el, el.name, document));
57
- subcontainer = el.body;
58
- }
59
- else if (ast.isExtendElement(el)) {
60
- subcontainer = el.body;
61
- }
62
- if (subcontainer && subcontainer.elements.length > 0) {
63
- const nested = this.processContainer(subcontainer, scopes, document);
64
- for (const [nestedName, desc] of nested) {
65
- nestedScopes.add(nestedName, desc);
66
- }
67
- }
31
+ if (views && views.views.length > 0) {
32
+ for (const viewAst of views.views) {
33
+ if (viewAst.name && !isEmpty(viewAst.name)) {
34
+ docExports.push(this.descriptions.createDescription(viewAst, viewAst.name, document));
68
35
  }
69
- for (const [name, descriptions] of nestedScopes.entriesGroupedByKey()) {
70
- // If name is unique for current scope
71
- if (!localScope.has(name) && descriptions.length === 1) {
72
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
73
- localScope.add(name, descriptions[0]);
74
- }
36
+ }
37
+ }
38
+ return Promise.resolve(docExports);
39
+ }
40
+ async computeLocalScopes(document, _cancelToken) {
41
+ const root = document.parseResult.value;
42
+ const scopes = new MultiMap();
43
+ if (root.model) {
44
+ const nested = this.processContainer(root.model, scopes, document);
45
+ scopes.addAll(root, nested.values());
46
+ }
47
+ return Promise.resolve(scopes);
48
+ }
49
+ processContainer(container, scopes, document) {
50
+ const localScope = new MultiMap();
51
+ const nestedScopes = new MultiMap();
52
+ for (const el of container.elements) {
53
+ if (ast.isRelation(el)) {
54
+ continue;
55
+ }
56
+ let subcontainer;
57
+ if (ast.isElement(el) && !isEmpty(el.name)) {
58
+ localScope.add(el.name, this.descriptions.createDescription(el, el.name, document));
59
+ subcontainer = el.body;
60
+ } else if (ast.isExtendElement(el)) {
61
+ subcontainer = el.body;
62
+ }
63
+ if (subcontainer && subcontainer.elements.length > 0) {
64
+ const nested = this.processContainer(subcontainer, scopes, document);
65
+ for (const [nestedName, desc] of nested) {
66
+ nestedScopes.add(nestedName, desc);
75
67
  }
76
- scopes.addAll(container, localScope.values());
77
- return localScope;
68
+ }
69
+ }
70
+ for (const [name, descriptions] of nestedScopes.entriesGroupedByKey()) {
71
+ if (!localScope.has(name) && descriptions.length === 1) {
72
+ localScope.add(name, descriptions[0]);
73
+ }
78
74
  }
75
+ scopes.addAll(container, localScope.values());
76
+ return localScope;
77
+ }
79
78
  }
80
- //# sourceMappingURL=scope-computation.js.map
@@ -10,10 +10,9 @@ export declare class LikeC4ScopeProvider extends DefaultScopeProvider {
10
10
  private scopeExtendElement;
11
11
  private scopeElementView;
12
12
  getScope(context: ReferenceInfo): Scope;
13
- protected computeScope(node: AstNode, referenceType: string): Scope;
13
+ protected computeScope(node: AstNode, referenceType: string): Stream<AstNodeDescription>;
14
14
  /**
15
15
  * Create a global scope filtered for the given reference type.
16
16
  */
17
17
  protected getGlobalScope(referenceType: string): Scope;
18
18
  }
19
- //# sourceMappingURL=scope-provider.d.ts.map