@birdcc/lsp 0.0.1-alpha.1 → 0.1.0-beta.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 (86) hide show
  1. package/README.md +25 -23
  2. package/dist/asn-completion.d.ts +21 -0
  3. package/dist/asn-completion.d.ts.map +1 -0
  4. package/dist/asn-completion.js +42 -0
  5. package/dist/asn-completion.js.map +1 -0
  6. package/dist/asn-context.d.ts +9 -0
  7. package/dist/asn-context.d.ts.map +1 -0
  8. package/dist/asn-context.js +203 -0
  9. package/dist/asn-context.js.map +1 -0
  10. package/dist/asn-hover.d.ts +11 -0
  11. package/dist/asn-hover.d.ts.map +1 -0
  12. package/dist/asn-hover.js +33 -0
  13. package/dist/asn-hover.js.map +1 -0
  14. package/dist/asn-inlay-hints.d.ts +13 -0
  15. package/dist/asn-inlay-hints.d.ts.map +1 -0
  16. package/dist/asn-inlay-hints.js +47 -0
  17. package/dist/asn-inlay-hints.js.map +1 -0
  18. package/dist/diagnostic.d.ts.map +1 -1
  19. package/dist/diagnostic.js +2 -10
  20. package/dist/diagnostic.js.map +1 -1
  21. package/dist/document-symbol.js +1 -1
  22. package/dist/document-symbol.js.map +1 -1
  23. package/dist/hover-context.d.ts +31 -0
  24. package/dist/hover-context.d.ts.map +1 -0
  25. package/dist/hover-context.js +125 -0
  26. package/dist/hover-context.js.map +1 -0
  27. package/dist/hover-docs/00-base.yaml +5 -0
  28. package/dist/hover-docs/10-global-options.yaml +442 -0
  29. package/dist/hover-docs/20-filter-language.yaml +209 -0
  30. package/dist/hover-docs/30-channel-options.yaml +244 -0
  31. package/dist/hover-docs/40-protocol-common.yaml +59 -0
  32. package/dist/hover-docs/41-protocol-igp.yaml +305 -0
  33. package/dist/hover-docs/42-protocol-kernel-static.yaml +220 -0
  34. package/dist/hover-docs/43-protocol-mpls.yaml +40 -0
  35. package/dist/hover-docs/44-protocol-extended.yaml +635 -0
  36. package/dist/hover-docs/50-protocol-bgp.yaml +482 -0
  37. package/dist/hover-docs/60-protocol-ospf.yaml +527 -0
  38. package/dist/hover-docs.d.ts +5 -1
  39. package/dist/hover-docs.d.ts.map +1 -1
  40. package/dist/hover-docs.js +376 -51
  41. package/dist/hover-docs.js.map +1 -1
  42. package/dist/hover-usage/00-base.yaml +2 -0
  43. package/dist/hover-usage/10-global-usage.yaml +73 -0
  44. package/dist/hover-usage/20-filter-usage.yaml +41 -0
  45. package/dist/hover-usage/30-channel-usage.yaml +41 -0
  46. package/dist/hover-usage/40-protocol-usage.yaml +258 -0
  47. package/dist/hover-usage/50-bgp-usage.yaml +254 -0
  48. package/dist/hover-usage/60-ospf-usage.yaml +340 -0
  49. package/dist/hover.d.ts +10 -0
  50. package/dist/hover.d.ts.map +1 -1
  51. package/dist/hover.js +152 -46
  52. package/dist/hover.js.map +1 -1
  53. package/dist/index.d.ts +7 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +6 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/init/workspace-init.d.ts +28 -0
  58. package/dist/init/workspace-init.d.ts.map +1 -0
  59. package/dist/init/workspace-init.js +72 -0
  60. package/dist/init/workspace-init.js.map +1 -0
  61. package/dist/lsp-server.d.ts +7 -1
  62. package/dist/lsp-server.d.ts.map +1 -1
  63. package/dist/lsp-server.js +277 -65
  64. package/dist/lsp-server.js.map +1 -1
  65. package/dist/project-config.d.ts +22 -0
  66. package/dist/project-config.d.ts.map +1 -0
  67. package/dist/project-config.js +307 -0
  68. package/dist/project-config.js.map +1 -0
  69. package/dist/shared.d.ts +1 -0
  70. package/dist/shared.d.ts.map +1 -1
  71. package/dist/shared.js +4 -24
  72. package/dist/shared.js.map +1 -1
  73. package/dist/symbol-utils.d.ts +6 -6
  74. package/dist/symbol-utils.d.ts.map +1 -1
  75. package/dist/symbol-utils.js +24 -25
  76. package/dist/symbol-utils.js.map +1 -1
  77. package/dist/type-hint-inlay.d.ts +4 -0
  78. package/dist/type-hint-inlay.d.ts.map +1 -0
  79. package/dist/type-hint-inlay.js +27 -0
  80. package/dist/type-hint-inlay.js.map +1 -0
  81. package/dist/utils.d.ts +65 -0
  82. package/dist/utils.d.ts.map +1 -0
  83. package/dist/utils.js +97 -0
  84. package/dist/utils.js.map +1 -0
  85. package/package.json +11 -7
  86. package/dist/hover-docs.yaml +0 -600
@@ -0,0 +1,28 @@
1
+ /**
2
+ * LSP workspace initialization — uses sniffProjectEntrypoints() to auto-detect
3
+ * project entry points when no bird.config.json is present.
4
+ *
5
+ * The LSP server calls this during initialization to provide a smooth
6
+ * zero-config experience. Detection results can trigger:
7
+ * - Auto-selection of entry point (high confidence)
8
+ * - Information message with suggestion (medium confidence)
9
+ * - Warning message requesting user action (low confidence / ambiguous)
10
+ */
11
+ import { type DetectionResult } from "@birdcc/core";
12
+ import type { Connection } from "vscode-languageserver/node.js";
13
+ export interface WorkspaceInitResult {
14
+ detectionResult: DetectionResult;
15
+ /** Suggested entry URI (file:// scheme) if detection was confident enough */
16
+ suggestedEntryUri: string | null;
17
+ /** Whether the user should be prompted for confirmation */
18
+ needsConfirmation: boolean;
19
+ }
20
+ /**
21
+ * Run project entry-point detection for a workspace root.
22
+ *
23
+ * @param workspaceRootUri - file:// URI of the workspace root
24
+ * @param connection - LSP connection for sending notifications
25
+ * @returns Detection result with suggested entry URI
26
+ */
27
+ export declare const detectWorkspaceEntry: (workspaceRootUri: string, connection: Connection) => Promise<WorkspaceInitResult>;
28
+ //# sourceMappingURL=workspace-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-init.d.ts","sourceRoot":"","sources":["../../src/init/workspace-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,eAAe,CAAC;IACjC,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,2DAA2D;IAC3D,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,kBAAkB,MAAM,EACxB,YAAY,UAAU,KACrB,OAAO,CAAC,mBAAmB,CA8E7B,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * LSP workspace initialization — uses sniffProjectEntrypoints() to auto-detect
3
+ * project entry points when no bird.config.json is present.
4
+ *
5
+ * The LSP server calls this during initialization to provide a smooth
6
+ * zero-config experience. Detection results can trigger:
7
+ * - Auto-selection of entry point (high confidence)
8
+ * - Information message with suggestion (medium confidence)
9
+ * - Warning message requesting user action (low confidence / ambiguous)
10
+ */
11
+ import { resolve } from "node:path";
12
+ import { fileURLToPath, pathToFileURL } from "node:url";
13
+ import { sniffProjectEntrypoints } from "@birdcc/core";
14
+ import { showInfo, showWarning } from "../utils.js";
15
+ /**
16
+ * Run project entry-point detection for a workspace root.
17
+ *
18
+ * @param workspaceRootUri - file:// URI of the workspace root
19
+ * @param connection - LSP connection for sending notifications
20
+ * @returns Detection result with suggested entry URI
21
+ */
22
+ export const detectWorkspaceEntry = async (workspaceRootUri, connection) => {
23
+ const rootPath = fileURLToPath(workspaceRootUri);
24
+ const toSuggestedEntryUri = (relativePath) => pathToFileURL(resolve(rootPath, relativePath)).toString();
25
+ const result = await sniffProjectEntrypoints(rootPath, {
26
+ maxDepth: 8,
27
+ maxFiles: 20_000,
28
+ });
29
+ // Log detection result
30
+ connection.console.log(`[init] Project detection: kind=${result.kind}, confidence=${result.confidence}%, candidates=${result.candidates.length}`);
31
+ for (const warning of result.warnings) {
32
+ connection.console.log(`[init] Warning: [${warning.code}] ${warning.message}`);
33
+ }
34
+ // Determine suggested entry and whether confirmation is needed
35
+ let suggestedEntryUri = null;
36
+ let needsConfirmation = false;
37
+ switch (result.kind) {
38
+ case "single": {
39
+ if (result.primary) {
40
+ suggestedEntryUri = toSuggestedEntryUri(result.primary.path);
41
+ connection.console.log(`[init] Auto-detected entry: ${result.primary.path} (confidence: ${result.confidence}%)`);
42
+ showInfo(connection, `Auto-detected BIRD entry: ${result.primary.path} (${result.confidence}% confidence).`);
43
+ }
44
+ break;
45
+ }
46
+ case "single-ambiguous": {
47
+ if (result.primary) {
48
+ suggestedEntryUri = toSuggestedEntryUri(result.primary.path);
49
+ needsConfirmation = true;
50
+ showWarning(connection, `BIRD project entry detected with low confidence: ${result.primary.path}. Consider creating bird.config.json with \`birdcc init\`.`);
51
+ }
52
+ break;
53
+ }
54
+ case "monorepo-multi-entry": {
55
+ showInfo(connection, `Multiple BIRD project entries detected. Run \`birdcc init --write\` to generate workspace configuration.`);
56
+ break;
57
+ }
58
+ case "monorepo-multi-role": {
59
+ if (result.primary) {
60
+ suggestedEntryUri = toSuggestedEntryUri(result.primary.path);
61
+ showInfo(connection, `BIRD project with multiple roles detected. Entry: ${result.primary.path}. Run \`birdcc init --write\` for full configuration.`);
62
+ }
63
+ break;
64
+ }
65
+ case "not-found": {
66
+ // No message for not-found — the project may not be a BIRD project
67
+ break;
68
+ }
69
+ }
70
+ return { detectionResult: result, suggestedEntryUri, needsConfirmation };
71
+ };
72
+ //# sourceMappingURL=workspace-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-init.js","sourceRoot":"","sources":["../../src/init/workspace-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAwB,MAAM,cAAc,CAAC;AAE7E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAUpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACvC,gBAAwB,EACxB,UAAsB,EACQ,EAAE;IAChC,MAAM,QAAQ,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACjD,MAAM,mBAAmB,GAAG,CAAC,YAAoB,EAAU,EAAE,CAC3D,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE5D,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,QAAQ,EAAE;QACrD,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,uBAAuB;IACvB,UAAU,CAAC,OAAO,CAAC,GAAG,CACpB,kCAAkC,MAAM,CAAC,IAAI,gBAAgB,MAAM,CAAC,UAAU,iBAAiB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAC1H,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,UAAU,CAAC,OAAO,CAAC,GAAG,CACpB,oBAAoB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CACvD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,IAAI,iBAAiB,GAAkB,IAAI,CAAC;IAC5C,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,iBAAiB,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7D,UAAU,CAAC,OAAO,CAAC,GAAG,CACpB,+BAA+B,MAAM,CAAC,OAAO,CAAC,IAAI,iBAAiB,MAAM,CAAC,UAAU,IAAI,CACzF,CAAC;gBACF,QAAQ,CACN,UAAU,EACV,6BAA6B,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,gBAAgB,CACvF,CAAC;YACJ,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,iBAAiB,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7D,iBAAiB,GAAG,IAAI,CAAC;gBACzB,WAAW,CACT,UAAU,EACV,oDAAoD,MAAM,CAAC,OAAO,CAAC,IAAI,4DAA4D,CACpI,CAAC;YACJ,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC5B,QAAQ,CACN,UAAU,EACV,0GAA0G,CAC3G,CAAC;YACF,MAAM;QACR,CAAC;QAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,iBAAiB,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7D,QAAQ,CACN,UAAU,EACV,qDAAqD,MAAM,CAAC,OAAO,CAAC,IAAI,uDAAuD,CAChI,CAAC;YACJ,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,mEAAmE;YACnE,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AAC3E,CAAC,CAAC"}
@@ -1,3 +1,9 @@
1
+ export interface LspServerOptions {
2
+ /** Override the path to the ASN database binary. Undefined = use bundled default. */
3
+ asnDbPath?: string;
4
+ /** Disable ASN intelligence entirely. */
5
+ disableAsnIntel?: boolean;
6
+ }
1
7
  /** Starts the stdio LSP server with async lint validation and last-write-wins scheduling. */
2
- export declare const startLspServer: () => void;
8
+ export declare const startLspServer: (options?: LspServerOptions) => void;
3
9
  //# sourceMappingURL=lsp-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-server.d.ts","sourceRoot":"","sources":["../src/lsp-server.ts"],"names":[],"mappings":"AAuEA,6FAA6F;AAC7F,eAAO,MAAM,cAAc,QAAO,IAqRjC,CAAC"}
1
+ {"version":3,"file":"lsp-server.d.ts","sourceRoot":"","sources":["../src/lsp-server.ts"],"names":[],"mappings":"AAoGA,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,6FAA6F;AAC7F,eAAO,MAAM,cAAc,GAAI,UAAU,gBAAgB,KAAG,IA0hB3D,CAAC"}
@@ -1,18 +1,32 @@
1
- import { DEFAULT_CROSS_FILE_MAX_DEPTH, DEFAULT_CROSS_FILE_MAX_FILES, resolveCrossFileReferences, } from "@birdcc/core";
1
+ import { access } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { DEFAULT_CROSS_FILE_MAX_DEPTH, DEFAULT_CROSS_FILE_MAX_FILES, collectFunctionReturnHints, resolveCrossFileReferences, } from "@birdcc/core";
2
5
  import { createConnection, ProposedFeatures, TextDocuments, TextDocumentSyncKind, } from "vscode-languageserver/node.js";
3
6
  import { TextDocument } from "vscode-languageserver-textdocument";
4
7
  import { parseBirdConfig } from "@birdcc/parser";
5
8
  import { lintBirdConfig, lintResolvedCrossFileGraph, } from "@birdcc/linter";
9
+ import { formatBirdConfig } from "@birdcc/formatter";
10
+ import { createAsnIntel } from "@birdcc/intel";
6
11
  import { createCompletionItemsFromParsed } from "./completion.js";
7
12
  import { createDefinitionLocations } from "./definition.js";
8
13
  import { createDocumentSymbolsFromParsed } from "./document-symbol.js";
9
14
  import { toInternalErrorDiagnostic, toLspDiagnostic } from "./diagnostic.js";
10
15
  import { createHoverFromParsed } from "./hover.js";
16
+ import { createAsnCompletionItems } from "./asn-completion.js";
17
+ import { createAsnInlayHints } from "./asn-inlay-hints.js";
18
+ import { createTypeHintInlayHints } from "./type-hint-inlay.js";
19
+ import { createAsnHover } from "./asn-hover.js";
20
+ import { detectWorkspaceEntry } from "./init/workspace-init.js";
21
+ import { resolveProjectAnalysisOptions } from "./project-config.js";
11
22
  import { createReferenceLocations } from "./references.js";
23
+ import { clearDiagnostics, clearDiagnosticsMany, getLineText, publishDiagnostics, showInfoOnce, withDocument, } from "./utils.js";
12
24
  import { createValidationScheduler } from "./validation.js";
13
25
  const VALIDATION_DEBOUNCE_MS = 120;
14
26
  const INCLUDE_MAX_DEPTH = DEFAULT_CROSS_FILE_MAX_DEPTH;
15
27
  const INCLUDE_MAX_FILES = DEFAULT_CROSS_FILE_MAX_FILES;
28
+ const TYPE_HINT_MAX_FILE_SIZE_BYTES = 2 * 1024 * 1024;
29
+ const PROJECT_CONFIG_FILE_NAMES = ["bird.config.json", "birdcc.config.json"];
16
30
  const warmupParserRuntime = async () => {
17
31
  try {
18
32
  await lintBirdConfig("");
@@ -32,20 +46,70 @@ const flattenAdditionalDeclarations = (graph, uri) => {
32
46
  return declarations;
33
47
  };
34
48
  /** Starts the stdio LSP server with async lint validation and last-write-wins scheduling. */
35
- export const startLspServer = () => {
49
+ export const startLspServer = (options) => {
36
50
  const connection = createConnection(ProposedFeatures.all);
37
51
  const documents = new TextDocuments(TextDocument);
38
52
  const parsedByUri = new Map();
39
53
  const graphByUri = new Map();
54
+ const typeHintsByUri = new Map();
40
55
  const publishedUrisByEntry = new Map();
56
+ /** Dedup in-flight `getGraphForDocument` calls so concurrent requests share one analysis. */
57
+ const pendingGraphByUri = new Map();
58
+ const announcedProjectConfigs = new Set();
59
+ const announcedInfoNotifications = new Set();
60
+ let workspaceRootUris = [];
61
+ let noConfigTipAnnounced = false;
41
62
  let hasShutdownBeenRequested = false;
63
+ const typeHintMaxBytes = TYPE_HINT_MAX_FILE_SIZE_BYTES;
64
+ // ASN intelligence — loads the bundled database (gracefully degrades if missing)
65
+ const asnIntel = options?.disableAsnIntel
66
+ ? {
67
+ available: false,
68
+ count: 0,
69
+ exactLookup: () => undefined,
70
+ prefixSearch: () => [],
71
+ formatDisplay: () => ({
72
+ inlayLabel: "",
73
+ completionDetail: "",
74
+ hoverMarkdown: "",
75
+ }),
76
+ lookupDisplay: () => undefined,
77
+ }
78
+ : createAsnIntel(options?.asnDbPath);
79
+ if (asnIntel.available) {
80
+ connection.console.log(`[intel] ASN database loaded: ${asnIntel.count} records`);
81
+ }
42
82
  void warmupParserRuntime();
43
- const clearEntryTracking = (entryUri) => {
44
- const publishedUris = publishedUrisByEntry.get(entryUri);
45
- if (publishedUris) {
46
- for (const uri of publishedUris) {
47
- connection.sendDiagnostics({ uri, diagnostics: [] });
83
+ const hasProjectConfigAtWorkspaceRoot = async (workspaceRootUri) => {
84
+ try {
85
+ const workspaceRootPath = fileURLToPath(workspaceRootUri);
86
+ for (const fileName of PROJECT_CONFIG_FILE_NAMES) {
87
+ // eslint-disable-next-line no-await-in-loop
88
+ try {
89
+ await access(join(workspaceRootPath, fileName));
90
+ return true;
91
+ }
92
+ catch (error) {
93
+ const ioError = error;
94
+ if (ioError.code === "ENOENT") {
95
+ continue;
96
+ }
97
+ throw error;
98
+ }
48
99
  }
100
+ return false;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ };
106
+ const notifyInfoOnce = (key, message) => {
107
+ showInfoOnce(connection, announcedInfoNotifications, key, message);
108
+ };
109
+ const clearEntryTracking = (entryUri) => {
110
+ const previousUris = publishedUrisByEntry.get(entryUri);
111
+ if (previousUris) {
112
+ clearDiagnosticsMany(connection, previousUris);
49
113
  publishedUrisByEntry.delete(entryUri);
50
114
  }
51
115
  for (const [uri, graph] of graphByUri.entries()) {
@@ -55,19 +119,71 @@ export const startLspServer = () => {
55
119
  }
56
120
  };
57
121
  const analyzeDocument = async (document, options) => {
122
+ const project = await resolveProjectAnalysisOptions({
123
+ documentUri: document.uri,
124
+ workspaceRootUris,
125
+ defaults: {
126
+ maxDepth: INCLUDE_MAX_DEPTH,
127
+ maxFiles: INCLUDE_MAX_FILES,
128
+ },
129
+ });
130
+ if (project.configPath &&
131
+ !announcedProjectConfigs.has(project.configPath)) {
132
+ announcedProjectConfigs.add(project.configPath);
133
+ connection.console.log(`[project] using ${project.configPath} (mode=${project.mode}, entry=${project.entryUri})`);
134
+ notifyInfoOnce(`project-config:${project.configPath}`, `Using ${basename(project.configPath)} (${project.mode} mode) for cross-file analysis.`);
135
+ }
136
+ else if (!project.configPath &&
137
+ workspaceRootUris.length > 1 &&
138
+ !noConfigTipAnnounced) {
139
+ noConfigTipAnnounced = true;
140
+ connection.console.log("[project] no bird.config.json detected; add one with workspaces/main/includePaths for monorepo-grade analysis");
141
+ notifyInfoOnce("project-config:missing-monorepo", "No bird.config.json found in this multi-root workspace. Add workspaces/main/includePaths for better analysis.");
142
+ }
143
+ if (!project.crossFileEnabled) {
144
+ const lintResult = await lintBirdConfig(document.getText(), {
145
+ uri: document.uri,
146
+ });
147
+ const graph = {
148
+ entryUri: document.uri,
149
+ visitedUris: new Set([document.uri]),
150
+ symbolTable: lintResult.core.symbolTable,
151
+ byUri: { [document.uri]: lintResult },
152
+ };
153
+ parsedByUri.set(document.uri, {
154
+ version: document.version,
155
+ parsed: lintResult.parsed,
156
+ });
157
+ graphByUri.set(document.uri, graph);
158
+ return {
159
+ entryDiagnostics: lintResult.diagnostics.map(toLspDiagnostic),
160
+ graph,
161
+ };
162
+ }
58
163
  const openDocuments = documents.all().map((item) => ({
59
164
  uri: item.uri,
60
165
  text: item.getText(),
61
166
  }));
62
167
  const crossFile = await resolveCrossFileReferences({
63
- entryUri: document.uri,
168
+ entryUri: project.entryUri,
64
169
  documents: openDocuments,
65
170
  loadFromFileSystem: true,
66
- maxDepth: INCLUDE_MAX_DEPTH,
67
- maxFiles: INCLUDE_MAX_FILES,
171
+ maxDepth: project.maxDepth,
172
+ maxFiles: project.maxFiles,
173
+ workspaceRootUri: project.workspaceRootUri,
174
+ allowIncludeOutsideWorkspace: project.allowIncludeOutsideWorkspace,
175
+ includeSearchPaths: project.includeSearchPathUris,
68
176
  });
69
177
  const lintGraph = await lintResolvedCrossFileGraph(crossFile);
70
- const visitedUris = new Set(crossFile.visitedUris.length > 0 ? crossFile.visitedUris : [document.uri]);
178
+ if (!Object.hasOwn(lintGraph.byUri, document.uri)) {
179
+ lintGraph.byUri[document.uri] = await lintBirdConfig(document.getText(), {
180
+ uri: document.uri,
181
+ });
182
+ }
183
+ const visitedUris = new Set(crossFile.visitedUris.length > 0
184
+ ? crossFile.visitedUris
185
+ : [project.entryUri]);
186
+ visitedUris.add(document.uri);
71
187
  const graph = {
72
188
  entryUri: document.uri,
73
189
  visitedUris,
@@ -91,20 +207,14 @@ export const startLspServer = () => {
91
207
  if (options.publishRelatedDiagnostics) {
92
208
  const previousUris = publishedUrisByEntry.get(document.uri) ?? new Set();
93
209
  for (const uri of previousUris) {
94
- if (visitedUris.has(uri)) {
95
- continue;
210
+ if (!visitedUris.has(uri)) {
211
+ clearDiagnostics(connection, uri);
96
212
  }
97
- connection.sendDiagnostics({ uri, diagnostics: [] });
98
213
  }
99
214
  for (const [uri, diagnostics] of diagnosticsByUri) {
100
- if (uri === document.uri) {
101
- continue;
215
+ if (uri !== document.uri) {
216
+ publishDiagnostics(connection, uri, diagnostics, documents.get(uri)?.version);
102
217
  }
103
- connection.sendDiagnostics({
104
- uri,
105
- version: documents.get(uri)?.version,
106
- diagnostics,
107
- });
108
218
  }
109
219
  publishedUrisByEntry.set(document.uri, visitedUris);
110
220
  }
@@ -115,24 +225,69 @@ export const startLspServer = () => {
115
225
  if (cached) {
116
226
  return cached;
117
227
  }
118
- const analyzed = await analyzeDocument(document, {
228
+ // Dedup concurrent requests: reuse in-flight promise for the same URI.
229
+ const pending = pendingGraphByUri.get(document.uri);
230
+ if (pending) {
231
+ return pending;
232
+ }
233
+ const promise = analyzeDocument(document, {
119
234
  publishRelatedDiagnostics: false,
120
- });
121
- return analyzed.graph;
235
+ }).then((analyzed) => analyzed.graph);
236
+ pendingGraphByUri.set(document.uri, promise);
237
+ try {
238
+ return await promise;
239
+ }
240
+ finally {
241
+ pendingGraphByUri.delete(document.uri);
242
+ }
122
243
  };
123
- connection.onInitialize(() => ({
124
- capabilities: {
125
- textDocumentSync: TextDocumentSyncKind.Incremental,
126
- documentSymbolProvider: true,
127
- hoverProvider: true,
128
- definitionProvider: true,
129
- referencesProvider: true,
130
- completionProvider: {
131
- resolveProvider: false,
132
- triggerCharacters: [" ", "."],
244
+ connection.onInitialize((params) => {
245
+ workspaceRootUris =
246
+ params.workspaceFolders
247
+ ?.map((folder) => folder.uri)
248
+ .filter((uri) => uri.startsWith("file://")) ?? [];
249
+ if (workspaceRootUris.length === 0 &&
250
+ params.rootUri &&
251
+ params.rootUri.startsWith("file://")) {
252
+ workspaceRootUris = [params.rootUri];
253
+ }
254
+ return {
255
+ capabilities: {
256
+ textDocumentSync: TextDocumentSyncKind.Incremental,
257
+ documentSymbolProvider: true,
258
+ hoverProvider: true,
259
+ definitionProvider: true,
260
+ referencesProvider: true,
261
+ documentFormattingProvider: true,
262
+ completionProvider: {
263
+ resolveProvider: false,
264
+ triggerCharacters: [" ", "."],
265
+ },
266
+ inlayHintProvider: true,
133
267
  },
134
- },
135
- }));
268
+ };
269
+ });
270
+ connection.onInitialized(() => {
271
+ void (async () => {
272
+ for (const workspaceRootUri of workspaceRootUris) {
273
+ if (hasShutdownBeenRequested) {
274
+ return;
275
+ }
276
+ // eslint-disable-next-line no-await-in-loop
277
+ const hasProjectConfig = await hasProjectConfigAtWorkspaceRoot(workspaceRootUri);
278
+ if (hasProjectConfig) {
279
+ continue;
280
+ }
281
+ try {
282
+ // eslint-disable-next-line no-await-in-loop
283
+ await detectWorkspaceEntry(workspaceRootUri, connection);
284
+ }
285
+ catch (error) {
286
+ connection.console.log(`[init] workspace entry detection failed for ${workspaceRootUri}: ${error instanceof Error ? error.message : String(error)}`);
287
+ }
288
+ }
289
+ })();
290
+ });
136
291
  const scheduler = createValidationScheduler({
137
292
  debounceMs: VALIDATION_DEBOUNCE_MS,
138
293
  validate: async (textDocument) => {
@@ -146,8 +301,8 @@ export const startLspServer = () => {
146
301
  return [toInternalErrorDiagnostic(error)];
147
302
  }
148
303
  },
149
- publish: (payload) => {
150
- connection.sendDiagnostics(payload);
304
+ publish: ({ uri, version, diagnostics }) => {
305
+ publishDiagnostics(connection, uri, diagnostics, version);
151
306
  },
152
307
  });
153
308
  documents.onDidOpen((event) => {
@@ -159,6 +314,7 @@ export const startLspServer = () => {
159
314
  documents.onDidClose((event) => {
160
315
  parsedByUri.delete(event.document.uri);
161
316
  clearEntryTracking(event.document.uri);
317
+ typeHintsByUri.delete(event.document.uri);
162
318
  scheduler.close(event.document.uri);
163
319
  });
164
320
  const getParsedDocument = async (document) => {
@@ -173,27 +329,42 @@ export const startLspServer = () => {
173
329
  });
174
330
  return parsed;
175
331
  };
176
- connection.onDocumentSymbol(async (params) => {
177
- const document = documents.get(params.textDocument.uri);
178
- if (!document) {
332
+ const getTypeHintsForDocument = async (document) => {
333
+ const cached = typeHintsByUri.get(document.uri);
334
+ if (cached && cached.version === document.version) {
335
+ return cached.hints;
336
+ }
337
+ const text = document.getText();
338
+ if (Buffer.byteLength(text, "utf8") > typeHintMaxBytes) {
339
+ typeHintsByUri.set(document.uri, {
340
+ version: document.version,
341
+ hints: [],
342
+ });
179
343
  return [];
180
344
  }
345
+ const hints = await collectFunctionReturnHints(text);
346
+ typeHintsByUri.set(document.uri, {
347
+ version: document.version,
348
+ hints,
349
+ });
350
+ return hints;
351
+ };
352
+ connection.onDocumentSymbol(async (params) => withDocument(documents, params.textDocument.uri, [], async (document) => {
181
353
  const parsed = await getParsedDocument(document);
182
354
  return createDocumentSymbolsFromParsed(parsed);
183
- });
184
- connection.onHover(async (params) => {
185
- const document = documents.get(params.textDocument.uri);
186
- if (!document) {
187
- return null;
355
+ }));
356
+ connection.onHover(async (params) => withDocument(documents, params.textDocument.uri, null, async (document) => {
357
+ // Try ASN hover first (more specific)
358
+ if (asnIntel.available) {
359
+ const lineText = getLineText(document, params.position.line);
360
+ const asnHover = createAsnHover(asnIntel, lineText, params.position);
361
+ if (asnHover)
362
+ return asnHover;
188
363
  }
189
364
  const parsed = await getParsedDocument(document);
190
365
  return createHoverFromParsed(parsed, document, params.position);
191
- });
192
- connection.onDefinition(async (params) => {
193
- const document = documents.get(params.textDocument.uri);
194
- if (!document) {
195
- return [];
196
- }
366
+ }));
367
+ connection.onDefinition(async (params) => withDocument(documents, params.textDocument.uri, [], async (document) => {
197
368
  try {
198
369
  const graph = await getGraphForDocument(document);
199
370
  return createDefinitionLocations(graph.symbolTable, document.uri, params.position, document.getText());
@@ -201,12 +372,8 @@ export const startLspServer = () => {
201
372
  catch {
202
373
  return [];
203
374
  }
204
- });
205
- connection.onReferences(async (params) => {
206
- const document = documents.get(params.textDocument.uri);
207
- if (!document) {
208
- return [];
209
- }
375
+ }));
376
+ connection.onReferences(async (params) => withDocument(documents, params.textDocument.uri, [], async (document) => {
210
377
  try {
211
378
  const graph = await getGraphForDocument(document);
212
379
  return createReferenceLocations(graph.symbolTable, document.uri, params.position, document.getText());
@@ -214,17 +381,19 @@ export const startLspServer = () => {
214
381
  catch {
215
382
  return [];
216
383
  }
217
- });
218
- connection.onCompletion(async (params) => {
219
- const document = documents.get(params.textDocument.uri);
220
- if (!document) {
221
- return [];
222
- }
384
+ }));
385
+ connection.onCompletion(async (params) => withDocument(documents, params.textDocument.uri, [], async (document) => {
223
386
  const parsed = await getParsedDocument(document);
224
387
  const linePrefix = document.getText({
225
388
  start: { line: params.position.line, character: 0 },
226
389
  end: params.position,
227
390
  });
391
+ // Check if we're in an ASN context — return ASN completions instead
392
+ if (asnIntel.available) {
393
+ const asnItems = createAsnCompletionItems(asnIntel, linePrefix);
394
+ if (asnItems.length > 0)
395
+ return asnItems;
396
+ }
228
397
  try {
229
398
  const graph = await getGraphForDocument(document);
230
399
  return createCompletionItemsFromParsed(parsed, {
@@ -235,7 +404,50 @@ export const startLspServer = () => {
235
404
  catch {
236
405
  return createCompletionItemsFromParsed(parsed, { linePrefix });
237
406
  }
238
- });
407
+ }));
408
+ connection.onDocumentFormatting(async (params) => withDocument(documents, params.textDocument.uri, [], async (document) => {
409
+ try {
410
+ const text = document.getText();
411
+ const result = await formatBirdConfig(text);
412
+ if (!result.changed) {
413
+ return [];
414
+ }
415
+ const lines = text.split("\n");
416
+ const lastLine = lines.length - 1;
417
+ const lastChar = lines[lastLine]?.length ?? 0;
418
+ return [
419
+ {
420
+ range: {
421
+ start: { line: 0, character: 0 },
422
+ end: { line: lastLine, character: lastChar },
423
+ },
424
+ newText: result.text,
425
+ },
426
+ ];
427
+ }
428
+ catch (error) {
429
+ connection.console.log(`[format] formatting failed: ${error instanceof Error ? error.message : String(error)}`);
430
+ return [];
431
+ }
432
+ }));
433
+ // Inlay Hints (ASN + function return type)
434
+ connection.languages.inlayHint.on(async (params) => withDocument(documents, params.textDocument.uri, [], async (document) => {
435
+ const text = document.getText();
436
+ const results = [];
437
+ // ASN inlay hints
438
+ if (asnIntel.available) {
439
+ results.push(...createAsnInlayHints(asnIntel, text, params.range));
440
+ }
441
+ // Function return type inlay hints
442
+ try {
443
+ const hints = await getTypeHintsForDocument(document);
444
+ results.push(...createTypeHintInlayHints(hints, params.range));
445
+ }
446
+ catch {
447
+ // Type hint inference is best-effort
448
+ }
449
+ return results;
450
+ }));
239
451
  connection.onShutdown(() => {
240
452
  hasShutdownBeenRequested = true;
241
453
  });
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-server.js","sourceRoot":"","sources":["../src/lsp-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lsp-server.js","sourceRoot":"","sources":["../src/lsp-server.ts"],"names":[],"mappings":"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"}