//===- DependencyScanningTool.cpp - clang-scan-deps service ------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "clang/Tooling/DependencyScanning/DependencyScanningTool.h" #include "clang/Frontend/Utils.h" namespace clang{ namespace tooling{ namespace dependencies{ DependencyScanningTool::DependencyScanningTool(DependencyScanningService &Service, const tooling::CompilationDatabase &Compilations) : Worker(Service), Compilations(Compilations) {} llvm::Expected DependencyScanningTool::getDependencyFile(const std::string &Input, StringRef CWD) { /// Prints out all of the gathered dependencies into a string. class DependencyPrinterConsumer : public DependencyConsumer { public: void handleFileDependency(const DependencyOutputOptions &Opts, StringRef File) override { if (!this->Opts) this->Opts = std::make_unique(Opts); Dependencies.push_back(File); } void printDependencies(std::string &S) { if (!Opts) return; class DependencyPrinter : public DependencyFileGenerator { public: DependencyPrinter(DependencyOutputOptions &Opts, ArrayRef Dependencies) : DependencyFileGenerator(Opts) { for (const auto &Dep : Dependencies) addDependency(Dep); } void printDependencies(std::string &S) { llvm::raw_string_ostream OS(S); outputDependencyFile(OS); } }; DependencyPrinter Generator(*Opts, Dependencies); Generator.printDependencies(S); } private: std::unique_ptr Opts; std::vector Dependencies; }; DependencyPrinterConsumer Consumer; auto Result = Worker.computeDependencies(Input, CWD, Compilations, Consumer); if (Result) return std::move(Result); std::string Output; Consumer.printDependencies(Output); return Output; } } // end namespace dependencies } // end namespace tooling } // end namespace clang