Как получить TranslationUnit из исходного кода? - PullRequest
0 голосов
/ 07 апреля 2019

Я пишу программу, которая определяет тип экземпляра под курсором в исходном коде. Я передаю 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);
}

Я не хочу генерировать аст-файл для исходного файла каждый раз перед запуском программы. Я могу использовать clang_createTranslationUnitFromSourceFile() и clang_reparseTranslationUnit вместо clang_createTranslationUnit(). Но проблема в том, что TranslationUnits, которые я получу с этими функциями, является своего рода ошибкой. Поэтому я не могу получить соответствующий Курсор для позиции 7, 10 (line, column), когда принудительная программа обрабатывает свой собственный исходный код. Я описал это более подробно в этом вопросе . Есть ли способ получить правильный TranslationUnit для исходного кода без использования clang -emit-ast?

...