summaryrefslogtreecommitdiff
path: root/docs/lsp-evaluation.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/lsp-evaluation.md')
-rw-r--r--docs/lsp-evaluation.md36
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.