2017-02-04 8 views
2

Я пытаюсь извлечь информацию о исходном коде C++. Один тип поля.Как получить тип поля с помощью парсера CDT

, когда исходный код, как и я, хочу извлечь информацию, когда вызывается info.call().

Info info; 
//skip 
info.call(); //<- from here 

Проникновение посетителей, которые посещают узел IASTName, я попытался извлечь информацию о типе, как показано ниже.

public class CDTVisitor extends ASTVisitor { 

    public CDTVisitor(boolean visitNodes) { 
     super(true); 
    } 

    public int visit(IASTName node){ 
     if(node.resolveBinding().getName().toString().equals("info")) 
      System.out.println(((IField)node.getBinding()).getType()); 
      // this not work properly. 
      //result is "[email protected]" 

     return 3; 
    } 
} 

ответ

0

Автоответ. Причина, по которой я не мог получить объект привязки, был тип АСТ.

При попытке проанализировать исходный код на C++, я должен был использовать ICPPASTTranslationUnit. Нет никакого кода, связанного с этим, я использовал IASTTranslationUnit как возвращаемый тип AST.

После использования ICPPASTTranslationUnit вместо IASTTranslationUnit, я решил эту проблему.

+0

Прохладный! Как вы использовали ICPPASTTranslationUnit? Я работаю в автономном синтаксическом анализе C++ с использованием Eclipse CDT, и мне также нужно решить привязку. Я написал код, но AST не работает должным образом. Если бы вы могли поделиться своим кодом, я буду благодарен. –

+0

@FelipeGomes, чтобы разрешить привязку, вам нужно использовать индексатор, но у индексатора есть связь с студией eclipse. –

1

Предполагая, что код фактически действует, типа переменного разрешения на ProblemType является признаком проблемы конфигурации в любом инструменте или плагин работает этот код, или в проекте/рабочее пространстве, содержащем код, на котором он запускается.

В этом случае тип переменной info равен Info, который предположительно является классом или структурным типом, или typedef. Чтобы разрешить это правильно, CDT должен уметь видеть объявление этого типа.

Если этот тип не объявлен в том же файле, который анализируется, а скорее в файле заголовка, включенном в этот файл, CDT должен использовать индекс проекта, чтобы найти объявление. Это означает:

  • AST должен быть основан на индексе. Например, при использовании ITranslationUnit.getAST для создания AST необходимо использовать перегрузку, которая принимает параметр IIndex, и для него должен быть предоставлен необязательный аргумент.

  • Поскольку IIndex связан с проектом CDT, анализируемый код должен быть частью проекта CDT, а проект необходимо проиндексировать.

  • Для правильного определения указателями директив #include пулы проекта должны быть настроены правильно, чтобы индекеры могли фактически находить правильные файлы заголовков для разбора.

Любой один из них не является случай может привести к типу разрешающего к ProblemType.

+0

Да! Я просто поместил nul значение в Index. Думаю, в этом-то и дело. Есть ли какие-либо DOC. или примеры, чтобы увидеть, как использовать индекс? –

+0

@ Ui-GyunJeong: Может быть https://wiki.eclipse.org/images/c/c7/CDT_APIs_for_code_introspection.pdf полезно? Общая идея заключается в том, что код должен быть в проекте, и вы получаете индекс из проекта. – HighCommander4

+0

@ Ui-GyunJeong: Это также может быть полезной справочной информацией: https://wiki.eclipse.org/CDT/designs/Overview_of_Parsing – HighCommander4