@domainlang/language 0.5.2 → 0.6.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 (104) hide show
  1. package/out/domain-lang-module.js +3 -1
  2. package/out/domain-lang-module.js.map +1 -1
  3. package/out/generated/ast.d.ts +24 -0
  4. package/out/generated/ast.js.map +1 -1
  5. package/out/generated/grammar.js +22 -32
  6. package/out/generated/grammar.js.map +1 -1
  7. package/out/index.d.ts +2 -5
  8. package/out/index.js +10 -6
  9. package/out/index.js.map +1 -1
  10. package/out/lsp/domain-lang-code-actions.js +14 -8
  11. package/out/lsp/domain-lang-code-actions.js.map +1 -1
  12. package/out/lsp/domain-lang-completion.d.ts +3 -0
  13. package/out/lsp/domain-lang-completion.js +41 -13
  14. package/out/lsp/domain-lang-completion.js.map +1 -1
  15. package/out/lsp/domain-lang-formatter.js +24 -18
  16. package/out/lsp/domain-lang-formatter.js.map +1 -1
  17. package/out/lsp/domain-lang-index-manager.d.ts +102 -0
  18. package/out/lsp/domain-lang-index-manager.js +221 -0
  19. package/out/lsp/domain-lang-index-manager.js.map +1 -0
  20. package/out/lsp/domain-lang-scope.js +31 -17
  21. package/out/lsp/domain-lang-scope.js.map +1 -1
  22. package/out/lsp/domain-lang-workspace-manager.d.ts +51 -9
  23. package/out/lsp/domain-lang-workspace-manager.js +86 -63
  24. package/out/lsp/domain-lang-workspace-manager.js.map +1 -1
  25. package/out/lsp/hover/domain-lang-hover.d.ts +45 -1
  26. package/out/lsp/hover/domain-lang-hover.js +308 -232
  27. package/out/lsp/hover/domain-lang-hover.js.map +1 -1
  28. package/out/lsp/hover/domain-lang-keywords.d.ts +3 -7
  29. package/out/lsp/hover/domain-lang-keywords.js +115 -38
  30. package/out/lsp/hover/domain-lang-keywords.js.map +1 -1
  31. package/out/lsp/manifest-diagnostics.js +95 -50
  32. package/out/lsp/manifest-diagnostics.js.map +1 -1
  33. package/out/main.js +109 -17
  34. package/out/main.js.map +1 -1
  35. package/out/services/import-resolver.d.ts +16 -2
  36. package/out/services/import-resolver.js +37 -11
  37. package/out/services/import-resolver.js.map +1 -1
  38. package/out/services/types.d.ts +2 -2
  39. package/out/services/workspace-manager.d.ts +33 -31
  40. package/out/services/workspace-manager.js +92 -148
  41. package/out/services/workspace-manager.js.map +1 -1
  42. package/out/utils/document-utils.d.ts +41 -0
  43. package/out/utils/document-utils.js +64 -0
  44. package/out/utils/document-utils.js.map +1 -0
  45. package/out/utils/import-utils.d.ts +0 -17
  46. package/out/utils/import-utils.js +2 -32
  47. package/out/utils/import-utils.js.map +1 -1
  48. package/out/utils/manifest-utils.d.ts +56 -0
  49. package/out/utils/manifest-utils.js +119 -0
  50. package/out/utils/manifest-utils.js.map +1 -0
  51. package/out/validation/import.d.ts +1 -2
  52. package/out/validation/import.js +33 -20
  53. package/out/validation/import.js.map +1 -1
  54. package/package.json +1 -1
  55. package/src/domain-lang-module.ts +4 -1
  56. package/src/domain-lang.langium +37 -13
  57. package/src/generated/ast.ts +24 -0
  58. package/src/generated/grammar.ts +22 -32
  59. package/src/index.ts +12 -6
  60. package/src/lsp/domain-lang-code-actions.ts +13 -8
  61. package/src/lsp/domain-lang-completion.ts +61 -13
  62. package/src/lsp/domain-lang-formatter.ts +28 -23
  63. package/src/lsp/domain-lang-index-manager.ts +256 -0
  64. package/src/lsp/domain-lang-scope.ts +29 -17
  65. package/src/lsp/domain-lang-workspace-manager.ts +89 -66
  66. package/src/lsp/hover/domain-lang-hover.ts +332 -226
  67. package/src/lsp/hover/domain-lang-keywords.ts +129 -43
  68. package/src/lsp/manifest-diagnostics.ts +100 -59
  69. package/src/main.ts +127 -16
  70. package/src/services/import-resolver.ts +39 -11
  71. package/src/services/types.ts +2 -2
  72. package/src/services/workspace-manager.ts +101 -175
  73. package/src/utils/document-utils.ts +80 -0
  74. package/src/utils/import-utils.ts +2 -40
  75. package/src/utils/manifest-utils.ts +132 -0
  76. package/src/validation/import.ts +32 -22
  77. package/out/lsp/hover/ddd-pattern-explanations.d.ts +0 -50
  78. package/out/lsp/hover/ddd-pattern-explanations.js +0 -196
  79. package/out/lsp/hover/ddd-pattern-explanations.js.map +0 -1
  80. package/out/services/dependency-analyzer.d.ts +0 -58
  81. package/out/services/dependency-analyzer.js +0 -254
  82. package/out/services/dependency-analyzer.js.map +0 -1
  83. package/out/services/dependency-resolver.d.ts +0 -146
  84. package/out/services/dependency-resolver.js +0 -452
  85. package/out/services/dependency-resolver.js.map +0 -1
  86. package/out/services/git-url-resolver.browser.d.ts +0 -10
  87. package/out/services/git-url-resolver.browser.js +0 -19
  88. package/out/services/git-url-resolver.browser.js.map +0 -1
  89. package/out/services/git-url-resolver.d.ts +0 -158
  90. package/out/services/git-url-resolver.js +0 -416
  91. package/out/services/git-url-resolver.js.map +0 -1
  92. package/out/services/governance-validator.d.ts +0 -44
  93. package/out/services/governance-validator.js +0 -153
  94. package/out/services/governance-validator.js.map +0 -1
  95. package/out/services/semver.d.ts +0 -98
  96. package/out/services/semver.js +0 -195
  97. package/out/services/semver.js.map +0 -1
  98. package/src/lsp/hover/ddd-pattern-explanations.ts +0 -237
  99. package/src/services/dependency-analyzer.ts +0 -321
  100. package/src/services/dependency-resolver.ts +0 -551
  101. package/src/services/git-url-resolver.browser.ts +0 -26
  102. package/src/services/git-url-resolver.ts +0 -517
  103. package/src/services/governance-validator.ts +0 -177
  104. package/src/services/semver.ts +0 -213
@@ -3,19 +3,61 @@ import type { CancellationToken } from 'vscode-languageserver-protocol';
3
3
  /**
4
4
  * Langium WorkspaceManager override implementing manifest-centric import loading per PRS-010.
5
5
  *
6
- * Behavior:
7
- * - Skips pre-loading *.dlang during workspace scan (only entry graph is loaded when manifest exists).
8
- * - Mode A (with manifest): find nearest model.yaml in folder, load entry (default index.dlang) and its import graph.
9
- * - Mode B (no manifest): no pre-loading; imports resolved on-demand when a document is opened.
10
- * - Never performs network fetches; relies on cached dependencies/lock files. Missing cache produces diagnostics upstream.
6
+ * **Three Operational Modes:**
7
+ *
8
+ * **Mode A (Pure Workspace with model.yaml):**
9
+ * - model.yaml exists at workspace root
10
+ * - Loads entry file (default: index.dlang, or custom via model.entry)
11
+ * - Pre-builds entry and follows import graph
12
+ * - All imported documents built to Validated state before workspace ready
13
+ * - LSP features have immediate access to complete reference information
14
+ *
15
+ * **Mode B (Pure Standalone files):**
16
+ * - No model.yaml anywhere in workspace
17
+ * - No pre-loading of .dlang files during workspace scan
18
+ * - Documents loaded on-demand when user opens them
19
+ * - Imports resolved lazily via ImportResolver
20
+ * - Each document built individually when opened
21
+ * - Works with relative imports only (no path aliases or external deps)
22
+ *
23
+ * **Mode C (Mixed - Standalone + Module folders):**
24
+ * - Workspace contains both standalone .dlang files AND folders with model.yaml
25
+ * - Each model.yaml folder treated as a module/package:
26
+ * - Module entry + import graph pre-loaded
27
+ * - Path aliases and external deps work within module
28
+ * - Standalone files outside modules loaded on-demand
29
+ * - Example structure:
30
+ * ```
31
+ * workspace/
32
+ * ├── standalone.dlang ← Mode B (on-demand)
33
+ * ├── core/
34
+ * │ ├── model.yaml ← Module root
35
+ * │ ├── index.dlang ← Pre-loaded
36
+ * │ └── domains/
37
+ * │ └── sales.dlang ← Pre-loaded via imports
38
+ * └── util.dlang ← Mode B (on-demand)
39
+ * ```
40
+ *
41
+ * **Performance Characteristics:**
42
+ * - Mode A/C modules: Slower initial load, instant LSP features afterward
43
+ * - Mode B/C standalone: Instant workspace init, per-file build on open
44
+ * - All modes cache import resolution for subsequent access
45
+ *
46
+ * **Never performs network fetches** - relies on cached dependencies/lock files.
47
+ * Missing cache produces diagnostics upstream via ImportValidator.
11
48
  */
12
49
  export declare class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
50
+ private readonly sharedServices;
13
51
  constructor(services: LangiumSharedCoreServices);
14
52
  shouldIncludeEntry(entry: FileSystemNode): boolean;
15
53
  initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void>;
16
54
  protected loadAdditionalDocuments(folders: WorkspaceFolder[], collector: (document: LangiumDocument) => void): Promise<void>;
17
- private findManifestInFolders;
18
- private findNearestManifest;
19
- private readEntryFromManifest;
20
- private pathExists;
55
+ /**
56
+ * Finds ALL model.yaml files in the workspace.
57
+ * Delegates to shared manifest utilities.
58
+ *
59
+ * @param folders - Workspace folders to search
60
+ * @returns Array of manifest info (one per model.yaml found)
61
+ */
62
+ private findAllManifestsInFolders;
21
63
  }
@@ -1,19 +1,56 @@
1
- import path from 'node:path';
2
- import YAML from 'yaml';
3
1
  import { DefaultWorkspaceManager, URI, UriUtils } from 'langium';
4
2
  import { ensureImportGraphFromDocument } from '../utils/import-utils.js';
3
+ import { findManifestsInDirectories } from '../utils/manifest-utils.js';
5
4
  /**
6
5
  * Langium WorkspaceManager override implementing manifest-centric import loading per PRS-010.
7
6
  *
8
- * Behavior:
9
- * - Skips pre-loading *.dlang during workspace scan (only entry graph is loaded when manifest exists).
10
- * - Mode A (with manifest): find nearest model.yaml in folder, load entry (default index.dlang) and its import graph.
11
- * - Mode B (no manifest): no pre-loading; imports resolved on-demand when a document is opened.
12
- * - Never performs network fetches; relies on cached dependencies/lock files. Missing cache produces diagnostics upstream.
7
+ * **Three Operational Modes:**
8
+ *
9
+ * **Mode A (Pure Workspace with model.yaml):**
10
+ * - model.yaml exists at workspace root
11
+ * - Loads entry file (default: index.dlang, or custom via model.entry)
12
+ * - Pre-builds entry and follows import graph
13
+ * - All imported documents built to Validated state before workspace ready
14
+ * - LSP features have immediate access to complete reference information
15
+ *
16
+ * **Mode B (Pure Standalone files):**
17
+ * - No model.yaml anywhere in workspace
18
+ * - No pre-loading of .dlang files during workspace scan
19
+ * - Documents loaded on-demand when user opens them
20
+ * - Imports resolved lazily via ImportResolver
21
+ * - Each document built individually when opened
22
+ * - Works with relative imports only (no path aliases or external deps)
23
+ *
24
+ * **Mode C (Mixed - Standalone + Module folders):**
25
+ * - Workspace contains both standalone .dlang files AND folders with model.yaml
26
+ * - Each model.yaml folder treated as a module/package:
27
+ * - Module entry + import graph pre-loaded
28
+ * - Path aliases and external deps work within module
29
+ * - Standalone files outside modules loaded on-demand
30
+ * - Example structure:
31
+ * ```
32
+ * workspace/
33
+ * ├── standalone.dlang ← Mode B (on-demand)
34
+ * ├── core/
35
+ * │ ├── model.yaml ← Module root
36
+ * │ ├── index.dlang ← Pre-loaded
37
+ * │ └── domains/
38
+ * │ └── sales.dlang ← Pre-loaded via imports
39
+ * └── util.dlang ← Mode B (on-demand)
40
+ * ```
41
+ *
42
+ * **Performance Characteristics:**
43
+ * - Mode A/C modules: Slower initial load, instant LSP features afterward
44
+ * - Mode B/C standalone: Instant workspace init, per-file build on open
45
+ * - All modes cache import resolution for subsequent access
46
+ *
47
+ * **Never performs network fetches** - relies on cached dependencies/lock files.
48
+ * Missing cache produces diagnostics upstream via ImportValidator.
13
49
  */
14
50
  export class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
15
51
  constructor(services) {
16
52
  super(services);
53
+ this.sharedServices = services;
17
54
  }
18
55
  shouldIncludeEntry(entry) {
19
56
  // Prevent auto-including .dlang files; we'll load via entry/import graph
@@ -27,67 +64,53 @@ export class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
27
64
  await super.initializeWorkspace(folders, cancelToken);
28
65
  }
29
66
  async loadAdditionalDocuments(folders, collector) {
30
- const manifestInfo = await this.findManifestInFolders(folders);
31
- if (!manifestInfo) {
32
- return; // Mode B: no manifest
67
+ // Find ALL model.yaml files in workspace (supports mixed mode)
68
+ const manifestInfos = await this.findAllManifestsInFolders(folders);
69
+ if (manifestInfos.length === 0) {
70
+ return; // Pure Mode B: no manifests, all files loaded on-demand
33
71
  }
34
- const entryUri = URI.file(manifestInfo.entryPath);
35
- const entryDoc = await this.langiumDocuments.getOrCreateDocument(entryUri);
36
- collector(entryDoc);
37
- const uris = await ensureImportGraphFromDocument(entryDoc, this.langiumDocuments);
38
- for (const uriString of uris) {
39
- const uri = URI.parse(uriString);
40
- const doc = await this.langiumDocuments.getOrCreateDocument(uri);
41
- collector(doc);
42
- }
43
- }
44
- async findManifestInFolders(folders) {
45
- for (const folder of folders) {
46
- const manifestPath = await this.findNearestManifest(folder.uri);
47
- if (manifestPath) {
48
- const entry = await this.readEntryFromManifest(manifestPath) ?? 'index.dlang';
49
- const entryPath = path.resolve(path.dirname(manifestPath), entry);
50
- return { manifestPath, entryPath };
72
+ // Mode A or Mode C: Load each module's entry + import graph
73
+ for (const manifestInfo of manifestInfos) {
74
+ try {
75
+ const entryUri = URI.file(manifestInfo.entryPath);
76
+ const entryDoc = await this.langiumDocuments.getOrCreateDocument(entryUri);
77
+ collector(entryDoc);
78
+ // Build entry document first to ensure it's ready for import resolution
79
+ await this.sharedServices.workspace.DocumentBuilder.build([entryDoc], {
80
+ validation: true
81
+ });
82
+ const uris = await ensureImportGraphFromDocument(entryDoc, this.langiumDocuments);
83
+ const importedDocs = [];
84
+ for (const uriString of uris) {
85
+ const uri = URI.parse(uriString);
86
+ const doc = await this.langiumDocuments.getOrCreateDocument(uri);
87
+ collector(doc);
88
+ importedDocs.push(doc);
89
+ }
90
+ // Build all imported documents in batch for performance
91
+ if (importedDocs.length > 0) {
92
+ await this.sharedServices.workspace.DocumentBuilder.build(importedDocs, {
93
+ validation: true
94
+ });
95
+ }
51
96
  }
52
- }
53
- return undefined;
54
- }
55
- async findNearestManifest(startUri) {
56
- let current = path.resolve(URI.parse(startUri).fsPath);
57
- const { root } = path.parse(current);
58
- while (true) {
59
- const candidate = path.join(current, 'model.yaml');
60
- if (await this.pathExists(candidate)) {
61
- return candidate;
97
+ catch (error) {
98
+ const message = error instanceof Error ? error.message : String(error);
99
+ console.error(`Failed to load import graph from ${manifestInfo.manifestPath}: ${message}`);
100
+ // Continue with other modules - partial failure is acceptable
62
101
  }
63
- if (current === root) {
64
- return undefined;
65
- }
66
- const parent = path.dirname(current);
67
- if (parent === current) {
68
- return undefined;
69
- }
70
- current = parent;
71
- }
72
- }
73
- async readEntryFromManifest(manifestPath) {
74
- try {
75
- const content = await this.fileSystemProvider.readFile(URI.file(manifestPath));
76
- const manifest = (YAML.parse(content) ?? {});
77
- return manifest.model?.entry;
78
- }
79
- catch {
80
- return undefined;
81
102
  }
82
103
  }
83
- async pathExists(target) {
84
- try {
85
- await this.fileSystemProvider.stat(URI.file(target));
86
- return true;
87
- }
88
- catch {
89
- return false;
90
- }
104
+ /**
105
+ * Finds ALL model.yaml files in the workspace.
106
+ * Delegates to shared manifest utilities.
107
+ *
108
+ * @param folders - Workspace folders to search
109
+ * @returns Array of manifest info (one per model.yaml found)
110
+ */
111
+ async findAllManifestsInFolders(folders) {
112
+ const directories = folders.map(f => URI.parse(f.uri).fsPath);
113
+ return findManifestsInDirectories(directories);
91
114
  }
92
115
  }
93
116
  //# sourceMappingURL=domain-lang-workspace-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-lang-workspace-manager.js","sourceRoot":"","sources":["../../src/lsp/domain-lang-workspace-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"domain-lang-workspace-manager.js","sourceRoot":"","sources":["../../src/lsp/domain-lang-workspace-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,GAAG,EAAE,QAAQ,EAAmG,MAAM,SAAS,CAAC;AAElK,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,OAAO,0BAA2B,SAAQ,uBAAuB;IAGnE,YAAY,QAAmC;QAC3C,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACnC,CAAC;IAEQ,kBAAkB,CAAC,KAAqB;QAC7C,yEAAyE;QACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEQ,KAAK,CAAC,mBAAmB,CAAC,OAA0B,EAAE,WAA+B;QAC1F,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEkB,KAAK,CAAC,uBAAuB,CAAC,OAA0B,EAAE,SAA8C;QACvH,+DAA+D;QAC/D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAEpE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,wDAAwD;QACpE,CAAC;QAED,4DAA4D;QAC5D,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC3E,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAEpB,wEAAwE;gBACxE,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE;oBAClE,UAAU,EAAE,IAAI;iBACnB,CAAC,CAAC;gBAEH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAClF,MAAM,YAAY,GAAsB,EAAE,CAAC;gBAC3C,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBACjE,SAAS,CAAC,GAAG,CAAC,CAAC;oBACf,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,CAAC;gBAED,wDAAwD;gBACxD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,EAAE;wBACpE,UAAU,EAAE,IAAI;qBACnB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,KAAK,CAAC,oCAAoC,YAAY,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC,CAAC;gBAC3F,8DAA8D;YAClE,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,yBAAyB,CAAC,OAA0B;QAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;CACJ"}
@@ -5,15 +5,59 @@ import type { Hover, HoverParams } from 'vscode-languageserver';
5
5
  import { QualifiedNameProvider } from '../domain-lang-naming.js';
6
6
  /**
7
7
  * Provides hover information for DomainLang elements.
8
+ *
9
+ * Extends Langium's AstNodeHoverProvider with DDD-specific hover content
10
+ * for domains, bounded contexts, relationships, and other DSL constructs.
8
11
  */
9
12
  export declare class DomainLangHoverProvider extends AstNodeHoverProvider {
10
13
  protected readonly documentationProvider: DocumentationProvider;
11
14
  protected readonly commentProvider: CommentProvider;
12
15
  protected readonly qualifiedNameProvider: QualifiedNameProvider;
16
+ /**
17
+ * Registry of type-specific hover content generators.
18
+ * Each generator returns content for its node type, or undefined to skip.
19
+ */
20
+ private readonly hoverGenerators;
13
21
  constructor(services: LangiumServices);
14
22
  getHoverContent(document: LangiumDocument, params: HoverParams): Promise<Hover | undefined>;
23
+ /**
24
+ * Try to get hover for a declaration node (AST node).
25
+ */
26
+ private tryGetDeclarationHover;
27
+ /**
28
+ * Try to get hover for a keyword node.
29
+ * Uses the keyword dictionary for all keywords.
30
+ */
31
+ private tryGetKeywordHover;
15
32
  protected getAstNodeHoverContent(node: AstNode): MaybePromise<string | undefined>;
33
+ private getDomainHover;
34
+ private getThisRefHover;
35
+ private getBoundedContextHover;
36
+ private getNamespaceHover;
37
+ private getContextMapHover;
38
+ private getDomainMapHover;
39
+ private getDecisionHover;
40
+ private getPolicyHover;
41
+ private getBusinessRuleHover;
42
+ private getDomainTermHover;
43
+ private getTeamHover;
44
+ private getClassificationHover;
45
+ private getMetadataHover;
46
+ private getRelationshipHover;
47
+ private getImportHover;
48
+ private getDefaultHover;
49
+ /**
50
+ * Formats a relationship line for hover display.
51
+ */
52
+ private formatRelationshipLine;
53
+ /**
54
+ * Wraps text in a domain-lang code block.
55
+ */
56
+ private codeBlock;
57
+ /**
58
+ * Formats the final hover content with consistent structure.
59
+ */
60
+ private formatHover;
16
61
  private getRefName;
17
62
  private refLink;
18
- protected getKeywordHoverContent(node: AstNode): MaybePromise<Hover | undefined>;
19
63
  }