私は現在、C++ で libclang を使用して単純なクローン検出器を作成しています。
このプログラムは、構造体を使用してカーソルを格納します。この構造体には、翻訳単位へのポインターと、clang_getCursorLocation(cursor) の呼び出しから取得した CXSourceLocation が含まれます。
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();
};
}
ただし、出力は一貫しており、これは特定のカーソルの種類でのみ発生することを示唆しています。
これはバグですか、それとも私が見逃している、または間違っていることがありますか?
前もって感謝します、ジェイコブ