Как использовать AST как для пользовательского интерфейса, так и для статического анализа - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю над проектом на основе libTooling, где я написал собственный класс действий внешнего интерфейса, ссылаясь на this . Теперь я хочу запустить статический анализ Clang в том же инструменте. В настоящее время я снова запускаю инструмент для статического анализа clang (после изменения параметров компилятора). Но это проанализирует файлы и снова создаст AST.

Я хочу создать AST один раз и использовать его для настраиваемых действий внешнего интерфейса и статического анализа.

Как мне этого добиться? MultiplexConsumer может вам чем-нибудь помочь?

1 Ответ

0 голосов
/ 24 июля 2019

Кажется, что 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 будет работать.

...