This revision was automatically updated to reflect the committed changes.
Closed by commit rG858a9583e1fe: [clang-query] Add check to prevent setting 
srcloc when no introspection is… (authored by njames93).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101365/new/

https://reviews.llvm.org/D101365

Files:
  clang-tools-extra/clang-query/Query.h
  clang-tools-extra/clang-query/QueryParser.cpp
  clang-tools-extra/unittests/clang-query/QueryParserTest.cpp

Index: clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
===================================================================
--- clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
+++ clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
@@ -9,6 +9,7 @@
 #include "QueryParser.h"
 #include "Query.h"
 #include "QuerySession.h"
+#include "clang/Tooling/NodeIntrospection.h"
 #include "llvm/LineEditor/LineEditor.h"
 #include "gtest/gtest.h"
 
@@ -59,6 +60,8 @@
 }
 
 TEST_F(QueryParserTest, Set) {
+
+  bool HasIntrospection = tooling::NodeIntrospection::hasIntrospectionSupport();
   QueryRef Q = parse("set");
   ASSERT_TRUE(isa<InvalidQuery>(Q));
   EXPECT_EQ("expected variable name", cast<InvalidQuery>(Q)->ErrStr);
@@ -69,8 +72,13 @@
 
   Q = parse("set output");
   ASSERT_TRUE(isa<InvalidQuery>(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
-            cast<InvalidQuery>(Q)->ErrStr);
+  if (HasIntrospection)
+    EXPECT_EQ(
+        "expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', got ''",
+        cast<InvalidQuery>(Q)->ErrStr);
+  else
+    EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
+              cast<InvalidQuery>(Q)->ErrStr);
 
   Q = parse("set bind-root true foo");
   ASSERT_TRUE(isa<InvalidQuery>(Q));
@@ -78,8 +86,13 @@
 
   Q = parse("set output foo");
   ASSERT_TRUE(isa<InvalidQuery>(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
-            cast<InvalidQuery>(Q)->ErrStr);
+  if (HasIntrospection)
+    EXPECT_EQ("expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', "
+              "got 'foo'",
+              cast<InvalidQuery>(Q)->ErrStr);
+  else
+    EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
+              cast<InvalidQuery>(Q)->ErrStr);
 
   Q = parse("set output dump");
   ASSERT_TRUE(isa<SetExclusiveOutputQuery >(Q));
@@ -217,8 +230,10 @@
   EXPECT_EQ("output ", Comps[0].TypedText);
   EXPECT_EQ("output", Comps[0].DisplayText);
 
+  bool HasIntrospection = tooling::NodeIntrospection::hasIntrospectionSupport();
+
   Comps = QueryParser::complete("enable output ", 14, QS);
-  ASSERT_EQ(5u, Comps.size());
+  ASSERT_EQ(HasIntrospection ? 5u : 4u, Comps.size());
 
   EXPECT_EQ("diag ", Comps[0].TypedText);
   EXPECT_EQ("diag", Comps[0].DisplayText);
@@ -226,10 +241,12 @@
   EXPECT_EQ("print", Comps[1].DisplayText);
   EXPECT_EQ("detailed-ast ", Comps[2].TypedText);
   EXPECT_EQ("detailed-ast", Comps[2].DisplayText);
-  EXPECT_EQ("srcloc ", Comps[3].TypedText);
-  EXPECT_EQ("srcloc", Comps[3].DisplayText);
-  EXPECT_EQ("dump ", Comps[4].TypedText);
-  EXPECT_EQ("dump", Comps[4].DisplayText);
+  if (HasIntrospection) {
+    EXPECT_EQ("srcloc ", Comps[3].TypedText);
+    EXPECT_EQ("srcloc", Comps[3].DisplayText);
+  }
+  EXPECT_EQ("dump ", Comps[HasIntrospection ? 4 : 3].TypedText);
+  EXPECT_EQ("dump", Comps[HasIntrospection ? 4 : 3].DisplayText);
 
   Comps = QueryParser::complete("set traversal ", 14, QS);
   ASSERT_EQ(2u, Comps.size());
Index: clang-tools-extra/clang-query/QueryParser.cpp
===================================================================
--- clang-tools-extra/clang-query/QueryParser.cpp
+++ clang-tools-extra/clang-query/QueryParser.cpp
@@ -11,6 +11,7 @@
 #include "QuerySession.h"
 #include "clang/ASTMatchers/Dynamic/Parser.h"
 #include "clang/Basic/CharInfo.h"
+#include "clang/Tooling/NodeIntrospection.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include <set>
@@ -104,17 +105,19 @@
 
 template <typename QueryType> QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord<unsigned>(this, ValStr)
-                         .Case("diag", OK_Diag)
-                         .Case("print", OK_Print)
-                         .Case("detailed-ast", OK_DetailedAST)
-                         .Case("srcloc", OK_SrcLoc)
-                         .Case("dump", OK_DetailedAST)
-                         .Default(~0u);
+  bool HasIntrospection = tooling::NodeIntrospection::hasIntrospectionSupport();
+  unsigned OutKind =
+      LexOrCompleteWord<unsigned>(this, ValStr)
+          .Case("diag", OK_Diag)
+          .Case("print", OK_Print)
+          .Case("detailed-ast", OK_DetailedAST)
+          .Case("srcloc", OK_SrcLoc, /*IsCompletion=*/HasIntrospection)
+          .Case("dump", OK_DetailedAST)
+          .Default(~0u);
   if (OutKind == ~0u) {
-    return new InvalidQuery(
-        "expected 'diag', 'print', 'detailed-ast' or 'dump', got '" + ValStr +
-        "'");
+    return new InvalidQuery("expected 'diag', 'print', 'detailed-ast'" +
+                            StringRef(HasIntrospection ? ", 'srcloc'" : "") +
+                            " or 'dump', got '" + ValStr + "'");
   }
 
   switch (OutKind) {
@@ -125,7 +128,9 @@
   case OK_Print:
     return new QueryType(&QuerySession::PrintOutput);
   case OK_SrcLoc:
-    return new QueryType(&QuerySession::SrcLocOutput);
+    if (HasIntrospection)
+      return new QueryType(&QuerySession::SrcLocOutput);
+    return new InvalidQuery("'srcloc' output support is not available.");
   }
 
   llvm_unreachable("Invalid output kind");
Index: clang-tools-extra/clang-query/Query.h
===================================================================
--- clang-tools-extra/clang-query/Query.h
+++ clang-tools-extra/clang-query/Query.h
@@ -149,6 +149,7 @@
     QS.DiagOutput = false;
     QS.DetailedASTOutput = false;
     QS.PrintOutput = false;
+    QS.SrcLocOutput = false;
     QS.*Var = true;
     return true;
   }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to