Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 94 additions & 11 deletions bootstrap/flang_repl.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 17 additions & 12 deletions docs/editors/vim/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,22 +68,27 @@ JavaScript (`fe8e8a37`), обёртка на Node — вместе с npm 6 се

### Почему двоичного `flang lsp` в этом списке нет

У двоичного `flang` (Homebrew, asdf) подкоманда `lsp` есть, и на закрытом вводе
она отвечает правильно. **Редактору она не годится: пока стандартный ввод
открыт, сервер не присылает ни одного байта.** Померено `checks/stream.sh`:
У двоичного `flang` (Homebrew, asdf) подкоманда `lsp` есть. **Выпуски по 0.7.24
включительно редактору не годятся: пока стандартный ввод открыт, сервер не
присылает ни одного байта** — ввод читался кусками по 8192 байта, и чтение
ждало либо полный кусок, либо конец ввода. Померено `checks/stream.sh`:

```
двоичный flang lsp: при открытом вводе 0 байт, после закрытия 334 байт
flang-lsp на Node: при открытом вводе 334 байт, после закрытия 334 байт
двоичный flang lsp 0.7.24: при открытом вводе 0 байт, после закрытия 334 байт
двоичный flang lsp из дерева: при открытом вводе 334 байт, после закрытия 334 байт
```

Редактор ввод не закрывает никогда, поэтому двоичный сервер выглядел бы просто
висящим. Взять его всё равно можно — `let g:flang_dvoichnyy_lsp = 1`, — но по
умолчанию он не берётся: молчащий сервер неотличим от сломанного.

Когда двоичный научится отвечать на лету, `scripts/editors/lsp-check.fscript` скажет
об этом строкой, и порядок поиска можно будет переставить. Тогда Node для
редактора станет не нужен вовсе.
Ввод теперь читается тем, что уже пришло (`repl_read_some` в
`flang/src/emit/c/flang_repl.c`), и строки JSON с `\uXXXX` разбираются — прежде
такое сообщение сервер выбрасывал. `scripts/editors/lsp-check.fscript` меряет
это первым шагом и гоняет Neovim на двоичном из дерева (`bootstrap/flang`):
диагностика, переход к объявлению, наведение.

По умолчанию двоичный всё равно не берётся: у людей стоят выпуски по 0.7.24
включительно, и такой сервер выглядел бы просто висящим, а молчащий сервер
неотличим от сломанного. Взять его — `let g:flang_dvoichnyy_lsp = 1`. Когда
выйдет выпуск с исправлением, порядок поиска можно будет переставить, и Node
для редактора станет не нужен вовсе.

### Клиент для Vim 8/9 — vim-lsp, и вот почему именно он

Expand Down
30 changes: 17 additions & 13 deletions docs/editors/vim/autoload/flang.vim
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@
"
" ── Порядок путей и почему двоичный НЕ первый ───────────────────────────────
"
" У двоичного `flang` подкоманда `lsp` есть, и на закрытом вводе она отвечает
" правильно. Редактору она не годится: пока стандартный ввод открыт, сервер не
" присылает НИ ОДНОГО байта, и весь ответ вываливается разом при закрытии
" ввода. Померено (`docs/editors/vim/checks/potok.md`): с открытым вводом 0 байт
" за 3 секунды, после закрытия — 334 байта сразу; `flang-lsp` на Node на том же
" сообщении отвечает 311 байтами за 0,1 секунды. Редактор ввод не закрывает
" никогда, поэтому двоичный сервер выглядел бы как молча висящий, а молчащий
" сервер неотличим от сломанного.
" У двоичного `flang` подкоманда `lsp` есть. Выпуски по 0.7.24 включительно
" отвечают только после закрытия стандартного ввода: ввод читался кусками по
" 8192 байта, и `fread` ждал либо полный кусок, либо конец ввода. Померено
" `docs/editors/vim/checks/stream.sh`: с открытым вводом 0 байт, после
" закрытия — 334 байта сразу. Редактор ввод не закрывает никогда, поэтому у
" такого выпуска сервер выглядит молча висящим, а молчащий сервер неотличим от
" сломанного. Ввод теперь читается тем, что уже пришло (`repl_read_some` в
" `flang/src/emit/c/flang_repl.c`), и тот же замер даёт 334 байта при открытом
" вводе.
"
" Поэтому порядок такой:
"
Expand All @@ -29,9 +30,11 @@
" (`fe8e8a37`), обёртка `flang-lsp` — вместе с npm 6 сентября (задача 8649);
" искать его редактор перестал 9 сентября (задача 6201).
"
" Пункт 4 останется выключенным, пока двоичный не научится отвечать на лету.
" Когда научится — проверка `scripts/editors/lsp-check.fscript` позеленеет, и пункт
" можно будет поднять наверх: тогда Node для редактора станет не нужен.
" Пункт 4 остаётся по явной просьбе, хотя двоичный из этого дерева отвечает на
" лету: проверка `scripts/editors/lsp-check.fscript` меряет это первым шагом и
" гоняет Neovim именно на нём. Поставленные у людей выпуски по 0.7.24
" включительно по-прежнему молчат, и взять такой без спроса значило бы показать
" висящий сервер. Поднять пункт наверх можно, когда выйдет выпуск с исправлением.

let s:umeet_lsp = {}
let s:skazano = 0
Expand Down Expand Up @@ -108,8 +111,9 @@ function! flang#Pochemu() abort
\ ]
if flang#DvoichnyyEst()
call add(l:stroki, 'Двоичный flang с подкомандой lsp рядом ЕСТЬ, но он не взят:')
call add(l:stroki, ' он отвечает только после закрытия ввода, а редактор ввод не закрывает,')
call add(l:stroki, ' и сервер выглядел бы висящим. Взять всё равно: let g:flang_dvoichnyy_lsp = 1')
call add(l:stroki, ' выпуски по 0.7.24 включительно отвечают только после закрытия ввода, а редактор')
call add(l:stroki, ' ввод не закрывает, и сервер выглядел бы висящим; более новые отвечают сразу.')
call add(l:stroki, ' Взять его: let g:flang_dvoichnyy_lsp = 1')
endif
call add(l:stroki, 'Подсветка работает и без сервера.')
return join(l:stroki, "\n")
Expand Down
Loading
Loading