C ++ libclang:从CXSourceLocation检索光标返回错误光标?(C++ lib

2019-08-17 11:59发布

我目前正在写使用libclang用C ++简单的克隆探测器。

程序存储用结构中的光标,含有一个指针到翻译单元和CXSourceLocation从主叫clang_getCursorLocation(光标)获得的。

typedef struct {
    CXTranslationUnit* tu;
    CXSourceLocation srcLoc;
} t_cursorLocation;

对于这个错误的缘故,孩子访客功能访问的每个节点,并创建从每个光标一个结构。 随着类型t_cursorLocation的结构,我写了这个函数来获取相应的光标:

CXCursor getCursor(t_cursorLocation *loc1) {
    return clang_getCursor(*loc1->tu, loc1->srcLoc);
}

然而,有一些光标,当我创建了t_cursorLocation结构,并用它来检索从中创建光标,检索到的光标不等于其所源自光标。 作为一个例子,看到孩子访客功能:

CXChildVisitResult traverseAST(CXCursor cursor, CXCursor parent,
                                                CXClientData client_data) {
    CXTranslationUnit tu = clang_Cursor_getTranslationUnit(cursor);
    CXTranslationUnit tu2 = *((CXTranslationUnit *) client_data);

    t_cursorLocation *loc = new t_cursorLocation();
    loc->tu = &tu;
    loc->srcLoc = clang_getCursorLocation(cursor);

    CXCursor c2 = getCursor(loc);
    printf("CursorKind\t%s\n",
           clang_getCString(clang_getCursorKindSpelling(cursor.kind)));
    if (clang_equalCursors(cursor, c2)) {
        printf("Noooo - the cursors do not match! Next test.....");
        // use translation unit passed as client_data to see if
        // there's a difference
        loc->tu = &tu2;
        c2 = getCursor(loc);
        if (clang_equalCursors(cursor, c2)) {
            printf("FAILED ALSO!\n");
        } else {
            printf("PASSED???\n");
        }
    } else {
        printf("We have a match!\n");
    }
    return CXChildVisit_Recurse;
}

我的主要功能如下:

int main(int argc, char **argv) {
    CXIndex index = clang_createIndex(0, 0);
    // initialise the translation unit
    CXTranslationUnit tu = clang_parseTranslationUnit(index, 0,
        argv, argc, 0, 0, CXTranslationUnit_None);

    // set the client data in traverseAST
    CXClientData data = &tu;// NULL;
    // get the root cursor for the translation unit
    CXCursor rootCursor = clang_getTranslationUnitCursor(tu);
    clang_visitChildren(rootCursor, traverseAST, data);

    clang_disposeTranslationUnit(tu);
    clang_disposeIndex(index);

    return 0;
}

我跑这在伪代码如下:

void goo() {
    // nothing here
}

void foo() {
    // do something
    int a;
    switch (a) {
        case 0:
            goo();
    };
}

但是输出是一致的,这表明这只是某些游标类型的发生。

这是一个bug或者是有什么我丢失或做错了什么?

在此先感谢,雅各

Answer 1:

要么我失去了你的观点完全,或者您正在使用clang_equalCursors错误的方式:当两个光标是平等的, clang_equalCursors返回一个非零值。 这意味着我认为你正在测试,而不是平等的游标不平等。

现在,让我尝试解释为什么某些光标显然表现得比其他人不同。 各光标仅具有一个源位置。 但是,有可能是在同一源位置的几个游标。 想想例如约以下行:

CXIndex index = clang_createIndex(0, 0);
//      ^

应该有上述标记的位置至少有两个光标:

  1. VarDecl: index
  2. DeclRefExpr: index = clang_createIndex(0,0)

当您转换的源位置回光标, clang_getCursor给你最具体的一个(在这种情况下,变量声明)。 我怀疑这是发生了什么,你在这种情况下: getCursor(loc)只给你回你正在访问,如果它是最具体的,在其位置的光标。

尝试打印各光标的物理源位置(例如使用实施clang_getCursorExtent和clang_getExpansionLocation )了解会发生什么。



文章来源: C++ libclang: Retrieving cursor from CXSourceLocation returning wrong cursor?