Add the "quit" command as a way to terminate clang-query interactive sessions.

llvm-svn: 244206
This commit is contained in:
Aaron Ballman 2015-08-06 11:56:57 +00:00
parent a02ac60469
commit 5890717e70
5 changed files with 26 additions and 2 deletions

View File

@ -44,7 +44,14 @@ bool HelpQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const {
" set output (diag|print|dump) " " set output (diag|print|dump) "
"Set whether to print bindings as diagnostics,\n" "Set whether to print bindings as diagnostics,\n"
" " " "
"AST pretty prints or AST dumps.\n\n"; "AST pretty prints or AST dumps.\n"
" quit "
"Terminates the query session.\n\n";
return true;
}
bool QuitQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const {
QS.Terminate = true;
return true; return true;
} }

View File

@ -32,6 +32,7 @@ enum QueryKind {
QK_Match, QK_Match,
QK_SetBool, QK_SetBool,
QK_SetOutputKind, QK_SetOutputKind,
QK_Quit
}; };
class QuerySession; class QuerySession;
@ -76,6 +77,14 @@ struct HelpQuery : Query {
static bool classof(const Query *Q) { return Q->Kind == QK_Help; } static bool classof(const Query *Q) { return Q->Kind == QK_Help; }
}; };
/// Query for "quit".
struct QuitQuery : Query {
QuitQuery() : Query(QK_Quit) {}
bool run(llvm::raw_ostream &OS, QuerySession &QS) const override;
static bool classof(const Query *Q) { return Q->Kind == QK_Quit; }
};
/// Query for "match MATCHER". /// Query for "match MATCHER".
struct MatchQuery : Query { struct MatchQuery : Query {
MatchQuery(const ast_matchers::dynamic::DynTypedMatcher &Matcher) MatchQuery(const ast_matchers::dynamic::DynTypedMatcher &Matcher)

View File

@ -142,6 +142,7 @@ enum ParsedQueryKind {
PQK_Match, PQK_Match,
PQK_Set, PQK_Set,
PQK_Unlet, PQK_Unlet,
PQK_Quit
}; };
enum ParsedQueryVariable { enum ParsedQueryVariable {
@ -181,6 +182,7 @@ QueryRef QueryParser::doParse() {
.Case("match", PQK_Match) .Case("match", PQK_Match)
.Case("set", PQK_Set) .Case("set", PQK_Set)
.Case("unlet", PQK_Unlet) .Case("unlet", PQK_Unlet)
.Case("quit", PQK_Quit)
.Default(PQK_Invalid); .Default(PQK_Invalid);
switch (QKind) { switch (QKind) {
@ -190,6 +192,9 @@ QueryRef QueryParser::doParse() {
case PQK_Help: case PQK_Help:
return endQuery(new HelpQuery); return endQuery(new HelpQuery);
case PQK_Quit:
return endQuery(new QuitQuery);
case PQK_Let: { case PQK_Let: {
StringRef Name = lexWord(); StringRef Name = lexWord();

View File

@ -25,11 +25,12 @@ namespace query {
class QuerySession { class QuerySession {
public: public:
QuerySession(llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs) QuerySession(llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs)
: ASTs(ASTs), OutKind(OK_Diag), BindRoot(true) {} : ASTs(ASTs), OutKind(OK_Diag), BindRoot(true), Terminate(false) {}
llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs; llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs;
OutputKind OutKind; OutputKind OutKind;
bool BindRoot; bool BindRoot;
bool Terminate;
llvm::StringMap<ast_matchers::dynamic::VariantValue> NamedValues; llvm::StringMap<ast_matchers::dynamic::VariantValue> NamedValues;
}; };

View File

@ -111,6 +111,8 @@ int main(int argc, const char **argv) {
QueryRef Q = QueryParser::parse(*Line, QS); QueryRef Q = QueryParser::parse(*Line, QS);
Q->run(llvm::outs(), QS); Q->run(llvm::outs(), QS);
llvm::outs().flush(); llvm::outs().flush();
if (QS.Terminate)
break;
} }
} }