Как использовать 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.

Другие вопросы по тегам