Lint
概述
clice 集成 clang-tidy 作为内置代码检查引擎。与独立的 clang-tidy 逐个处理每个翻译单元不同,clice 的架构支持跨翻译单元协调以消除重复工作。
用法:clice lint(尚未实现)
当前状态
- 基本 clang-tidy 集成(单翻译单元、编辑器内诊断)
- 通过 CLI 进行项目级 lint(
clice lint) - 跨翻译单元头文件去重
- 增量重新 lint(仅变更文件)
- Lint 结果缓存
跨翻译单元优化
问题
clang-tidy 独立处理每个翻译单元。被 N 个源文件包含的头文件会被检查 N 次 — 这是乘法级开销,使得大型代码库的项目级 lint 非常缓慢。
clice 的方案
作为持久化服务器,clice 掌握完整的编译图,因此可以:
- 追踪哪些头文件在多个翻译单元间共享
- 对声明内容哈希以跳过先前翻译单元中已检查的相同声明
- 带依赖感知的 lint 作业调度(共享头文件只 lint 一次,传播结果)
- 按内容哈希 + 检查配置键缓存头文件 lint 结果
- 单文件诊断去重(基本:移除单个翻译单元内的重复诊断)
- 项目级诊断去重(高级:跨翻译单元中同一头文件的相同警告只显示一次)
预期加速
对于具有 H 个共享头文件和 N 个翻译单元的项目,独立的 clang-tidy 的工作量为 O(N × H)。通过跨翻译单元去重,clice 的设计目标是增量检查 — 使每个头文件无论被多少翻译单元包含都只检查一次。
clang-tidy 集成质量
影响语言服务器中 clang-tidy 诊断质量的问题:
- 抑制来自系统头文件宏的 clang-tidy 警告(clangd#1587、clangd#2000)
- 在预编译头中的预处理指令(头文件保护、宏)上运行检查(clangd#2501、clangd#160)
- 按检查类别配置诊断严重性(clangd#1937)
- 支持加载 clang-tidy 插件(clangd#1458)
- Clang 静态分析器支持(clangd#905)
- 应用 clang-tidy 修复时清理替换内容(clangd#429)
- 按版本控制 diff 过滤诊断(clangd#822)
- NOLINT / NOLINTNEXTLINE / NOLINTBEGIN-END 注释抑制
-
.clangd配置中的Diagnostics.ClangTidy配置 - clang-tidy 性能的快速检查过滤
- clang-tidy 的 fix-it 建议作为代码操作
- 诊断元数据:检查名称、文档 URL、来源标签
配置
遵守项目树中的标准 .clang-tidy 配置文件。
变更记录
| 日期 | 变更 | PR |
|---|---|---|
| — | 存根实现、依赖图追踪 | — |