32 #include "clang/Frontend/ASTUnit.h"
33 #include "clang/Tooling/CommonOptionsParser.h"
34 #include "clang/Tooling/Tooling.h"
35 #include "llvm/LineEditor/LineEditor.h"
36 #include "llvm/Support/CommandLine.h"
37 #include "llvm/Support/MemoryBuffer.h"
38 #include "llvm/Support/Signals.h"
42 using namespace clang;
43 using namespace clang::ast_matchers;
44 using namespace clang::ast_matchers::dynamic;
45 using namespace clang::query;
46 using namespace clang::tooling;
49 static cl::extrahelp
CommonHelp(CommonOptionsParser::HelpMessage);
52 static cl::list<std::string>
Commands(
"c", cl::desc(
"Specify command to run"),
53 cl::value_desc(
"command"),
57 cl::desc(
"Read commands from file"),
58 cl::value_desc(
"file"),
61 int main(
int argc,
const char **argv) {
62 llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
67 llvm::errs() << argv[0] <<
": cannot specify both -c and -f\n";
71 ClangTool Tool(OptionsParser.getCompilations(),
72 OptionsParser.getSourcePathList());
73 std::vector<std::unique_ptr<ASTUnit>> ASTs;
74 if (Tool.buildASTs(ASTs) != 0)
81 QueryRef Q = QueryParser::parse(*I, QS);
82 if (!Q->run(llvm::outs(), QS))
87 std::ifstream Input(I->c_str());
88 if (!Input.is_open()) {
89 llvm::errs() << argv[0] <<
": cannot open " << *I <<
"\n";
92 while (Input.good()) {
94 std::getline(Input, Line);
96 QueryRef Q = QueryParser::parse(Line, QS);
97 if (!Q->run(llvm::outs(), QS))
102 LineEditor LE(
"clang-query");
103 LE.setListCompleter([&QS](StringRef
Line,
size_t Pos) {
104 return QueryParser::complete(Line, Pos, QS);
106 while (llvm::Optional<std::string> Line = LE.readLine()) {
107 QueryRef Q = QueryParser::parse(*Line, QS);
108 Q->run(llvm::outs(), QS);
109 llvm::outs().flush();
static cl::list< std::string > Commands("c", cl::desc("Specify command to run"), cl::value_desc("command"), cl::cat(ClangQueryCategory))
Represents the state for a particular clang-query session.
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage)
static cl::OptionCategory ClangQueryCategory("clang-query options")
static cl::list< std::string > CommandFiles("f", cl::desc("Read commands from file"), cl::value_desc("file"), cl::cat(ClangQueryCategory))
llvm::IntrusiveRefCntPtr< Query > QueryRef
int main(int argc, const char **argv)