summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2018-10-24 20:33:55 +0000
committerStephen Kelly <steveire@gmail.com>2018-10-24 20:33:55 +0000
commit70d771714ec6210df887139b2c1467c5acd79da1 (patch)
tree3b5fc2577ac3766bf691239ea725087cc4cb0eff
parent51707b21a0d7fe140fd0cf20f001192cecd301aa (diff)
downloadbcm5719-llvm-70d771714ec6210df887139b2c1467c5acd79da1.tar.gz
bcm5719-llvm-70d771714ec6210df887139b2c1467c5acd79da1.zip
[clang-query] Refactor Output settings to booleans
Summary: This will make it possible to add non-exclusive mode output. Reviewers: aaron.ballman Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D53501 llvm-svn: 345194
-rw-r--r--clang-tools-extra/clang-query/Query.cpp11
-rw-r--r--clang-tools-extra/clang-query/Query.h18
-rw-r--r--clang-tools-extra/clang-query/QueryParser.cpp12
-rw-r--r--clang-tools-extra/clang-query/QuerySession.h9
-rw-r--r--clang-tools-extra/unittests/clang-query/QueryEngineTest.cpp4
-rw-r--r--clang-tools-extra/unittests/clang-query/QueryParserTest.cpp10
6 files changed, 45 insertions, 19 deletions
diff --git a/clang-tools-extra/clang-query/Query.cpp b/clang-tools-extra/clang-query/Query.cpp
index abf1a32470d..48e20047701 100644
--- a/clang-tools-extra/clang-query/Query.cpp
+++ b/clang-tools-extra/clang-query/Query.cpp
@@ -107,8 +107,7 @@ bool MatchQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const {
for (auto BI = MI->getMap().begin(), BE = MI->getMap().end(); BI != BE;
++BI) {
- switch (QS.OutKind) {
- case OK_Diag: {
+ if (QS.DiagOutput) {
clang::SourceRange R = BI->second.getSourceRange();
if (R.isValid()) {
TextDiagnostic TD(OS, AST->getASTContext().getLangOpts(),
@@ -118,20 +117,16 @@ bool MatchQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const {
DiagnosticsEngine::Note, "\"" + BI->first + "\" binds here",
CharSourceRange::getTokenRange(R), None);
}
- break;
}
- case OK_Print: {
+ if (QS.PrintOutput) {
OS << "Binding for \"" << BI->first << "\":\n";
BI->second.print(OS, AST->getASTContext().getPrintingPolicy());
OS << "\n";
- break;
}
- case OK_DetailedAST: {
+ if (QS.DetailedASTOutput) {
OS << "Binding for \"" << BI->first << "\":\n";
BI->second.dump(OS, AST->getSourceManager());
OS << "\n";
- break;
- }
}
}
diff --git a/clang-tools-extra/clang-query/Query.h b/clang-tools-extra/clang-query/Query.h
index e8f4ff34bed..1f5a25db736 100644
--- a/clang-tools-extra/clang-query/Query.h
+++ b/clang-tools-extra/clang-query/Query.h
@@ -10,6 +10,7 @@
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_H
+#include "QuerySession.h"
#include "clang/ASTMatchers/Dynamic/VariantValue.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/Optional.h"
@@ -133,6 +134,23 @@ template <typename T> struct SetQuery : Query {
T Value;
};
+// Implements the exclusive 'set output dump|diag|print' options.
+struct SetExclusiveOutputQuery : Query {
+ SetExclusiveOutputQuery(bool QuerySession::*Var)
+ : Query(QK_SetOutputKind), Var(Var) {}
+ bool run(llvm::raw_ostream &OS, QuerySession &QS) const override {
+ QS.DiagOutput = false;
+ QS.DetailedASTOutput = false;
+ QS.PrintOutput = false;
+ QS.*Var = true;
+ return true;
+ }
+
+ static bool classof(const Query *Q) { return Q->Kind == QK_SetOutputKind; }
+
+ bool QuerySession::*Var;
+};
+
} // namespace query
} // namespace clang
diff --git a/clang-tools-extra/clang-query/QueryParser.cpp b/clang-tools-extra/clang-query/QueryParser.cpp
index eec32024945..b0dacea1004 100644
--- a/clang-tools-extra/clang-query/QueryParser.cpp
+++ b/clang-tools-extra/clang-query/QueryParser.cpp
@@ -119,7 +119,17 @@ QueryRef QueryParser::parseSetOutputKind() {
"expected 'diag', 'print', 'detailed-ast' or 'dump', got '" + ValStr +
"'");
}
- return new SetQuery<OutputKind>(&QuerySession::OutKind, OutputKind(OutKind));
+
+ switch (OutKind) {
+ case OK_DetailedAST:
+ return new SetExclusiveOutputQuery(&QuerySession::DetailedASTOutput);
+ case OK_Diag:
+ return new SetExclusiveOutputQuery(&QuerySession::DiagOutput);
+ case OK_Print:
+ return new SetExclusiveOutputQuery(&QuerySession::PrintOutput);
+ }
+
+ llvm_unreachable("Invalid output kind");
}
QueryRef QueryParser::endQuery(QueryRef Q) {
diff --git a/clang-tools-extra/clang-query/QuerySession.h b/clang-tools-extra/clang-query/QuerySession.h
index a211aa0f78c..62ecb545073 100644
--- a/clang-tools-extra/clang-query/QuerySession.h
+++ b/clang-tools-extra/clang-query/QuerySession.h
@@ -25,11 +25,16 @@ namespace query {
class QuerySession {
public:
QuerySession(llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs)
- : ASTs(ASTs), OutKind(OK_Diag), BindRoot(true), PrintMatcher(false),
+ : ASTs(ASTs), PrintOutput(false), DiagOutput(true),
+ DetailedASTOutput(false), BindRoot(true), PrintMatcher(false),
Terminate(false) {}
llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs;
- OutputKind OutKind;
+
+ bool PrintOutput;
+ bool DiagOutput;
+ bool DetailedASTOutput;
+
bool BindRoot;
bool PrintMatcher;
bool Terminate;
diff --git a/clang-tools-extra/unittests/clang-query/QueryEngineTest.cpp b/clang-tools-extra/unittests/clang-query/QueryEngineTest.cpp
index 411b84d4717..76489aada14 100644
--- a/clang-tools-extra/unittests/clang-query/QueryEngineTest.cpp
+++ b/clang-tools-extra/unittests/clang-query/QueryEngineTest.cpp
@@ -95,7 +95,7 @@ TEST_F(QueryEngineTest, Basic) {
Str.clear();
EXPECT_TRUE(
- SetQuery<OutputKind>(&QuerySession::OutKind, OK_Print).run(OS, S));
+ SetExclusiveOutputQuery(&QuerySession::PrintOutput).run(OS, S));
EXPECT_TRUE(MatchQuery(FooMatcherString, FooMatcher).run(OS, S));
EXPECT_TRUE(OS.str().find("Binding for \"root\":\nvoid foo1()") !=
@@ -104,7 +104,7 @@ TEST_F(QueryEngineTest, Basic) {
Str.clear();
EXPECT_TRUE(
- SetQuery<OutputKind>(&QuerySession::OutKind, OK_DetailedAST).run(OS, S));
+ SetExclusiveOutputQuery(&QuerySession::DetailedASTOutput).run(OS, S));
EXPECT_TRUE(MatchQuery(FooMatcherString, FooMatcher).run(OS, S));
EXPECT_TRUE(OS.str().find("FunctionDecl") != std::string::npos);
diff --git a/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp b/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
index 2d69349c8d2..0d1a8a1de19 100644
--- a/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
+++ b/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
@@ -83,14 +83,12 @@ TEST_F(QueryParserTest, Set) {
cast<InvalidQuery>(Q)->ErrStr);
Q = parse("set output dump");
- ASSERT_TRUE(isa<SetQuery<OutputKind> >(Q));
- EXPECT_EQ(&QuerySession::OutKind, cast<SetQuery<OutputKind> >(Q)->Var);
- EXPECT_EQ(OK_DetailedAST, cast<SetQuery<OutputKind>>(Q)->Value);
+ ASSERT_TRUE(isa<SetExclusiveOutputQuery >(Q));
+ EXPECT_EQ(&QuerySession::DetailedASTOutput, cast<SetExclusiveOutputQuery>(Q)->Var);
Q = parse("set output detailed-ast");
- ASSERT_TRUE(isa<SetQuery<OutputKind>>(Q));
- EXPECT_EQ(&QuerySession::OutKind, cast<SetQuery<OutputKind>>(Q)->Var);
- EXPECT_EQ(OK_DetailedAST, cast<SetQuery<OutputKind>>(Q)->Value);
+ ASSERT_TRUE(isa<SetExclusiveOutputQuery>(Q));
+ EXPECT_EQ(&QuerySession::DetailedASTOutput, cast<SetExclusiveOutputQuery>(Q)->Var);
Q = parse("set bind-root foo");
ASSERT_TRUE(isa<InvalidQuery>(Q));
OpenPOWER on IntegriCloud