Я пишу программу, которая определяет тип экземпляра под курсором.
#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);
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);
}
Когда я применяю программу к себе исходный код с параметрами 16
(строка) и 3
(столбец), которые соответствуют
index = clang_createIndex(0, 0);
// ^
отображает 6
(строка) и 1
(столбец), что соответствует
int main(int argc, char *argv[])
{
^
Это неправильно.Но когда применить 28 3
, которые соответствуют
printf("%d %d\n", lnum, colnum);
//^
Он отображает 28 1
, и это правильно.Почему Cursor сделан неправильно в первом случае и как сделать это правильно?
UPD:
Я нахожу извращенное решение: генерировать аст-файл с clang -emit-ast
перед основной программойзапускается и делает TranslationUnit из ast файла с clang_createTranslationUnit()
.Теоретически lang_createTranslationUnitFromSourceFile
должен делать то же самое для исходного файла, что clang_createTranslationUnit()
делает для аст, не так ли?Я имею в виду, что TranslationUnits, полученные из обеих функций, должны быть идентичны.Я не прав?