Files
clice/docs/zh/dev/extension.md
ykiko e239b0d32c feat: smart PCH rebuild, #include/import completion, rapid-edit robustness (#394)
## 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>
2026-04-06 14:49:09 +08:00

2.1 KiB
Raw Blame History

Extension

本节汇总各编辑器插件的开发与发布流程。目前包含 VSCode / Neovim / Zed。

VSCode

VSCode 插件使用 Node/PNPM/VSCE 链路。推荐在 pixi 的 node 环境下操作以获得一致的工具链版本。

# 准备环境(先安装 pixi
pixi shell -e node

# 安装依赖(基于 pnpm-lock
pixi run install-vscode

# 打包扩展,产物位于 editors/vscode/*.vsix
pixi run build-vscode

发布到 VSCode Marketplace需要 VSCE_PAT 环境变量):

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 下):

pnpm run package # 等价于 pixi run build-vscode
pnpm run publish # 等价于 pixi run publish-vscode

如果不使用 pixi请自行准备 node.js >= 20、pnpm然后在 editors/vscode 目录执行:

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

建议的本地验证流程:

cd editors/zed
cargo build --release

随后按 Zed 官方指南加载本地扩展(需安装 Zed CLI在启动前确保 clice 已在 PATH 中。发布时同样遵循 Zed 扩展发布流程。