лязг делает неправильный курсор - PullRequest
0 голосов
/ 06 апреля 2019

Я пишу программу, которая определяет тип экземпляра под курсором.

#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, полученные из обеих функций, должны быть идентичны.Я не прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...