Как использовать AST как для пользовательского интерфейса, так и для статического анализа
Я работаю над проектом на основе libTooling, где я написал пользовательский класс действий внешнего интерфейса, ссылаясь на это. Теперь я хочу запустить статический анализ clang в том же инструменте. В настоящее время я снова запускаю инструмент для статического анализа clang (после изменения параметров компилятора). Но это проанализирует файлы и снова создаст AST.
Я хочу создать AST один раз и использовать его для настраиваемых действий внешнего интерфейса и статического анализа.
Как мне этого добиться? MultiplexConsumer может вам чем-нибудь помочь?
0 ответов
Кажется, что MultiplexConsumer - это правильный выбор.
Вот что у меня сработало в моем внешнем классе действий:
std::unique_ptr<ASTConsumer> CreateASTConsumer(
CompilerInstance& compiler, StringRef inFile) override {
std::unique_ptr<ASTConsumer> consumer1 =
std::make_unique<MyConsumer1>(compiler);
std::unique_ptr<ASTConsumer> consumer2 =
std::make_unique<MyConsumer2>(compiler);
std::vector<std::unique_ptr<ASTConsumer>> consumers;
consumers.emplace_back(std::move(consumer1));
consumers.emplace_back(std::move(consumer2));
return std::make_unique<MultiplexConsumer>(std::move(consumers));
}
Однако обратите внимание, что если потребитель1 возвращает какие-либо ошибки, потребитель2 не запускается. Если потребитель1 возвращает только предупреждения или не выводит диагностику, запускается потребитель2.