Я пишу инструмент для 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?
Я озадачен 'const Stmt currentStmt = * s;'. Я думаю, вы имели в виду 'const Stmt & currentStmt = * s;' Я не уверен, что это причина вашей проблемы, но это может очень хорошо обмануть clang, думая, что это похожее, но другое заявление, у которого нет родителя. – Frank
Я никогда не работал с clang, но работал с несколькими другими библиотеками разбора/AST. Очень часто некоторая информация недоступна на некоторых ранних этапах обработки (хотя в общем случае на ранних стадиях обработки) API-интерфейсы узлов остаются неизменными (в основном потому, что было бы слишком дорогостоящим для воссоздания новых объектов узлов при каждой обработке этапы). Вы уверены, что API не указывает такое ограничение на функцию getParents()? – jwatkins
@Frank 'const Stmt & currentStmt = * s;' сделал трюк, спасибо. Если у вас есть хорошее объяснение, ответьте ниже, чтобы я мог отметить ваш ответ как правильный ans – minhhn2910