Инкрементальная проверка
Описание проблемы
В режиме watch любое изменение файла вызывает повторную проверку всех файлов (полная повторная проверка), а дебаунсинг использует busy-wait (проверка каждые 50 мс), что приводит к холостому вращению CPU.
Решение
Использовать CheckSession для управления состоянием инкрементальной проверки, использовать ModuleDependencyGraph::affected_modules для повторной проверки только затронутых файлов.
Процесс реализации
text
首次检查:
全量检查 → 缓存依赖图 + 每个模块的检查结果
文件变更:
1. affected_modules(changed_files) → 找出受影响模块
2. 只重新解析和检查受影响模块
3. 更新缓存和依赖图CheckSession
rust
pub struct CheckSession {
dep_graph: ModuleDependencyGraph,
cache: ModuleCache,
all_files: Vec<PathBuf>,
}
impl CheckSession {
pub fn check_all(&mut self, files: &[PathBuf]) -> Result<CheckResult>;
pub fn check_incremental(&mut self, changed_files: &[PathBuf]) -> Result<CheckResult>;
}Известные ограничения
- Режим watch по-прежнему использует busy-wait дебаунсинг (
Instant::now()+recv_timeoutвcommand.rs) check_incrementalвнутренне всё ещё вызываетcheck_files_with_diagnostics(полный путь), не используя по-настоящему инкрементальный подход
Будущая работа
- A2/P1: заменить busy-wait дебаунсинг на
HotReloader - P2/P3: подключить
CheckSessionв режим watch для настоящей инкрементальной проверки - T9: тесты корректности инкрементальной проверки
