如何去除C++类声明中成员的前置缩进?
如何去除C++类声明内成员的前置缩进?
需求说明
需要移除C++类声明内直接成员(变量、函数声明/定义、访问控制符、内部类声明)的前置缩进,但保留内部类自身的成员缩进、内联函数体内部的缩进。示例如下:
输入代码
class Type { int var; public: void f1(); class Inner { // ... }; double f2(int i) { // .... } }
转换后代码
class Type { int var; public: void f1(); class Inner { // ... }; double f2(int i) { // .... } }
实现方案
clang-format确实没有直接对应的配置项,得通过自定义工具实现,两种可行思路:
1. 基于AST解析(推荐,准确性高)
用Clang的LibTooling工具链解析代码的抽象语法树(AST),精准识别代码结构:
- 遍历AST时,标记当前是否处于外层类的直接作用域内
- 对该作用域下的成员(变量、函数声明、访问控制符、内部类节点),移除其所在行的前置缩进
- 内部类的作用域、函数体的作用域保持原有缩进规则不变
这种方法能完美处理嵌套类、复杂内联函数等边界情况,不会误处理其他缩进。
2. 正则脚本实现(轻量,适合简单场景)
如果不想引入AST工具链,也可以写正则脚本,但需要仔细处理边界:
- 维护一个状态变量,标记是否处于外层类的直接作用域(遇到外层类的
{进入状态,遇到匹配的}退出,注意区分内部类的}) - 在目标状态下,对每一行去掉前置空白字符,但要跳过内部类的成员行、函数体内部的行
- 注意处理多行注释、字符串字面量等特殊情况,避免误修改
动机补充
我写了一个脚本,用来注释掉零覆盖率的函数体:逻辑是把行首的大括号视为函数体的包裹括号,若函数体内所有行覆盖率为零,就整体注释掉。这种无缩进的类成员风格能让脚本准确区分类的大括号和函数体的大括号,只有类内定义的内联函数是目前的例外情况。
内容的提问来源于stack exchange,提问作者Eli4ph
相关产品推荐
相关产品推荐

