2016-11-29 6 views
4

Я пишу инструмент для clang 4.0 с помощью LibTooling на основе примера Clang ASTFrontendActions sample. Учитывая текущий оператор stmt, я хочу получить непосредственного родителя в AST. Поэтому я стараюсь код ниже, чтобы сбросить все родителям зЬтЬ (для целей тестирования):clang ASTContext.getParents всегда возвращает пустой список

bool VisitStmt(Stmt *s) { 
    cout <<"Trying to get parents \n"; 
    const Stmt currentStmt = *s; 
    const auto& parents = Context->getParents(currentStmt); 
    auto it = Context->getParents(currentStmt).begin(); 
    if(it == Context->getParents(currentStmt).end()) 
     cout<< "parents not found\n"; 
    cout<<"parents size "<< parents.size() <<": \n"; 
    if (!parents.empty()){ 
     for (int i = 0; i< parents.size(); i++){ 
      cout<<"parent at "<< i <<": \n"; 
      const Stmt* parentStmt = parents[i].get<Stmt>(); 
      parentStmt->dump(); 
     } 

    } 
} 

Context является ASTContext и работал хорошо, когда я использую другие функции него, такие как: Context->getSourceManager()
Для всех операторов посещенных результат всегда (независимо от того, что я ставлю на входе):

Trying to get parents 
parents not found 
parents size 0: 

ли я пропустить что-нибудь (инициализация, настройка), чтобы использовать getParents?

+1

Я озадачен 'const Stmt currentStmt = * s;'. Я думаю, вы имели в виду 'const Stmt & currentStmt = * s;' Я не уверен, что это причина вашей проблемы, но это может очень хорошо обмануть clang, думая, что это похожее, но другое заявление, у которого нет родителя. – Frank

+1

Я никогда не работал с clang, но работал с несколькими другими библиотеками разбора/AST. Очень часто некоторая информация недоступна на некоторых ранних этапах обработки (хотя в общем случае на ранних стадиях обработки) API-интерфейсы узлов остаются неизменными (в основном потому, что было бы слишком дорогостоящим для воссоздания новых объектов узлов при каждой обработке этапы). Вы уверены, что API не указывает такое ограничение на функцию getParents()? – jwatkins

+0

@Frank 'const Stmt & currentStmt = * s;' сделал трюк, спасибо. Если у вас есть хорошее объяснение, ответьте ниже, чтобы я мог отметить ваш ответ как правильный ans – minhhn2910

ответ

3

Проблема возникает из следующей строки:

const Stmt currentStmt = *s; 

Что это делает сделать копию заявления. Context->getParents() работает, ища узлы, которые передают аргумент в качестве дочернего. Но так как currentStmt живет только в вашем стеке, а не в контексте, ему не удается найти такой узел.

Делая currentStmt ссылка на узел, на который указывает с:

const Stmt& currentStmt = *s; 

Тогда вы проездом к контексту экземпляра фактического узла, который он имеет в себе, и лязг удастся успешно найти родителей ,

 Смежные вопросы

  • Нет связанных вопросов^_^