fix(lsp): answer while stdin is open and decode \uXXXX in JSON - #295
the-homeless-god merged 2 commits into
Conversation
`flang lsp` and `--mcp-mode` read stdin with fread(chunk, 1, 8192, stdin), which returns only after 8192 bytes or end of input. An editor never closes the server's stdin, so the reply to `initialize` (334 bytes) never left: 0 bytes while the input is open, 334 after it closes. Read with read(2), which returns what has arrived (repl_read_some). run_text rejected any JSON string with \uXXXX, so the server dropped such a message with "unparsed JSON" on stderr. Decode \uXXXX and surrogate pairs to UTF-8; a lone half of a pair is still rejected. The printed copy in bootstrap/ comes in the next commit, from a reprint (scripts/bootstrap-reprint.sh), not by hand. scripts/editors/lsp-check.fscript now gates on the binary answering while stdin is open (the Node server it gated on is gone, so the gate passed vacuously) and runs Neovim on bootstrap/flang with g:flang_dvoichnyy_lsp = 1. Its expected definition line was 6; the declaration in probe-transition.flang is on line 3. The check never reached that step before, because Neovim found no server. The binary stays opt-in in autoload/flang.vim: released binaries up to 0.7.24 still hang. README and the autoload comment say so. docs/tree-inventory.md: five line counts remeasured. scripts/ledgers/proved-share-ledger.txt: lsp-check.fscript remeasured with --proof (21 written: 17 proved, 4 declared; the old line said 23/23 for a file whose md5 had already changed). Refs digitable-lol#294
53e4047 to
23e3264
Compare
The seed is printed from 23e3264 by the GPU-cache build on the reprint script (code 0, 3205 s). Of the seven files only bootstrap/flang_repl.c changed, which is the file the fix touches; the other six are byte for byte as before. The printed seed was built and asked before it went into bootstrap/, and scripts/seed-fingerprint names commit 23e3264. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LuK84yUqX31p5tyBKcaTJ
|
Обе находки проверил своими прогонами на нынешнем 1. Сервер молчит, пока ввод открыт — воспроизводится. Первый мой заход был Это и значит, что 2. То есть строка с 3. Третья находка — самая ценная, и она про проверку, а не про код. Что нужно поправить, прежде чем это уедет в ствол
Содержимое беру, спасибо — находка про молчащий сервер дороже всего, что я |
Исправляет #294.
Что дерево теперь делает, чего не делало
flang lspи--mcp-modeотвечают, пока стандартный ввод открыт. Ввод читалсяfread(chunk, 1, 8192, stdin)— это ждёт полный кусок или конец ввода, а редактор ввод не закрывает. Теперьrepl_read_some:read(STDIN_FILENO, …)с повтором наEINTR, возвращает то, что уже пришло. Оба места чтения (lsp_read_frameи строки--mcp-mode).\uXXXXразбираются (run_text):\uXXXXи суррогатные пары — в UTF-8; одинокая половина пары по-прежнему отказ. Прежде сообщение с таким экранированием сервер выбрасывал («неразобранный JSON»).flang/src/emit/c/flang_repl.cи та же в печатной копииbootstrap/flang_repl.c(печатная = шапка из 9 строк + исходник; сверено до и после).Проверка сервера в редакторе
scripts/editors/lsp-check.fscriptнаmainкрасна при любом двоичном: «диагностика до редактора не доехала». Первый шаг пропускал по серверу на Node, а Node снят — ворота проходили вхолостую, и Neovim безg:flang_dvoichnyy_lspсервера не находил. Теперь:FLANG_LSP_NE_POTOK— «двоичный flang lsp не отвечает при открытом вводе»); функция «Node отвечает на лету» убрана;g:flang_dvoichnyy_lsp = 1иbootstrap/первым вPATH— проверяется двоичный этого дерева;probe-transition.flangстоит на строке 3 — до этого шага проверка прежде не доходила.Утверждений в файле 21 (было 23: ушли два у убранной функции): доказано 17, объявлено 4 — те же четыре, что и прежде.
scripts/ledgers/proved-share-ledger.txt— строка перемерена--proof(старая говорила 23/23 при уже разошедшемся md5).Что не меняется
Двоичный сервер в
docs/editors/vim/autoload/flang.vimостаётся по явной просьбе: у людей стоят выпуски по 0.7.24 включительно, и они молчат. Поднять его наверх — решение для выпуска с исправлением; README и комментарий вautoload/flang.vimтеперь говорят ровно это.docs/tree-inventory.md— пять чисел строк перемерены (C, Vimscript,bootstrap/**, рантаймыflang/src/emit/**,docs/editors/vim/**).Что прогнано
Linux x86-64, gcc 13, Neovim 0.12.4.
bootstrap/flangсобранmake -C bootstrapиз того же C (flang_repl.c, остальной C наmainсv0.7.24не менялся).initialize, ввод открыт 3 сv0.7.24: 0 байт при открытом вводе, 334 после закрытия; ветка: 334 и 334а,😀в строке JSONv0.7.24: «неразобранный JSON»; ветка: ответinitialize\ud83dflang io scripts/editors/lsp-check.fscript --trustFLANG_TYPEдоехала до буфера; переход на строку 3; наведение с подписьюbootstrap/flangотv0.7.24(правка снята)flang check scripts/editors/lsp-check.fscript.githooks/commit-msg.fscript,origin/main..HEADcommit messages checked: 1.githooks/pre-push.fscriptproved-share-vs-treeпокраснела на строке описи и после её перемера отдельно — код 0;lint-growthбезorigin/devкрасна, с подтянутойorigin/dev— код 0 («no line crossed the limits»)prose-numbers-guard,inventory:checkЧто не прогнано
lsp-checkчестно ПРОПУЩЕНА:FLANG_VIM_LSPне задан;--mcp-modeживым клиентом MCP — та же функция чтения, но отдельно не гонял;