【问题标题】:Get actual spelling of lib clang cursor/type获取 lib clang 光标/类型的实际拼写
【发布时间】:2016-05-16 00:24:42
【问题描述】:

我编写了一个脚本来检测我的 C++ 代码中的格式错误。 (例如确保所有成员变量都以m_ 为前缀)。我想做的一件事是确保作为指针的类型具有附加到类型的星号(int* num,而不是int *num)。

所以我需要获取源代码中的类型文本。然而,获取光标或类型的拼写会返回一个漂亮的打印版本,它总是会返回int *,即使源有int*

为了解决这个问题,我获取了光标的范围并从源文件中获取子字符串并进行检查。但是似乎没有办法获得类型的范围,所以我无法获得它的实际拼写?有没有办法做到这一点?也许通过获取类型的令牌然后获取这些令牌的范围?

(我正在使用 python 绑定,但如果需要可以切换到 C API)

【问题讨论】:

    标签: python c++ clang libclang


    【解决方案1】:

    你可以试试这样的。获取拼写:

    std::string symbol = clang_getCString(clang_getCursorSpelling(Cursor));
    

    寻找指针声明器:

    case CXType_Pointer:
    {
      // ...
    }
    

    使用clang_tokenize,然后使用它来查找* 的位置。

    // Tokens retrieved with clang_tokenize
    // symbol declared earlier
    auto finder = std::find(tokens.begin(), tokens.end(), symbol);
    if (*(finder) == "*")
    {
      if (*(finder + 1)) == " ") { /* ... */ } // int* asdf
    } else if (*(finder) == " ") {
      if (*(finder + 1)) == "*") { /* ... */ } // int *asdf 
    }
    

    当然这是伪代码。编译器未触及代码。

    【讨论】:

    • 我很确定令牌不包含空格。
    【解决方案2】:

    Libclang 是查找匹配(或不匹配模式)的成员变量的好工具,但有一种更简单的方法可以解决代码库中漂亮打印指针和引用的问题,那就是使用 clang-format这是一个格式化 C/C++/Java/JavaScript/Objective-C/Protobuf 代码的工具

    Clang-format 有大量的options,但最感兴趣的可能是PointerAlignment,它可以有以下值之一:Left、Right 或 Middle,它们会适当地重新格式化指针(和引用) .

    您可以通过在线工具或内置样式为 clang-format 生成新的配置文件:

    clang-format -style=llvm -dump-config > .clang-format
    

    编辑该文件以将 PointerAlignment 设置为 Left 并运行:

    clang-format main.cpp 
    

    在“不良”格式的代码上,例如:

    // main.cpp
    int main()
    {
        int a;
        int* b;
        int *c;
        int& d;
        int &d;
        int * e;
        const int * f;
        const int * const g;
        return 0;
    }
    

    我明白了:

    // main.cpp
    int main() {
      int a;
      int* b;
      int* c;
      int& d;
      int& d;
      int* e;
      const int* f;
      const int* const g;
      return 0;
    }
    

    其他设置的结果相似。

    如果您确实需要从代码中执行此操作,您可以使用支持 clang-format 的库 libformat,或者您可以使用调用 clang-format from a subprocess,这是 clang 代码库中的其他工具所做的这个。

    【讨论】:

    • 我查看了 clang 格式,但似乎没有办法定义自定义规则。没看libformat,但乍一看,好像只能调用格式化过程,不能定义自定义规则。
    • 考虑分两个阶段执行此操作 - 在第一阶段,您可以使用 libclang 或 clang replacements 查找(并可能替换成员变量),然后在第二遍中更正指针/引用。
    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多