@birdcc/lsp 0.0.1-alpha.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.
- package/.oxfmtrc.json +16 -0
- package/LICENSE +674 -0
- package/README.md +343 -0
- package/dist/completion.d.ts +8 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +137 -0
- package/dist/completion.js.map +1 -0
- package/dist/definition.d.ts +5 -0
- package/dist/definition.d.ts.map +1 -0
- package/dist/definition.js +21 -0
- package/dist/definition.js.map +1 -0
- package/dist/diagnostic.d.ts +6 -0
- package/dist/diagnostic.d.ts.map +1 -0
- package/dist/diagnostic.js +38 -0
- package/dist/diagnostic.js.map +1 -0
- package/dist/document-symbol.d.ts +4 -0
- package/dist/document-symbol.d.ts.map +1 -0
- package/dist/document-symbol.js +20 -0
- package/dist/document-symbol.js.map +1 -0
- package/dist/hover-docs.d.ts +5 -0
- package/dist/hover-docs.d.ts.map +1 -0
- package/dist/hover-docs.js +141 -0
- package/dist/hover-docs.js.map +1 -0
- package/dist/hover-docs.yaml +600 -0
- package/dist/hover.d.ts +5 -0
- package/dist/hover.d.ts.map +1 -0
- package/dist/hover.js +81 -0
- package/dist/hover.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lsp-server.d.ts +3 -0
- package/dist/lsp-server.d.ts.map +1 -0
- package/dist/lsp-server.js +250 -0
- package/dist/lsp-server.js.map +1 -0
- package/dist/references.d.ts +5 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +48 -0
- package/dist/references.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -0
- package/dist/shared.d.ts +17 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +150 -0
- package/dist/shared.js.map +1 -0
- package/dist/symbol-utils.d.ts +17 -0
- package/dist/symbol-utils.d.ts.map +1 -0
- package/dist/symbol-utils.js +84 -0
- package/dist/symbol-utils.js.map +1 -0
- package/dist/validation.d.ts +21 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +47 -0
- package/dist/validation.js.map +1 -0
- package/package.json +45 -0
- package/scripts/copy-hover-yaml.mjs +14 -0
- package/src/completion.ts +223 -0
- package/src/definition.ts +50 -0
- package/src/diagnostic.ts +48 -0
- package/src/document-symbol.ts +27 -0
- package/src/hover-docs.ts +223 -0
- package/src/hover-docs.yaml +600 -0
- package/src/hover.ts +122 -0
- package/src/index.ts +8 -0
- package/src/lsp-server.ts +350 -0
- package/src/references.ts +107 -0
- package/src/server.ts +4 -0
- package/src/shared.ts +182 -0
- package/src/symbol-utils.ts +126 -0
- package/src/validation.ts +85 -0
- package/test/hover-docs.test.ts +18 -0
- package/test/lsp.test.ts +304 -0
- package/test/perf-baseline.test.ts +96 -0
- package/test/validation.test.ts +212 -0
- package/tsconfig.json +8 -0
package/README.md
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🕊 BIRD Config LSP (@birdcc/lsp)
|
|
4
|
+
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@birdcc/lsp) [](https://www.gnu.org/licenses/gpl-3.0) [](https://www.typescriptlang.org/) [](https://github.com/microsoft/vscode-languageserver-node)
|
|
8
|
+
|
|
9
|
+
> [Overview](#overview) · [Features](#features) · [Installation](#installation) · [Usage](#usage) · [Editor Integration](#editor-integration) · [API Reference](#api-reference) · [Architecture](#architecture)
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
**@birdcc/lsp** is the Language Server Protocol implementation for BIRD2 configuration files, delivering real-time diagnostics, intelligent code completion, hover tooltips, and more for editor integration.
|
|
14
|
+
|
|
15
|
+
| Package | Version | Description |
|
|
16
|
+
| ------- | ------- | ----------- |
|
|
17
|
+
| `@birdcc/lsp` | 0.1.0 | LSP server implementation with real-time diagnostics |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
### LSP Capabilities
|
|
24
|
+
|
|
25
|
+
- **Incremental Synchronization** — `TextDocumentSyncKind.Incremental` for efficient handling of large files
|
|
26
|
+
- **Real-time Diagnostics** — Automatic validation on document open and modification
|
|
27
|
+
- **Code Completion** — Auto-completion for keywords, symbols, and snippets
|
|
28
|
+
- **Hover Information** — Type information and documentation on hover
|
|
29
|
+
- **Go to Definition** — Navigate to symbol definitions
|
|
30
|
+
- **Find References** — Find all references to a symbol
|
|
31
|
+
- **Document Symbols** — Outline view for quick navigation
|
|
32
|
+
|
|
33
|
+
### Protocol Features
|
|
34
|
+
|
|
35
|
+
- **Standard LSP** — Full protocol support powered by `vscode-languageserver`
|
|
36
|
+
- **Diagnostic Push** — Server-initiated diagnostic updates
|
|
37
|
+
- **Workspace Folders** — Multi-root workspace support
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Using pnpm (recommended)
|
|
45
|
+
pnpm add @birdcc/lsp
|
|
46
|
+
|
|
47
|
+
# Using npm
|
|
48
|
+
npm install @birdcc/lsp
|
|
49
|
+
|
|
50
|
+
# Using yarn
|
|
51
|
+
yarn add @birdcc/lsp
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Usage
|
|
57
|
+
|
|
58
|
+
### Start LSP Server
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# stdio mode (for editor integration)
|
|
62
|
+
npx birdcc lsp --stdio
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Programmatic Usage
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { startLspServer, toLspDiagnostic } from "@birdcc/lsp";
|
|
69
|
+
import type { BirdDiagnostic } from "@birdcc/core";
|
|
70
|
+
|
|
71
|
+
// Start the LSP server
|
|
72
|
+
startLspServer();
|
|
73
|
+
|
|
74
|
+
// Convert internal diagnostic to LSP format
|
|
75
|
+
const lspDiagnostic = toLspDiagnostic(birdDiagnostic);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Editor Integration
|
|
81
|
+
|
|
82
|
+
### Visual Studio Code
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
// settings.json
|
|
86
|
+
{
|
|
87
|
+
"bird-lsp.enable": true,
|
|
88
|
+
"bird-lsp.path": "./node_modules/.bin/birdcc",
|
|
89
|
+
"bird-lsp.validateWithBird": true
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Neovim
|
|
94
|
+
|
|
95
|
+
```lua
|
|
96
|
+
-- init.lua with nvim-lspconfig
|
|
97
|
+
local lspconfig = require("lspconfig")
|
|
98
|
+
local configs = require("lspconfig.configs")
|
|
99
|
+
|
|
100
|
+
if not configs.birdcc then
|
|
101
|
+
configs.birdcc = {
|
|
102
|
+
default_config = {
|
|
103
|
+
cmd = { "npx", "birdcc", "lsp", "--stdio" },
|
|
104
|
+
filetypes = { "bird", "conf" },
|
|
105
|
+
root_dir = lspconfig.util.root_pattern(".git", "bird.conf"),
|
|
106
|
+
single_file_support = true,
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
lspconfig.birdcc.setup({})
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Helix
|
|
115
|
+
|
|
116
|
+
```toml
|
|
117
|
+
# ~/.config/helix/languages.toml
|
|
118
|
+
[[language]]
|
|
119
|
+
name = "bird"
|
|
120
|
+
file-types = ["conf"]
|
|
121
|
+
roots = [".git", "bird.conf"]
|
|
122
|
+
language-servers = ["birdcc"]
|
|
123
|
+
|
|
124
|
+
[language-server.birdcc]
|
|
125
|
+
command = "npx"
|
|
126
|
+
args = ["birdcc", "lsp", "--stdio"]
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## API Reference
|
|
132
|
+
|
|
133
|
+
### Exports
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import {
|
|
137
|
+
startLspServer,
|
|
138
|
+
toLspDiagnostic,
|
|
139
|
+
createConnection,
|
|
140
|
+
} from "@birdcc/lsp";
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### `startLspServer(): void`
|
|
144
|
+
|
|
145
|
+
Start the LSP server with stdio transport.
|
|
146
|
+
|
|
147
|
+
### `toLspDiagnostic(diagnostic: BirdDiagnostic): Diagnostic`
|
|
148
|
+
|
|
149
|
+
Convert a BIRD diagnostic to LSP Diagnostic format.
|
|
150
|
+
|
|
151
|
+
### Types
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
interface LspOptions {
|
|
155
|
+
connection?: Connection;
|
|
156
|
+
documents?: TextDocuments<TextDocument>;
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Architecture
|
|
163
|
+
|
|
164
|
+
### System Overview
|
|
165
|
+
|
|
166
|
+
```mermaid
|
|
167
|
+
flowchart TB
|
|
168
|
+
subgraph "Editor Layer"
|
|
169
|
+
E1[VS Code]
|
|
170
|
+
E2[Neovim]
|
|
171
|
+
E3[Vim]
|
|
172
|
+
E4[Helix]
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
subgraph "LSP Protocol"
|
|
176
|
+
LSP[LSP Protocol<br/>JSON-RPC]
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
subgraph "LSP Server"
|
|
180
|
+
S[@birdcc/lsp<br/>LSP Server]
|
|
181
|
+
SYNC[Document Sync<br/>Incremental]
|
|
182
|
+
DIAG[Diagnostics Handler]
|
|
183
|
+
COMP[Completion Provider]
|
|
184
|
+
HOVER[Hover Provider]
|
|
185
|
+
DEF[Definition Provider]
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
subgraph "Service Layer"
|
|
189
|
+
LINTER[@birdcc/linter<br/>32+ Rules]
|
|
190
|
+
FORMATTER[@birdcc/formatter<br/>dprint/builtin]
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
subgraph "Core Layer"
|
|
194
|
+
CORE[@birdcc/core<br/>Symbol Table]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
subgraph "Parser Layer"
|
|
198
|
+
PARSER[@birdcc/parser<br/>Tree-sitter]
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
E1 --> LSP
|
|
202
|
+
E2 --> LSP
|
|
203
|
+
E3 --> LSP
|
|
204
|
+
E4 --> LSP
|
|
205
|
+
LSP --> S
|
|
206
|
+
S --> SYNC
|
|
207
|
+
S --> DIAG
|
|
208
|
+
S --> COMP
|
|
209
|
+
S --> HOVER
|
|
210
|
+
S --> DEF
|
|
211
|
+
DIAG --> LINTER
|
|
212
|
+
COMP --> CORE
|
|
213
|
+
HOVER --> CORE
|
|
214
|
+
DEF --> CORE
|
|
215
|
+
LINTER --> CORE
|
|
216
|
+
FORMATTER --> PARSER
|
|
217
|
+
CORE --> PARSER
|
|
218
|
+
|
|
219
|
+
style S fill:#e3f2fd
|
|
220
|
+
style LSP fill:#f3e5f5
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Request Handling Flow
|
|
224
|
+
|
|
225
|
+
```mermaid
|
|
226
|
+
sequenceDiagram
|
|
227
|
+
participant Editor as Editor
|
|
228
|
+
participant LSP as LSP Connection
|
|
229
|
+
participant Server as @birdcc/lsp
|
|
230
|
+
participant Services as Services
|
|
231
|
+
participant Core as @birdcc/core
|
|
232
|
+
|
|
233
|
+
Editor->>LSP: Initialize Request
|
|
234
|
+
LSP->>Server: onInitialize()
|
|
235
|
+
Server-->>LSP: ServerCapabilities
|
|
236
|
+
LSP-->>Editor: Initialize Result
|
|
237
|
+
|
|
238
|
+
Editor->>LSP: textDocument/didOpen
|
|
239
|
+
LSP->>Server: onDidOpen()
|
|
240
|
+
Server->>Services: validate(document)
|
|
241
|
+
Services->>Core: buildCoreSnapshot()
|
|
242
|
+
Core-->>Services: snapshot
|
|
243
|
+
Services-->>Server: diagnostics
|
|
244
|
+
Server->>LSP: publishDiagnostics
|
|
245
|
+
LSP->>Editor: Diagnostics
|
|
246
|
+
|
|
247
|
+
Editor->>LSP: textDocument/completion
|
|
248
|
+
LSP->>Server: onCompletion()
|
|
249
|
+
Server->>Core: getSymbols()
|
|
250
|
+
Core-->>Server: symbols[]
|
|
251
|
+
Server-->>LSP: CompletionItem[]
|
|
252
|
+
LSP-->>Editor: Completions
|
|
253
|
+
|
|
254
|
+
Editor->>LSP: textDocument/hover
|
|
255
|
+
LSP->>Server: onHover()
|
|
256
|
+
Server->>Core: resolveSymbol()
|
|
257
|
+
Core-->>Server: symbol info
|
|
258
|
+
Server-->>LSP: Hover
|
|
259
|
+
LSP-->>Editor: Tooltip
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Document Synchronization
|
|
263
|
+
|
|
264
|
+
```mermaid
|
|
265
|
+
flowchart LR
|
|
266
|
+
subgraph "Editor"
|
|
267
|
+
E[Document Changes]
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
subgraph "LSP Server"
|
|
271
|
+
S[Text Documents Manager]
|
|
272
|
+
AST[AST Cache]
|
|
273
|
+
SYM[Symbol Cache]
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
subgraph "Validation"
|
|
277
|
+
V[Validator]
|
|
278
|
+
D[Diagnostics Engine]
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
E -->|didChange| S
|
|
282
|
+
E -->|didOpen| S
|
|
283
|
+
E -->|didClose| S
|
|
284
|
+
S -->|parse| AST
|
|
285
|
+
AST -->|analyze| SYM
|
|
286
|
+
SYM -->|validate| V
|
|
287
|
+
V -->|report| D
|
|
288
|
+
D -->|publish| E
|
|
289
|
+
|
|
290
|
+
style S fill:#e3f2fd
|
|
291
|
+
style AST fill:#e8f5e9
|
|
292
|
+
style SYM fill:#fff3e0
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Server Capabilities
|
|
296
|
+
|
|
297
|
+
| Capability | Status |
|
|
298
|
+
| ---------- | ------ |
|
|
299
|
+
| `textDocumentSync` | Incremental |
|
|
300
|
+
| `documentSymbolProvider` | ✅ |
|
|
301
|
+
| `hoverProvider` | ✅ |
|
|
302
|
+
| `definitionProvider` | ✅ |
|
|
303
|
+
| `referencesProvider` | ✅ |
|
|
304
|
+
| `completionProvider` | ✅ |
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Related Packages
|
|
309
|
+
|
|
310
|
+
| Package | Description |
|
|
311
|
+
| ------- | ----------- |
|
|
312
|
+
| [@birdcc/parser](../parser/) | Tree-sitter grammar and parser |
|
|
313
|
+
| [@birdcc/core](../core/) | Semantic analysis engine |
|
|
314
|
+
| [@birdcc/linter](../linter/) | 32+ lint rules |
|
|
315
|
+
| [@birdcc/formatter](../formatter/) | Code formatting engine |
|
|
316
|
+
| [@birdcc/cli](../cli/) | Command-line interface |
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
### 📖 Documentation
|
|
321
|
+
|
|
322
|
+
- [BIRD Official Documentation](https://bird.network.cz/)
|
|
323
|
+
- [BIRD2 User Manual](https://bird.network.cz/doc/bird.html)
|
|
324
|
+
- [LSP Specification](https://microsoft.github.io/language-server-protocol/)
|
|
325
|
+
- [GitHub Project](https://github.com/bird-chinese-community/BIRD-LSP)
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 📝 License
|
|
330
|
+
|
|
331
|
+
This project is licensed under the [GPL-3.0 License](https://github.com/bird-chinese-community/BIRD-LSP/blob/main/LICENSE).
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
<p align="center">
|
|
336
|
+
<sub>Built with ❤️ by the BIRD Chinese Community (BIRDCC)</sub>
|
|
337
|
+
</p>
|
|
338
|
+
|
|
339
|
+
<p align="center">
|
|
340
|
+
<a href="https://github.com/bird-chinese-community/BIRD-LSP">🕊 GitHub</a> ·
|
|
341
|
+
<a href="https://marketplace.visualstudio.com/items?itemName=birdcc.bird2-lsp">🛒 Marketplace</a> ·
|
|
342
|
+
<a href="https://github.com/bird-chinese-community/BIRD-LSP/issues">🐛 Report Issues</a>
|
|
343
|
+
</p>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CompletionItem } from "vscode-languageserver/node.js";
|
|
2
|
+
import type { ParsedBirdDocument } from "@birdcc/parser";
|
|
3
|
+
export interface CompletionContextOptions {
|
|
4
|
+
linePrefix?: string;
|
|
5
|
+
additionalDeclarations?: ParsedBirdDocument["program"]["declarations"];
|
|
6
|
+
}
|
|
7
|
+
export declare const createCompletionItemsFromParsed: (parsed: ParsedBirdDocument, options?: CompletionContextOptions) => CompletionItem[];
|
|
8
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAuDzD,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC;CACxE;AAmID,eAAO,MAAM,+BAA+B,GAC1C,QAAQ,kBAAkB,EAC1B,UAAS,wBAA6B,KACrC,cAAc,EAyBhB,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { CompletionItemKind, InsertTextFormat, } from "vscode-languageserver/node.js";
|
|
2
|
+
import { declarationMetadata, KEYWORD_DOCS } from "./shared.js";
|
|
3
|
+
const COMPLETION_KEYWORDS = [
|
|
4
|
+
"protocol",
|
|
5
|
+
"template",
|
|
6
|
+
"filter",
|
|
7
|
+
"function",
|
|
8
|
+
"define",
|
|
9
|
+
"include",
|
|
10
|
+
"import",
|
|
11
|
+
"export",
|
|
12
|
+
"neighbor",
|
|
13
|
+
"local as",
|
|
14
|
+
"router id",
|
|
15
|
+
"table",
|
|
16
|
+
"ipv4",
|
|
17
|
+
"ipv6",
|
|
18
|
+
];
|
|
19
|
+
const COMPLETION_SNIPPETS = [
|
|
20
|
+
{
|
|
21
|
+
label: 'include "..."',
|
|
22
|
+
detail: "BIRD snippet",
|
|
23
|
+
documentation: "Insert include statement.",
|
|
24
|
+
insertText: 'include "${1:path/to/file.conf}";',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
label: "define NAME = value;",
|
|
28
|
+
detail: "BIRD snippet",
|
|
29
|
+
documentation: "Insert define statement.",
|
|
30
|
+
insertText: "define ${1:NAME} = ${2:value};",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: "router id 1.1.1.1;",
|
|
34
|
+
detail: "BIRD snippet",
|
|
35
|
+
documentation: "Insert router id statement.",
|
|
36
|
+
insertText: "router id ${1:1.1.1.1};",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
label: "protocol bgp ...",
|
|
40
|
+
detail: "BIRD snippet",
|
|
41
|
+
documentation: "Insert minimal BGP protocol block.",
|
|
42
|
+
insertText: "protocol bgp ${1:name} {\n neighbor ${2:192.0.2.1} as ${3:65001};\n local as ${4:65000};\n}",
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
const isFromTemplateContext = (linePrefix) => /\bfrom\s+[A-Za-z_][A-Za-z0-9_]*$/i.test(linePrefix) ||
|
|
46
|
+
/\bfrom\s*$/i.test(linePrefix);
|
|
47
|
+
const isIncludePathContext = (linePrefix) => /\binclude\s+["'][^"']*$/i.test(linePrefix);
|
|
48
|
+
const isFilterContext = (linePrefix) => /\b(?:import|export)\s+filter\s+[A-Za-z_][A-Za-z0-9_]*$/i.test(linePrefix) ||
|
|
49
|
+
/\b(?:import|export)\s+filter\s*$/i.test(linePrefix);
|
|
50
|
+
const isTableContext = (linePrefix) => /\btable\s+[A-Za-z_][A-Za-z0-9_]*$/i.test(linePrefix) ||
|
|
51
|
+
/\btable\s*$/i.test(linePrefix);
|
|
52
|
+
const allDeclarations = (parsed, options) => {
|
|
53
|
+
const additional = options.additionalDeclarations ?? [];
|
|
54
|
+
if (additional.length === 0) {
|
|
55
|
+
return parsed.program.declarations;
|
|
56
|
+
}
|
|
57
|
+
return [...parsed.program.declarations, ...additional];
|
|
58
|
+
};
|
|
59
|
+
const keywordCompletionItems = () => COMPLETION_KEYWORDS.map((keyword) => ({
|
|
60
|
+
label: keyword,
|
|
61
|
+
kind: CompletionItemKind.Keyword,
|
|
62
|
+
detail: "BIRD keyword",
|
|
63
|
+
documentation: KEYWORD_DOCS[keyword] ?? "",
|
|
64
|
+
}));
|
|
65
|
+
const snippetCompletionItems = () => COMPLETION_SNIPPETS.map((snippet) => ({
|
|
66
|
+
label: snippet.label,
|
|
67
|
+
kind: CompletionItemKind.Snippet,
|
|
68
|
+
detail: snippet.detail,
|
|
69
|
+
documentation: snippet.documentation,
|
|
70
|
+
insertText: snippet.insertText,
|
|
71
|
+
insertTextFormat: InsertTextFormat.Snippet,
|
|
72
|
+
}));
|
|
73
|
+
const includePathCompletionItems = (declarations, options) => {
|
|
74
|
+
const paths = new Set();
|
|
75
|
+
for (const declaration of declarations) {
|
|
76
|
+
if (declaration.kind !== "include") {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (declaration.path.length > 0) {
|
|
80
|
+
paths.add(declaration.path);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return Array.from(paths).map((path) => ({
|
|
84
|
+
label: path,
|
|
85
|
+
kind: CompletionItemKind.File,
|
|
86
|
+
detail: "include path",
|
|
87
|
+
insertText: options.quoteWrapped ? path : `"${path}"`,
|
|
88
|
+
}));
|
|
89
|
+
};
|
|
90
|
+
const collectDeclarationCompletionItems = (declarations, predicate) => {
|
|
91
|
+
const items = [];
|
|
92
|
+
const seen = new Set();
|
|
93
|
+
for (const declaration of declarations) {
|
|
94
|
+
if (!predicate(declaration)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const metadata = declarationMetadata(declaration);
|
|
98
|
+
if (!metadata?.completionLabel || seen.has(metadata.completionLabel)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
seen.add(metadata.completionLabel);
|
|
102
|
+
items.push({
|
|
103
|
+
label: metadata.completionLabel,
|
|
104
|
+
kind: metadata.completionKind ?? CompletionItemKind.Reference,
|
|
105
|
+
detail: metadata.completionDetail ?? metadata.detail,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return items;
|
|
109
|
+
};
|
|
110
|
+
const templateCompletionItems = (declarations) => collectDeclarationCompletionItems(declarations, (declaration) => declaration.kind === "template");
|
|
111
|
+
const filterCompletionItems = (declarations) => collectDeclarationCompletionItems(declarations, (declaration) => declaration.kind === "filter");
|
|
112
|
+
const tableCompletionItems = (declarations) => collectDeclarationCompletionItems(declarations, (declaration) => declaration.kind === "table");
|
|
113
|
+
const declarationCompletionItems = (declarations) => {
|
|
114
|
+
return collectDeclarationCompletionItems(declarations, () => true);
|
|
115
|
+
};
|
|
116
|
+
export const createCompletionItemsFromParsed = (parsed, options = {}) => {
|
|
117
|
+
const linePrefix = options.linePrefix ?? "";
|
|
118
|
+
const declarations = allDeclarations(parsed, options);
|
|
119
|
+
if (isIncludePathContext(linePrefix)) {
|
|
120
|
+
return includePathCompletionItems(declarations, { quoteWrapped: true });
|
|
121
|
+
}
|
|
122
|
+
if (isFromTemplateContext(linePrefix)) {
|
|
123
|
+
return templateCompletionItems(declarations);
|
|
124
|
+
}
|
|
125
|
+
if (isFilterContext(linePrefix)) {
|
|
126
|
+
return filterCompletionItems(declarations);
|
|
127
|
+
}
|
|
128
|
+
if (isTableContext(linePrefix)) {
|
|
129
|
+
return tableCompletionItems(declarations);
|
|
130
|
+
}
|
|
131
|
+
return [
|
|
132
|
+
...keywordCompletionItems(),
|
|
133
|
+
...snippetCompletionItems(),
|
|
134
|
+
...declarationCompletionItems(declarations),
|
|
135
|
+
];
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SymbolTable } from "@birdcc/core";
|
|
2
|
+
import type { Location, Position } from "vscode-languageserver/node.js";
|
|
3
|
+
/** Resolves symbol definition locations from a merged cross-file symbol table. */
|
|
4
|
+
export declare const createDefinitionLocations: (symbolTable: SymbolTable, uri: string, position: Position, sourceText: string) => Location[];
|
|
5
|
+
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AASxE,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,GACpC,aAAa,WAAW,EACxB,KAAK,MAAM,EACX,UAAU,QAAQ,EAClB,YAAY,MAAM,KACjB,QAAQ,EAiCV,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { containsPosition, createSymbolLookupIndex, dedupeLocations, extractWordAtPosition, toLocation, } from "./symbol-utils.js";
|
|
2
|
+
/** Resolves symbol definition locations from a merged cross-file symbol table. */
|
|
3
|
+
export const createDefinitionLocations = (symbolTable, uri, position, sourceText) => {
|
|
4
|
+
const index = createSymbolLookupIndex(symbolTable.definitions, symbolTable.references);
|
|
5
|
+
const reference = symbolTable.references.find((item) => item.uri === uri && containsPosition(item, position));
|
|
6
|
+
if (reference) {
|
|
7
|
+
return dedupeLocations((index.definitionsByName.get(reference.name.toLowerCase()) ?? [])
|
|
8
|
+
.filter((definition) => definition.kind === reference.kind)
|
|
9
|
+
.map(toLocation));
|
|
10
|
+
}
|
|
11
|
+
const definition = symbolTable.definitions.find((item) => item.uri === uri && containsPosition(item, position));
|
|
12
|
+
if (definition) {
|
|
13
|
+
return [toLocation(definition)];
|
|
14
|
+
}
|
|
15
|
+
const name = extractWordAtPosition(sourceText, position);
|
|
16
|
+
if (!name) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
return dedupeLocations((index.definitionsByName.get(name.toLowerCase()) ?? []).map(toLocation));
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,kFAAkF;AAClF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,WAAwB,EACxB,GAAW,EACX,QAAkB,EAClB,UAAkB,EACN,EAAE;IACd,MAAM,KAAK,GAAG,uBAAuB,CACnC,WAAW,CAAC,WAAW,EACvB,WAAW,CAAC,UAAU,CACvB,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAC3C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAC/D,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,eAAe,CACpB,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;aAC9D,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;aAC1D,GAAG,CAAC,UAAU,CAAC,CACnB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAC7C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAC/D,CAAC;IACF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,eAAe,CACpB,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CACxE,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Diagnostic } from "vscode-languageserver/node.js";
|
|
2
|
+
import type { BirdDiagnostic } from "@birdcc/core";
|
|
3
|
+
/** Maps Bird diagnostic schema into LSP Diagnostic schema. */
|
|
4
|
+
export declare const toLspDiagnostic: (diagnostic: BirdDiagnostic) => Diagnostic;
|
|
5
|
+
export declare const toInternalErrorDiagnostic: (error: unknown) => Diagnostic;
|
|
6
|
+
//# sourceMappingURL=diagnostic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../src/diagnostic.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgBnD,8DAA8D;AAC9D,eAAO,MAAM,eAAe,GAAI,YAAY,cAAc,KAAG,UAe3D,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,OAAO,KAAG,UASzD,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { DiagnosticSeverity, } from "vscode-languageserver/node.js";
|
|
2
|
+
const toLspSeverity = (severity) => {
|
|
3
|
+
if (severity === "error") {
|
|
4
|
+
return DiagnosticSeverity.Error;
|
|
5
|
+
}
|
|
6
|
+
if (severity === "warning") {
|
|
7
|
+
return DiagnosticSeverity.Warning;
|
|
8
|
+
}
|
|
9
|
+
return DiagnosticSeverity.Information;
|
|
10
|
+
};
|
|
11
|
+
/** Maps Bird diagnostic schema into LSP Diagnostic schema. */
|
|
12
|
+
export const toLspDiagnostic = (diagnostic) => ({
|
|
13
|
+
code: diagnostic.code,
|
|
14
|
+
message: diagnostic.message,
|
|
15
|
+
severity: toLspSeverity(diagnostic.severity),
|
|
16
|
+
source: diagnostic.source,
|
|
17
|
+
range: {
|
|
18
|
+
start: {
|
|
19
|
+
line: Math.max(diagnostic.range.line - 1, 0),
|
|
20
|
+
character: Math.max(diagnostic.range.column - 1, 0),
|
|
21
|
+
},
|
|
22
|
+
end: {
|
|
23
|
+
line: Math.max(diagnostic.range.endLine - 1, 0),
|
|
24
|
+
character: Math.max(diagnostic.range.endColumn - 1, 0),
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
export const toInternalErrorDiagnostic = (error) => ({
|
|
29
|
+
code: "lsp/internal-error",
|
|
30
|
+
message: error instanceof Error ? error.message : String(error),
|
|
31
|
+
severity: DiagnosticSeverity.Error,
|
|
32
|
+
source: "lsp",
|
|
33
|
+
range: {
|
|
34
|
+
start: { line: 0, character: 0 },
|
|
35
|
+
end: { line: 0, character: 1 },
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=diagnostic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../src/diagnostic.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AAGvC,MAAM,aAAa,GAAG,CACpB,QAAoC,EAChB,EAAE;IACtB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,kBAAkB,CAAC,KAAK,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,kBAAkB,CAAC,OAAO,CAAC;IACpC,CAAC;IAED,OAAO,kBAAkB,CAAC,WAAW,CAAC;AACxC,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAA0B,EAAc,EAAE,CAAC,CAAC;IAC1E,IAAI,EAAE,UAAU,CAAC,IAAI;IACrB,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC5C,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,KAAK,EAAE;QACL,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;SACpD;QACD,GAAG,EAAE;YACH,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/C,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;SACvD;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAc,EAAc,EAAE,CAAC,CAAC;IACxE,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAC/D,QAAQ,EAAE,kBAAkB,CAAC,KAAK;IAClC,MAAM,EAAE,KAAK;IACb,KAAK,EAAE;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;QAChC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;KAC/B;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DocumentSymbol } from "vscode-languageserver/node.js";
|
|
2
|
+
import type { ParsedBirdDocument } from "@birdcc/parser";
|
|
3
|
+
export declare const createDocumentSymbolsFromParsed: (parsed: ParsedBirdDocument) => DocumentSymbol[];
|
|
4
|
+
//# sourceMappingURL=document-symbol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-symbol.d.ts","sourceRoot":"","sources":["../src/document-symbol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,eAAO,MAAM,+BAA+B,GAC1C,QAAQ,kBAAkB,KACzB,cAAc,EAoBhB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { declarationMetadata, toLspRange } from "./shared.js";
|
|
2
|
+
export const createDocumentSymbolsFromParsed = (parsed) => {
|
|
3
|
+
const symbols = [];
|
|
4
|
+
for (const declaration of parsed.program.declarations) {
|
|
5
|
+
const metadata = declarationMetadata(declaration);
|
|
6
|
+
if (!metadata) {
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
symbols.push({
|
|
10
|
+
name: metadata.symbolName,
|
|
11
|
+
detail: metadata.detail,
|
|
12
|
+
kind: metadata.symbolKind,
|
|
13
|
+
range: toLspRange(declaration),
|
|
14
|
+
selectionRange: toLspRange(metadata.selectionRange),
|
|
15
|
+
children: [],
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return symbols;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=document-symbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-symbol.js","sourceRoot":"","sources":["../src/document-symbol.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,MAA0B,EACR,EAAE;IACpB,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,QAAQ,CAAC,UAAU;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,IAAI,EAAE,QAAQ,CAAC,UAAU;YACzB,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC;YAC9B,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;YACnD,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type HoverDocDiffType = "same" | "added" | "modified" | "removed";
|
|
2
|
+
export type HoverDocVersionTag = "v2+" | "v3+" | "v2" | "v2-v3";
|
|
3
|
+
export declare const HOVER_KEYWORD_DOCS: Record<string, string>;
|
|
4
|
+
export declare const HOVER_KEYWORDS: readonly string[];
|
|
5
|
+
//# sourceMappingURL=hover-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover-docs.d.ts","sourceRoot":"","sources":["../src/hover-docs.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AACzE,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;AAiNhE,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAErD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAE3C,CAAC"}
|