@domainlang/language 0.10.0 → 0.11.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 (65) hide show
  1. package/README.md +44 -102
  2. package/out/domain-lang-module.d.ts +2 -2
  3. package/out/domain-lang-module.js +2 -2
  4. package/out/domain-lang-module.js.map +1 -1
  5. package/out/index.d.ts +3 -0
  6. package/out/index.js +3 -0
  7. package/out/index.js.map +1 -1
  8. package/out/lsp/domain-lang-completion.js +1 -1
  9. package/out/lsp/domain-lang-completion.js.map +1 -1
  10. package/out/lsp/domain-lang-index-manager.d.ts +149 -5
  11. package/out/lsp/domain-lang-index-manager.js +388 -52
  12. package/out/lsp/domain-lang-index-manager.js.map +1 -1
  13. package/out/lsp/domain-lang-refresh.d.ts +35 -0
  14. package/out/lsp/domain-lang-refresh.js +129 -0
  15. package/out/lsp/domain-lang-refresh.js.map +1 -0
  16. package/out/lsp/domain-lang-workspace-manager.d.ts +10 -0
  17. package/out/lsp/domain-lang-workspace-manager.js +35 -0
  18. package/out/lsp/domain-lang-workspace-manager.js.map +1 -1
  19. package/out/main.js +30 -190
  20. package/out/main.js.map +1 -1
  21. package/out/sdk/loader-node.js +1 -1
  22. package/out/sdk/loader-node.js.map +1 -1
  23. package/out/sdk/validator.js +17 -14
  24. package/out/sdk/validator.js.map +1 -1
  25. package/out/services/import-resolver.d.ts +67 -17
  26. package/out/services/import-resolver.js +146 -65
  27. package/out/services/import-resolver.js.map +1 -1
  28. package/out/services/lsp-logger.d.ts +42 -0
  29. package/out/services/lsp-logger.js +50 -0
  30. package/out/services/lsp-logger.js.map +1 -0
  31. package/out/services/lsp-runtime-settings.d.ts +20 -0
  32. package/out/services/lsp-runtime-settings.js +20 -0
  33. package/out/services/lsp-runtime-settings.js.map +1 -0
  34. package/out/services/performance-optimizer.d.ts +9 -9
  35. package/out/services/performance-optimizer.js +17 -41
  36. package/out/services/performance-optimizer.js.map +1 -1
  37. package/out/services/workspace-manager.d.ts +22 -1
  38. package/out/services/workspace-manager.js +57 -9
  39. package/out/services/workspace-manager.js.map +1 -1
  40. package/out/utils/import-utils.js +6 -6
  41. package/out/utils/import-utils.js.map +1 -1
  42. package/out/validation/constants.d.ts +6 -0
  43. package/out/validation/constants.js +7 -0
  44. package/out/validation/constants.js.map +1 -1
  45. package/out/validation/import.d.ts +13 -3
  46. package/out/validation/import.js +54 -10
  47. package/out/validation/import.js.map +1 -1
  48. package/package.json +1 -1
  49. package/src/domain-lang-module.ts +3 -3
  50. package/src/index.ts +3 -0
  51. package/src/lsp/domain-lang-completion.ts +3 -3
  52. package/src/lsp/domain-lang-index-manager.ts +438 -56
  53. package/src/lsp/domain-lang-refresh.ts +205 -0
  54. package/src/lsp/domain-lang-workspace-manager.ts +45 -0
  55. package/src/main.ts +36 -244
  56. package/src/sdk/loader-node.ts +1 -1
  57. package/src/sdk/validator.ts +17 -13
  58. package/src/services/import-resolver.ts +196 -89
  59. package/src/services/lsp-logger.ts +89 -0
  60. package/src/services/lsp-runtime-settings.ts +34 -0
  61. package/src/services/performance-optimizer.ts +18 -57
  62. package/src/services/workspace-manager.ts +62 -10
  63. package/src/utils/import-utils.ts +6 -6
  64. package/src/validation/constants.ts +9 -0
  65. package/src/validation/import.ts +67 -12
@@ -75,8 +75,8 @@ export async function validateFile(filePath, options = {}) {
75
75
  }
76
76
  // Initialize workspace with the specified directory or file's directory
77
77
  const workspaceDir = options.workspaceDir ?? dirname(absolutePath);
78
- const workspaceManager = services.imports.WorkspaceManager;
79
- await workspaceManager.initialize(workspaceDir);
78
+ const manifestManager = services.imports.ManifestManager;
79
+ await manifestManager.initialize(workspaceDir);
80
80
  // Load and parse the document
81
81
  const uri = URI.file(absolutePath);
82
82
  const document = await shared.workspace.LangiumDocuments.getOrCreateDocument(uri);
@@ -88,17 +88,20 @@ export async function validateFile(filePath, options = {}) {
88
88
  // Build all documents with validation enabled
89
89
  const allDocuments = Array.from(shared.workspace.LangiumDocuments.all);
90
90
  await shared.workspace.DocumentBuilder.build(allDocuments, { validation: true });
91
- // Collect diagnostics from the entry document
92
- const diagnostics = document.diagnostics ?? [];
91
+ // Collect diagnostics from all loaded documents (entry + imports)
93
92
  const errors = [];
94
93
  const warnings = [];
95
- for (const diagnostic of diagnostics) {
96
- const validationDiag = toValidationDiagnostic(diagnostic, absolutePath);
97
- if (diagnostic.severity === 1) {
98
- errors.push(validationDiag);
99
- }
100
- else if (diagnostic.severity === 2) {
101
- warnings.push(validationDiag);
94
+ for (const doc of allDocuments) {
95
+ const diagnostics = doc.diagnostics ?? [];
96
+ const diagnosticFile = doc.uri.fsPath;
97
+ for (const diagnostic of diagnostics) {
98
+ const validationDiag = toValidationDiagnostic(diagnostic, diagnosticFile);
99
+ if (diagnostic.severity === 1) {
100
+ errors.push(validationDiag);
101
+ }
102
+ else if (diagnostic.severity === 2) {
103
+ warnings.push(validationDiag);
104
+ }
102
105
  }
103
106
  }
104
107
  // Count model elements across all documents
@@ -171,17 +174,17 @@ export async function validateWorkspace(workspaceDir) {
171
174
  const servicesObj = createDomainLangServices(NodeFileSystem);
172
175
  const shared = servicesObj.shared;
173
176
  const services = servicesObj.DomainLang;
174
- const workspaceManager = services.imports.WorkspaceManager;
177
+ const manifestManager = services.imports.ManifestManager;
175
178
  try {
176
179
  // Initialize workspace - this will find and load model.yaml
177
- await workspaceManager.initialize(absolutePath);
180
+ await manifestManager.initialize(absolutePath);
178
181
  }
179
182
  catch (error) {
180
183
  const message = error instanceof Error ? error.message : String(error);
181
184
  throw new Error(`Failed to initialize workspace at ${workspaceDir}: ${message}`);
182
185
  }
183
186
  // Get the manifest to find the entry file
184
- const manifest = await workspaceManager.getManifest();
187
+ const manifest = await manifestManager.getManifest();
185
188
  let entryFile = 'index.dlang';
186
189
  if (manifest?.model?.entry) {
187
190
  entryFile = manifest.model.entry;
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/sdk/validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/sdk/validator.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,34 @@
1
1
  import { URI, type LangiumDocument } from 'langium';
2
2
  import type { DomainLangServices } from '../domain-lang-module.js';
3
3
  import type { LockFile } from './types.js';
4
+ /**
5
+ * Resolution failure reason codes for programmatic handling.
6
+ */
7
+ export type ImportResolutionReason = 'file-not-found' | 'unknown-alias' | 'missing-manifest' | 'not-installed' | 'dependency-not-found' | 'missing-entry' | 'unresolvable';
8
+ /**
9
+ * Structured error for import resolution failures.
10
+ *
11
+ * Carries the specifier, attempted paths, a reason code, and
12
+ * a human-readable hint so callers can build precise diagnostics
13
+ * without parsing error message strings.
14
+ */
15
+ export declare class ImportResolutionError extends Error {
16
+ /** The import specifier that failed to resolve. */
17
+ readonly specifier: string;
18
+ /** Paths that were tried during resolution (in order). */
19
+ readonly attemptedPaths: readonly string[];
20
+ /** Machine-readable failure reason. */
21
+ readonly reason: ImportResolutionReason;
22
+ /** Human-readable suggestion for fixing the problem. */
23
+ readonly hint: string;
24
+ constructor(opts: {
25
+ specifier: string;
26
+ attemptedPaths?: string[];
27
+ reason: ImportResolutionReason;
28
+ hint: string;
29
+ message?: string;
30
+ });
31
+ }
4
32
  /**
5
33
  * ImportResolver resolves import statements using manifest-centric rules (PRS-010).
6
34
  *
@@ -13,45 +41,62 @@ import type { LockFile } from './types.js';
13
41
  * - ./types → ./types/index.dlang → ./types.dlang
14
42
  * - Module entry defaults to index.dlang (no model.yaml required)
15
43
  *
16
- * Caching Strategy (uses Langium standard infrastructure):
17
- * - LSP mode: Uses `WorkspaceCache` - clears on ANY document change in workspace
18
- * This is necessary because file moves/deletes affect resolution of OTHER documents
44
+ * Caching Strategy (PRS-017 R1 — uses Langium standard infrastructure):
45
+ * - LSP mode: Uses `DocumentCache` keyed by importing document URI
46
+ * Each document's import resolutions are cached independently.
47
+ * When a document changes, only ITS cache entries are auto-cleared.
48
+ * Cross-document invalidation (when an imported file moves/deletes) is
49
+ * handled by DomainLangIndexManager calling `invalidateForDocuments()`
50
+ * with the reverse dependency graph.
19
51
  * - Standalone mode: Uses `SimpleCache` - manual invalidation via clearCache()
20
52
  *
21
- * Why WorkspaceCache (not DocumentCache)?
22
- * - DocumentCache only invalidates when the KEYED document changes
23
- * - But import resolution can break when IMPORTED files are moved/deleted
24
- * - Example: index.dlang imports @domains domains/index.dlang
25
- * If domains/index.dlang is moved, index.dlang's cache entry must be cleared
26
- * DocumentCache wouldn't clear it (index.dlang didn't change)
27
- * WorkspaceCache clears on ANY change, ensuring correct re-resolution
53
+ * Why DocumentCache with manual cross-invalidation (not WorkspaceCache)?
54
+ * - WorkspaceCache clears the ENTIRE cache on ANY document change
55
+ * - In a 50-file workspace, editing one file caused ~50 redundant re-resolutions
56
+ * - DocumentCache + targeted invalidation via reverse dep graph only clears
57
+ * the changed file and its direct/transitive importers
58
+ * - This matches gopls' per-package invalidation strategy
28
59
  *
29
60
  * @see https://langium.org/docs/recipes/caching/ for Langium caching patterns
30
61
  */
31
62
  export declare class ImportResolver {
32
63
  private readonly workspaceManager;
33
64
  /**
34
- * Workspace-level cache for resolved import URIs.
35
- * In LSP mode: WorkspaceCache - clears when ANY document changes (correct for imports)
36
- * In standalone mode: SimpleCache - manual invalidation via clearCache()
65
+ * Per-document cache for resolved import URIs.
66
+ * In LSP mode: DocumentCache - clears only the changed document's entries.
67
+ * Cross-document invalidation handled by DomainLangIndexManager.
68
+ * In standalone mode: SimpleCache - manual invalidation via clearCache().
37
69
  */
38
70
  private readonly resolverCache;
71
+ /**
72
+ * Whether the cache is a DocumentCache (LSP mode) for targeted invalidation.
73
+ */
74
+ private readonly isDocumentCache;
39
75
  /**
40
76
  * Creates an ImportResolver.
41
77
  *
42
- * @param services - DomainLang services. If `services.shared` is present, uses WorkspaceCache
43
- * for automatic invalidation. Otherwise uses SimpleCache for standalone mode.
78
+ * @param services - DomainLang services. If `services.shared` is present, uses DocumentCache
79
+ * for per-document invalidation. Otherwise uses SimpleCache for standalone mode.
44
80
  */
45
81
  constructor(services: DomainLangServices);
46
82
  /**
47
83
  * Clears the entire import resolution cache.
48
- * In LSP mode, this is also triggered automatically by WorkspaceCache on any document change.
49
84
  * Call explicitly when model.yaml or model.lock changes.
50
85
  */
51
86
  clearCache(): void;
87
+ /**
88
+ * Invalidates cached import resolutions for specific documents (PRS-017 R1).
89
+ *
90
+ * Called by DomainLangIndexManager when files change, using the reverse
91
+ * dependency graph to determine which documents' caches need clearing.
92
+ * This provides targeted invalidation instead of clearing the entire cache.
93
+ *
94
+ * @param uris - Document URIs whose import resolution caches should be cleared
95
+ */
96
+ invalidateForDocuments(uris: Iterable<string>): void;
52
97
  /**
53
98
  * Resolve an import specifier relative to a Langium document.
54
- * Results are cached using WorkspaceCache (clears on any workspace change).
99
+ * Results are cached per-document using DocumentCache (PRS-017 R1).
55
100
  */
56
101
  resolveForDocument(document: LangiumDocument, specifier: string): Promise<URI>;
57
102
  /**
@@ -111,4 +156,9 @@ export declare class ImportResolver {
111
156
  * Get the current lock file (if loaded).
112
157
  */
113
158
  getLockFile(): Promise<LockFile | undefined>;
159
+ /**
160
+ * Logs an import resolution trace message when `domainlang.lsp.traceImports` is enabled.
161
+ * Output goes to stderr so it's visible in the LSP output channel.
162
+ */
163
+ private trace;
114
164
  }
@@ -1,6 +1,25 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { DocumentState, SimpleCache, WorkspaceCache, URI } from 'langium';
3
+ import { DocumentCache, SimpleCache, URI } from 'langium';
4
+ import { getLspRuntimeSettings } from './lsp-runtime-settings.js';
5
+ /**
6
+ * Structured error for import resolution failures.
7
+ *
8
+ * Carries the specifier, attempted paths, a reason code, and
9
+ * a human-readable hint so callers can build precise diagnostics
10
+ * without parsing error message strings.
11
+ */
12
+ export class ImportResolutionError extends Error {
13
+ constructor(opts) {
14
+ const msg = opts.message ?? `Cannot resolve import '${opts.specifier}': ${opts.hint}`;
15
+ super(msg);
16
+ this.name = 'ImportResolutionError';
17
+ this.specifier = opts.specifier;
18
+ this.attemptedPaths = Object.freeze(opts.attemptedPaths ?? []);
19
+ this.reason = opts.reason;
20
+ this.hint = opts.hint;
21
+ }
22
+ }
4
23
  /**
5
24
  * ImportResolver resolves import statements using manifest-centric rules (PRS-010).
6
25
  *
@@ -13,18 +32,21 @@ import { DocumentState, SimpleCache, WorkspaceCache, URI } from 'langium';
13
32
  * - ./types → ./types/index.dlang → ./types.dlang
14
33
  * - Module entry defaults to index.dlang (no model.yaml required)
15
34
  *
16
- * Caching Strategy (uses Langium standard infrastructure):
17
- * - LSP mode: Uses `WorkspaceCache` - clears on ANY document change in workspace
18
- * This is necessary because file moves/deletes affect resolution of OTHER documents
35
+ * Caching Strategy (PRS-017 R1 — uses Langium standard infrastructure):
36
+ * - LSP mode: Uses `DocumentCache` keyed by importing document URI
37
+ * Each document's import resolutions are cached independently.
38
+ * When a document changes, only ITS cache entries are auto-cleared.
39
+ * Cross-document invalidation (when an imported file moves/deletes) is
40
+ * handled by DomainLangIndexManager calling `invalidateForDocuments()`
41
+ * with the reverse dependency graph.
19
42
  * - Standalone mode: Uses `SimpleCache` - manual invalidation via clearCache()
20
43
  *
21
- * Why WorkspaceCache (not DocumentCache)?
22
- * - DocumentCache only invalidates when the KEYED document changes
23
- * - But import resolution can break when IMPORTED files are moved/deleted
24
- * - Example: index.dlang imports @domains domains/index.dlang
25
- * If domains/index.dlang is moved, index.dlang's cache entry must be cleared
26
- * DocumentCache wouldn't clear it (index.dlang didn't change)
27
- * WorkspaceCache clears on ANY change, ensuring correct re-resolution
44
+ * Why DocumentCache with manual cross-invalidation (not WorkspaceCache)?
45
+ * - WorkspaceCache clears the ENTIRE cache on ANY document change
46
+ * - In a 50-file workspace, editing one file caused ~50 redundant re-resolutions
47
+ * - DocumentCache + targeted invalidation via reverse dep graph only clears
48
+ * the changed file and its direct/transitive importers
49
+ * - This matches gopls' per-package invalidation strategy
28
50
  *
29
51
  * @see https://langium.org/docs/recipes/caching/ for Langium caching patterns
30
52
  */
@@ -32,57 +54,89 @@ export class ImportResolver {
32
54
  /**
33
55
  * Creates an ImportResolver.
34
56
  *
35
- * @param services - DomainLang services. If `services.shared` is present, uses WorkspaceCache
36
- * for automatic invalidation. Otherwise uses SimpleCache for standalone mode.
57
+ * @param services - DomainLang services. If `services.shared` is present, uses DocumentCache
58
+ * for per-document invalidation. Otherwise uses SimpleCache for standalone mode.
37
59
  */
38
60
  constructor(services) {
39
- this.workspaceManager = services.imports.WorkspaceManager;
40
- // Use Langium's WorkspaceCache when shared services are available (LSP mode)
61
+ this.workspaceManager = services.imports.ManifestManager;
62
+ // Use Langium's DocumentCache when shared services are available (LSP mode)
41
63
  // Fall back to SimpleCache for standalone utilities (SDK, CLI)
42
64
  const shared = services.shared;
43
65
  if (shared) {
44
- // LSP mode: WorkspaceCache with DocumentState.Linked
45
- //
46
- // This follows the standard pattern used by TypeScript, rust-analyzer, gopls:
47
- // - Cache is valid for a "workspace snapshot"
48
- // - Invalidates after a batch of changes completes linking (debounced ~300ms)
49
- // - Invalidates immediately on file deletion
50
- // - Does NOT invalidate during typing (would be too expensive)
66
+ // LSP mode: DocumentCache per-document sub-maps (PRS-017 R1)
51
67
  //
52
- // DocumentState.Linked is the right phase because:
53
- // - Import resolution is needed during linking
54
- // - By the time linking completes, we know which files exist
55
- // - File renames appear as delete+create, triggering immediate invalidation
56
- this.resolverCache = new WorkspaceCache(shared, DocumentState.Linked);
68
+ // Each document's import resolutions are cached in a separate sub-map.
69
+ // When a document changes, only ITS sub-map is auto-cleared.
70
+ // Cross-document invalidation (imported file moved/deleted) is handled
71
+ // by DomainLangIndexManager calling invalidateForDocuments() with the
72
+ // reverse dependency graph.
73
+ //
74
+ // This replaces the previous WorkspaceCache which cleared EVERYTHING
75
+ // on any change, causing redundant re-resolutions across the workspace.
76
+ this.resolverCache = new DocumentCache(shared);
77
+ this.isDocumentCache = true;
57
78
  }
58
79
  else {
59
80
  // Standalone mode: simple key-value cache, manual invalidation
60
81
  this.resolverCache = new SimpleCache();
82
+ this.isDocumentCache = false;
61
83
  }
62
84
  }
63
85
  /**
64
86
  * Clears the entire import resolution cache.
65
- * In LSP mode, this is also triggered automatically by WorkspaceCache on any document change.
66
87
  * Call explicitly when model.yaml or model.lock changes.
67
88
  */
68
89
  clearCache() {
69
90
  this.resolverCache.clear();
70
91
  }
92
+ /**
93
+ * Invalidates cached import resolutions for specific documents (PRS-017 R1).
94
+ *
95
+ * Called by DomainLangIndexManager when files change, using the reverse
96
+ * dependency graph to determine which documents' caches need clearing.
97
+ * This provides targeted invalidation instead of clearing the entire cache.
98
+ *
99
+ * @param uris - Document URIs whose import resolution caches should be cleared
100
+ */
101
+ invalidateForDocuments(uris) {
102
+ if (this.isDocumentCache) {
103
+ const docCache = this.resolverCache;
104
+ for (const uri of uris) {
105
+ docCache.clear(URI.parse(uri));
106
+ }
107
+ }
108
+ }
71
109
  /**
72
110
  * Resolve an import specifier relative to a Langium document.
73
- * Results are cached using WorkspaceCache (clears on any workspace change).
111
+ * Results are cached per-document using DocumentCache (PRS-017 R1).
74
112
  */
75
113
  async resolveForDocument(document, specifier) {
76
- // Cache key combines document URI + specifier for uniqueness
114
+ if (this.isDocumentCache) {
115
+ // LSP mode: DocumentCache with (documentUri, specifier) as two-part key
116
+ const docCache = this.resolverCache;
117
+ const cached = docCache.get(document.uri, specifier);
118
+ if (cached) {
119
+ this.trace(`[cache hit] ${specifier} from ${document.uri.fsPath}`);
120
+ return cached;
121
+ }
122
+ const baseDir = path.dirname(document.uri.fsPath);
123
+ const result = await this.resolveFrom(baseDir, specifier);
124
+ this.trace(`[resolved] ${specifier} from ${document.uri.fsPath} → ${result.fsPath}`);
125
+ docCache.set(document.uri, specifier, result);
126
+ return result;
127
+ }
128
+ // Standalone mode: SimpleCache with composite key
129
+ const simpleCache = this.resolverCache;
77
130
  const cacheKey = `${document.uri.toString()}|${specifier}`;
78
- const cached = this.resolverCache.get(cacheKey);
131
+ const cached = simpleCache.get(cacheKey);
79
132
  if (cached) {
133
+ this.trace(`[cache hit] ${specifier}`);
80
134
  return cached;
81
135
  }
82
- // Resolve and cache
83
136
  const baseDir = path.dirname(document.uri.fsPath);
84
137
  const result = await this.resolveFrom(baseDir, specifier);
85
- this.resolverCache.set(cacheKey, result);
138
+ this.trace(`[resolved] ${specifier} → ${result.fsPath}`);
139
+ simpleCache.set(cacheKey, result);
86
140
  return result;
87
141
  }
88
142
  /**
@@ -126,10 +180,12 @@ export class ImportResolver {
126
180
  const resolved = path.join(root, relativePath);
127
181
  return this.resolveLocalPath(resolved, specifier);
128
182
  }
129
- throw new Error(`Unknown path alias '${specifier.split('/')[0]}' in import '${specifier}'.\n` +
130
- `Hint: Define it in model.yaml paths section:\n` +
131
- ` paths:\n` +
132
- ` "${specifier.split('/')[0]}": "./some/path"`);
183
+ throw new ImportResolutionError({
184
+ specifier,
185
+ reason: 'unknown-alias',
186
+ hint: `Define it in model.yaml paths section:\n paths:\n "${specifier.split('/')[0]}": "./some/path"`,
187
+ message: `Unknown path alias '${specifier.split('/')[0]}' in import '${specifier}'.\nHint: Define it in model.yaml paths section.`
188
+ });
133
189
  }
134
190
  /**
135
191
  * Finds the longest matching alias for a specifier.
@@ -164,26 +220,31 @@ export class ImportResolver {
164
220
  async resolveExternalDependency(specifier) {
165
221
  const manifest = await this.workspaceManager.getManifest();
166
222
  if (!manifest) {
167
- throw new Error(`External dependency '${specifier}' requires model.yaml.\n` +
168
- `Hint: Create model.yaml and add the dependency:\n` +
169
- ` dependencies:\n` +
170
- ` ${specifier}:\n` +
171
- ` ref: v1.0.0`);
223
+ throw new ImportResolutionError({
224
+ specifier,
225
+ reason: 'missing-manifest',
226
+ hint: `Create model.yaml and add the dependency:\n dependencies:\n ${specifier}:\n ref: v1.0.0`,
227
+ message: `External dependency '${specifier}' requires model.yaml.`
228
+ });
172
229
  }
173
230
  const lock = await this.workspaceManager.getLockFile();
174
231
  if (!lock) {
175
- throw new Error(`Dependency '${specifier}' not installed.\n` +
176
- `Hint: Run 'dlang install' to fetch dependencies and generate model.lock.`);
232
+ throw new ImportResolutionError({
233
+ specifier,
234
+ reason: 'not-installed',
235
+ hint: "Run 'dlang install' to fetch dependencies and generate model.lock.",
236
+ message: `Dependency '${specifier}' not installed.`
237
+ });
177
238
  }
178
239
  // Use WorkspaceManager to resolve from cache (read-only, no network)
179
240
  const resolved = await this.workspaceManager.resolveDependencyPath(specifier);
180
241
  if (!resolved) {
181
- throw new Error(`Dependency '${specifier}' not found in model.yaml or not installed.\n` +
182
- `Hint: Add it to your dependencies:\n` +
183
- ` dependencies:\n` +
184
- ` ${specifier}:\n` +
185
- ` ref: v1.0.0\n` +
186
- `Then run 'dlang install' to fetch it.`);
242
+ throw new ImportResolutionError({
243
+ specifier,
244
+ reason: 'dependency-not-found',
245
+ hint: `Add it to your dependencies:\n dependencies:\n ${specifier}:\n ref: v1.0.0\nThen run 'dlang install' to fetch it.`,
246
+ message: `Dependency '${specifier}' not found in model.yaml or not installed.`
247
+ });
187
248
  }
188
249
  return URI.file(resolved);
189
250
  }
@@ -204,8 +265,13 @@ export class ImportResolver {
204
265
  return URI.file(resolved);
205
266
  }
206
267
  if (ext && ext !== '.dlang') {
207
- throw new Error(`Invalid file extension '${ext}' in import '${original}'.\n` +
208
- `Hint: DomainLang files must use the .dlang extension.`);
268
+ throw new ImportResolutionError({
269
+ specifier: original,
270
+ attemptedPaths: [resolved],
271
+ reason: 'unresolvable',
272
+ hint: `DomainLang files must use the .dlang extension.`,
273
+ message: `Invalid file extension '${ext}' in import '${original}'.`
274
+ });
209
275
  }
210
276
  // No extension → directory-first resolution
211
277
  return this.resolveDirectoryFirst(resolved, original);
@@ -228,11 +294,12 @@ export class ImportResolver {
228
294
  return URI.file(entryFile);
229
295
  }
230
296
  // Directory exists but no entry file
231
- throw new Error(`Module '${original}' is missing its entry file.\n` +
232
- `Expected: ${resolved}/${entryPoint}\n` +
233
- `Hint: Create '${entryPoint}' in the module directory, or specify a custom entry in model.yaml:\n` +
234
- ` model:\n` +
235
- ` entry: main.dlang`);
297
+ throw new ImportResolutionError({
298
+ specifier: original,
299
+ attemptedPaths: [path.join(resolved, entryPoint)],
300
+ reason: 'missing-entry',
301
+ hint: `Create '${entryPoint}' in the module directory, or specify a custom entry in model.yaml:\n model:\n entry: main.dlang`
302
+ });
236
303
  }
237
304
  // Step 2: Try .dlang file fallback
238
305
  const fileWithExt = `${resolved}.dlang`;
@@ -240,11 +307,12 @@ export class ImportResolver {
240
307
  return URI.file(fileWithExt);
241
308
  }
242
309
  // Neither directory nor file found
243
- throw new Error(`Cannot resolve import '${original}'.\n` +
244
- `Tried:\n` +
245
- ` • ${resolved}/index.dlang (directory module)\n` +
246
- ` • ${resolved}.dlang (file)\n` +
247
- `Hint: Check that the path is correct and the file exists.`);
310
+ throw new ImportResolutionError({
311
+ specifier: original,
312
+ attemptedPaths: [`${resolved}/index.dlang`, `${resolved}.dlang`],
313
+ reason: 'file-not-found',
314
+ hint: 'Check that the path is correct and the file exists.'
315
+ });
248
316
  }
249
317
  /**
250
318
  * Reads the entry point from a module's model.yaml.
@@ -291,15 +359,28 @@ export class ImportResolver {
291
359
  async getLockFile() {
292
360
  return this.workspaceManager.getLockFile();
293
361
  }
362
+ // --- PRS-017 R10: Import resolution tracing ---
363
+ /**
364
+ * Logs an import resolution trace message when `domainlang.lsp.traceImports` is enabled.
365
+ * Output goes to stderr so it's visible in the LSP output channel.
366
+ */
367
+ trace(message) {
368
+ if (getLspRuntimeSettings().traceImports) {
369
+ console.warn(`[ImportResolver] ${message}`);
370
+ }
371
+ }
294
372
  }
295
373
  async function assertFileExists(filePath, original) {
296
374
  try {
297
375
  await fs.access(filePath);
298
376
  }
299
377
  catch {
300
- throw new Error(`Import file not found: '${original}'.\n` +
301
- `Resolved path: ${filePath}\n` +
302
- `Hint: Check that the file exists and the path is correct.`);
378
+ throw new ImportResolutionError({
379
+ specifier: original,
380
+ attemptedPaths: [filePath],
381
+ reason: 'file-not-found',
382
+ hint: 'Check that the file exists and the path is correct.'
383
+ });
303
384
  }
304
385
  }
305
386
  //# sourceMappingURL=import-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../src/services/import-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../src/services/import-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Structured LSP logger for DomainLang (PRS-017 R17).
3
+ *
4
+ * Wraps console.warn/error with structured context (component name,
5
+ * document URI, timing data) so that log messages are easy to
6
+ * correlate when debugging multi-file change propagation.
7
+ *
8
+ * Usage:
9
+ * ```ts
10
+ * const log = createLogger('IndexManager');
11
+ * log.info('exports changed', { uri, count: 3 });
12
+ * log.warn('stale cache entry');
13
+ * log.error('cycle detected', { cycle: ['a', 'b', 'a'] });
14
+ * log.timed('rebuildAll', async () => { ...work... });
15
+ * ```
16
+ *
17
+ * Output goes to stderr (visible in VS Code's "Output" → "DomainLang" channel)
18
+ * because the LSP protocol uses stdout for JSON-RPC messages.
19
+ */
20
+ /** Structured context attached to log messages. */
21
+ export interface LogContext {
22
+ /** Langium document URI, shortened for readability. */
23
+ uri?: string;
24
+ /** Additional key → value pairs (serialised as JSON). */
25
+ [key: string]: unknown;
26
+ }
27
+ export interface LspLogger {
28
+ info(message: string, context?: LogContext): void;
29
+ warn(message: string, context?: LogContext): void;
30
+ error(message: string, context?: LogContext): void;
31
+ /**
32
+ * Measures and logs the duration of an async operation.
33
+ * Returns the operation's result.
34
+ */
35
+ timed<T>(label: string, fn: () => T | Promise<T>): Promise<T>;
36
+ }
37
+ /**
38
+ * Creates a structured logger scoped to a named component.
39
+ *
40
+ * @param component - Short component name (e.g. 'IndexManager', 'ImportResolver')
41
+ */
42
+ export declare function createLogger(component: string): LspLogger;