我编写了程序,该程序在源代码中的游标下确定实例类型。我将ast文件和光标位置作为程序cmd参数传递,并在源代码及其类型中输出实例位置。
#include <stdio.h>
#include <stdlib.h>
#include <clang-c/Index.h>
int main(int argc, char *argv[])
{
CXIndex index;
CXTranslationUnit tu;
CXFile file;
CXSourceLocation loc;
CXCursor cursor, def;
CXType type;
CXString typesp;
const char *types;
index = clang_createIndex(0, 0);
// tu = clang_createTranslationUnitFromSourceFile(index, argv[1],
// 0, NULL, 0, NULL);
tu = clang_createTranslationUnit(index, argv[1]);
file = clang_getFile(tu, argv[1]);
loc = clang_getLocation(tu, file, atoi(argv[2]), atoi(argv[3]));
cursor = clang_getCursor(tu, loc);
/* Cursor location check */
CXSourceLocation testloc;
testloc = clang_getCursorLocation(cursor);
unsigned lnum, colnum;
clang_getFileLocation(testloc, NULL, &lnum, &colnum, NULL);
printf("%d %d\n", lnum, colnum);
if (clang_isPreprocessing(cursor.kind))
printf("Preprocessor\n");
else {
def = clang_getCursorDefinition(cursor);
if (clang_Cursor_isNull(def))
type = clang_getCursorType(cursor);
else
type = clang_getCursorType(def);
typesp = clang_getTypeSpelling(type);
types = clang_getCString(typesp);
printf("%s\n", types);
clang_disposeString(typesp);
}
clang_disposeTranslationUnit(tu);
clang_disposeIndex(index);
}
我不想每次程序启动前都为源文件生成ast文件。我可以使用clang_createTranslationUnitFromSourceFile()
和clang_reparseTranslationUnit
代替clang_createTranslationUnit()
。但是问题是我将通过此函数获得的TranslationUnits是某种错误。因此,当强制程序处理其自己的源代码时,我无法获得7, 10 (line, column)
位置的适当光标。我已经在this question中对其进行了详细描述。是否存在某种方法可以在不使用clang -emit-ast
的情况下获得正确的TranslationUnit for源代码?