Eclipse CDT plugin - Извлекает ссылочные значения CDTName - тела функций и постоянные значения - PullRequest
0 голосов
/ 12 сентября 2018

Я использую реализацию класса ASTVisitor для получения информации об узлах CDT в моем коде. Это работает как задумано, однако я не могу понять, как извлечь узел BodyStatement узла CASTFunctionCallExpression из другого файла или любых других узлов CDTName, на которые есть ссылки, из других файлов (например, константы, на которую ссылаются, из другого файла, для которого я не могу получить значение константы - Я скучаю по нужному узлу).

Например, у меня есть этот код:

main.c

#include <stdlib.h>
#include <stdio.h>
#include "functions.h"

int main(void) {
    func1();
    func2();
    return 0;
}

functions.h

void func1(void);
void func2(void);

functions.c

#include "functions.h"

void func1(void) {
    printf("Function 1!\n"); 
}

void func2(void) {
    printf("Function 2!\n");
}

Теперь мне нужно получить тела функций func1 и func2, а мой ASTVisitor собирает информацию из исходного файла main.c.

Есть ли какой-нибудь возможный способ получения значений ссылочных CDTNames (вызовы функций, константы и т. Д.) - тел функций (CASTCompoundStatements), постоянных значений? Я попытался отладить значения CASTFunctionCallExpression ссылочных функций, но не могу найти информацию об их происхождении и, следовательно, их телах. Есть ли для этого класс поиска?

1 Ответ

0 голосов
/ 13 сентября 2018

В CDT AST создаются для каждого файла. Итак, если у вас есть AST для файла 1, и он ссылается на функцию, определенную в файле 2, тело этой функции не будет присутствовать в AST для файла 1.

Если вам нужно тело функции, вам также нужно создать AST для файла 2.

Если ваш проект проиндексирован, вы можете сделать что-то вроде этого:

  • Перейдите к узлу IASTName, представляющему имя функции в AST для файла 1.
  • Вызовите IASTNode.resolveBinding(), чтобы получить объект IBinding, представляющий вызываемую функцию.
  • Используйте IIndex.findDefinitions(IBinding) для поиска местоположения определения функции в проекте. Это дает вам IIndexName, представляющее имя на сайте определения функции.
    • Объект IIndex может быть получен, например, с помощью IASTTranslationUnit.getIndex().
  • Используйте IIndexName.getFile() для идентификации файла, содержащего определение (далее «файл 2»)
  • Сборка AST для файла 2
  • Чтобы найти определение в AST для файла 2, вы можете использовать IASTTranslationUnit.getNodeSelector().findName(), передавая смещение и длину из IIndexName
  • Перейдите AST от определения, которое вы нашли (который является IASTName) к телу
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...