## Summary ### Preamble completeness check - `is_preamble_complete()` in `scan.cpp`: checks whether `#include`/`import`/`export module` directives in the preamble region are syntactically complete (have closing `>`/`"`/`;`) - `ensure_pch` defers PCH rebuild when preamble is incomplete (user still typing), reuses old PCH instead of failing ### #include / import completion - Master intercepts completion requests in `#include "..."` / `#include <...>` / `import ...` contexts before forwarding to worker - `complete_include()`: searches include paths (from compile args via `SearchConfig`) using `DirListingCache`, supports quoted/angled/multi-level paths - `complete_import()`: filters `path_to_module` map by prefix - Word boundary checks prevent false matches (e.g. `important` not treated as `import`) ### Detached compile task (rapid-edit fix) - Compile operations (`ensure_deps` + `send_stateful` + `publish_diagnostics`) run as detached tasks via `loop.schedule()`, independent of the LSP request coroutine chain - LSP `$/cancelRequest` can no longer kill in-flight compilations — previously, cancellation would destroy the `ensure_compiled` coroutine frame, leaving `doc.compiling` permanently set and hanging all subsequent requests - `CompileGuard` RAII ensures `doc.compiling` is always cleaned up even if the detached task fails - Stale feature requests (where `ast_dirty` became true after compile finished) are dropped before forwarding to worker ### Other fixes - `signal(SIGPIPE, SIG_IGN)` on POSIX: prevents server crash when LSP client disconnects mid-write - `CompilationUnitRef::file_path()` / `deps()`: null-check `FileEntryRef` to prevent segfault on invalid FileID - `stateless_worker.cpp`: log BuildPCH diagnostic errors for debuggability - Default worker counts changed to 2 stateful + 3 stateless - `logging_dir` default changed to `.clice/logs` in config ### Tests - 19 unit tests for `is_preamble_complete` (incomplete `#include`, `import`, `export module`, mixed cases) - Integration tests: `test_include_completion.py` (5 tests), `test_import_completion.py` (4 tests), `test_rapid_edit.py` (2 tests), `test_pch.py` (4 new tests) - Smoke test: `rapid_edit.jsonl` — recorded VSCode session with 40 rapid edits + 61 cancel requests ## Test plan - [x] Unit tests: 463 passed - [x] Integration tests: 104 passed - [x] Smoke test (rapid_edit.jsonl): PASS - [x] Manual VSCode testing with `#include <iostream>` project 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
71 lines
2.1 KiB
Markdown
71 lines
2.1 KiB
Markdown
# Extension
|
||
|
||
本节汇总各编辑器插件的开发与发布流程。目前包含 VSCode / Neovim / Zed。
|
||
|
||
## VSCode
|
||
|
||
VSCode 插件使用 Node/PNPM/VSCE 链路。推荐在 pixi 的 `node` 环境下操作以获得一致的工具链版本。
|
||
|
||
```shell
|
||
# 准备环境(先安装 pixi)
|
||
pixi shell -e node
|
||
|
||
# 安装依赖(基于 pnpm-lock)
|
||
pixi run install-vscode
|
||
|
||
# 打包扩展,产物位于 editors/vscode/*.vsix
|
||
pixi run build-vscode
|
||
```
|
||
|
||
发布到 VSCode Marketplace(需要 `VSCE_PAT` 环境变量):
|
||
|
||
```shell
|
||
pixi run publish-vscode
|
||
```
|
||
|
||
> [!TIP]
|
||
> 若已编译 clice,本地调试时可在 VSCode 设置中填写 `clice.executable`,使扩展指向你的自定义构建。
|
||
|
||
开发与调试:
|
||
|
||
1. `pixi shell -e node`
|
||
2. 在 `editors/vscode` 下运行 `pnpm run watch`(增量构建)
|
||
3. VSCode 中使用”Run Extension/Launch Extension”调试配置,或执行 `code --extensionDevelopmentPath=$(pwd)/editors/vscode`
|
||
|
||
常用脚本(在 `pixi shell -e node` 下):
|
||
|
||
```bash
|
||
pnpm run package # 等价于 pixi run build-vscode
|
||
pnpm run publish # 等价于 pixi run publish-vscode
|
||
```
|
||
|
||
如果不使用 pixi,请自行准备 node.js >= 20、pnpm,然后在 `editors/vscode` 目录执行:
|
||
|
||
```bash
|
||
pnpm install
|
||
pnpm run package
|
||
```
|
||
|
||
## Neovim
|
||
|
||
Neovim 插件位于 `editors/nvim`,使用 Lua 编写。目前功能仍在演进中。
|
||
|
||
- 将仓库路径加入 `runtimepath`,例如:`set rtp+=/path/to/clice/editors/nvim`
|
||
- 或在本地创建软链接:`~/.config/nvim/pack/clice/start/clice` -> `<repo>/editors/nvim`
|
||
- 需要 `clice` 可执行文件可在 `$PATH` 中被找到
|
||
|
||
开发提示:代码量较小,可直接在 Neovim 中加载并通过 `:messages`/LSP 日志观察效果;格式化可使用 `stylua`(仓库中已提供 `stylua.toml`)。
|
||
|
||
## Zed
|
||
|
||
Zed 插件位于 `editors/zed`,使用 Rust 和 `zed_extension_api`。
|
||
|
||
建议的本地验证流程:
|
||
|
||
```bash
|
||
cd editors/zed
|
||
cargo build --release
|
||
```
|
||
|
||
随后按 Zed 官方指南加载本地扩展(需安装 Zed CLI),在启动前确保 `clice` 已在 PATH 中。发布时同样遵循 Zed 扩展发布流程。
|