diff options
Diffstat (limited to 'docs/lsp-evaluation.md')
| -rw-r--r-- | docs/lsp-evaluation.md | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/docs/lsp-evaluation.md b/docs/lsp-evaluation.md index d9fcd243..ab502422 100644 --- a/docs/lsp-evaluation.md +++ b/docs/lsp-evaluation.md @@ -1,19 +1,22 @@ # Three language backends, measured -Same core, same seam (`src/lsp/lsp.zig`), same 17-probe harness (`zig build lspbench`) -over the same corpus. Three jj workspaces, three independent implementations, -one function each. C landed; see **Decision** below. +Same core, same seam (`src/lsp/lsp.zig`), same harness (`zig build lspbench`) +over the same corpus — 17 probes at the time, 22 today. Three jj workspaces, +three independent implementations, one function each. C landed; see +**Decision** below. > **This is a dated report, not a description of the tree.** Every MEASUREMENT > below is the one taken at decision time and is deliberately left alone, > because renumbering a comparison nobody can re-run turns a record into a -> guess. What has moved since: `lspbench` now has **22** probes rather than 17 -> (the dot-completion work added five), `src/lsp/lsp_zls.zig` has grown from 540 -> lines to about 1,400, `test/snapshots/` holds 87 scripts rather than 56, and -> the differential suites are `hxdiff` 481 / `hxparity` 561. The one number -> that IS kept current is the grammar count in the Recommendation, because that -> is an argument about today rather than a measurement of then. For what the -> harness does TODAY, read `docs/lsp.md`. +> guess. What has moved since, re-checked 2026-08-26: `lspbench` now has **22** +> probes rather than 17 (the dot-completion work added five), +> `src/lsp/lsp_zls.zig` has grown from 540 lines to **1 432**, +> `test/snapshots/` holds **95** scripts rather than 56 (`.snap` + `.golden` +> pairs), and the differential suites are `hxdiff` **481** (`cases.jsonl`) and +> `hxparity` **561** (`cases.jsonl` + the 80 editing extras in +> `parity.jsonl`). The one number that IS kept current is the grammar count in +> the Recommendation, because that is an argument about today rather than a +> measurement of then. For what the harness does TODAY, read `docs/lsp.md`. | | **A · stdlib** | **B · client** | **C · in-process** | |---|---|---|---| @@ -98,7 +101,12 @@ real binary through the helix keymap, and pass `hxdiff` (360) and `hxparity` **C landed.** It is what `src/lsp/lsp_zls.zig` is, and ZLS is now a fetched dependency (`build.zig.zon`, pinned to commit `3e0d0820` on the 0.16.x branch) so it sits in `zig-pkg/` like everything else and the build is reproducible -from the .zon alone — no path dependency on a local checkout. +from the .zon alone — no path dependency on a local checkout. The same commit +is spelled a second time in `build.zig` as `const zls_version = +"0.16.1-dev+3e0d0820"`, for ZLS's own `-Dversion-string`; the semver half +exists nowhere in the manifest, so the duplication cannot be removed, but a +`comptime` block beside the constant `@compileError`s unless the two name the +same commit. See "Which ZLS, and which stdlib" in `docs/lsp.md`. A and B were not deleted, only un-worktree'd. They remain whole commits: @@ -118,7 +126,11 @@ second process, and its weakest number is a cache that does not exist rather than a limit that cannot be lifted. The one thing that should override that: **pardes ships tree-sitter grammars for -28 languages.** C is Zig-only forever; B is the only implementation that will +28 languages** — `src/grammar_manifest.zig`'s `all` has 29 entries, but +`markdown_inline` carries `.exts = &.{}` on purpose: no filename ever selects +it, and the block grammar re-enters it by name for its `inline` nodes. So 29 +grammars, 28 buffers a language server could ever be asked about. C is +Zig-only forever; B is the only implementation that will ever answer `gd` in a Rust or Go buffer. If language intelligence is meant to follow the syntax highlighting, B is the strategic choice and its 721 lines are the cheapest multi-language client anyone will write. |
