[PATCH] D101365: [clang-query] Add check to prevent setting srcloc when no introspection is available.

2021-04-28 Thread Nathan James via Phabricator via cfe-commits
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(Q));
   EXPECT_EQ("expected variable name", cast(Q)->ErrStr);
@@ -69,8 +72,13 @@
 
   Q = parse("set output");
   ASSERT_TRUE(isa(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
-cast(Q)->ErrStr);
+  if (HasIntrospection)
+EXPECT_EQ(
+"expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', got ''",
+cast(Q)->ErrStr);
+  else
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
+  cast(Q)->ErrStr);
 
   Q = parse("set bind-root true foo");
   ASSERT_TRUE(isa(Q));
@@ -78,8 +86,13 @@
 
   Q = parse("set output foo");
   ASSERT_TRUE(isa(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
-cast(Q)->ErrStr);
+  if (HasIntrospection)
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', "
+  "got 'foo'",
+  cast(Q)->ErrStr);
+  else
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
+  cast(Q)->ErrStr);
 
   Q = parse("set output dump");
   ASSERT_TRUE(isa(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 
@@ -104,17 +105,19 @@
 
 template  QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord(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(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'" +
+

[PATCH] D101365: [clang-query] Add check to prevent setting srcloc when no introspection is available.

2021-04-27 Thread Nathan James via Phabricator via cfe-commits
njames93 updated this revision to Diff 341021.
njames93 added a comment.

Nit.


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(Q));
   EXPECT_EQ("expected variable name", cast(Q)->ErrStr);
@@ -69,8 +72,13 @@
 
   Q = parse("set output");
   ASSERT_TRUE(isa(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
-cast(Q)->ErrStr);
+  if (HasIntrospection)
+EXPECT_EQ(
+"expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', got ''",
+cast(Q)->ErrStr);
+  else
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
+  cast(Q)->ErrStr);
 
   Q = parse("set bind-root true foo");
   ASSERT_TRUE(isa(Q));
@@ -78,8 +86,13 @@
 
   Q = parse("set output foo");
   ASSERT_TRUE(isa(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
-cast(Q)->ErrStr);
+  if (HasIntrospection)
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', "
+  "got 'foo'",
+  cast(Q)->ErrStr);
+  else
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
+  cast(Q)->ErrStr);
 
   Q = parse("set output dump");
   ASSERT_TRUE(isa(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 
@@ -104,17 +105,19 @@
 
 template  QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord(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(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 + "'");
   }
 
 

[PATCH] D101365: [clang-query] Add check to prevent setting srcloc when no introspection is available.

2021-04-27 Thread Stephen Kelly via Phabricator via cfe-commits
steveire accepted this revision.
steveire added a comment.
This revision is now accepted and ready to land.

LGTM!




Comment at: clang-tools-extra/unittests/clang-query/QueryParserTest.cpp:249
+  EXPECT_EQ("dump ", Comps[3 + static_cast(HasIntrospection)].TypedText);
+  EXPECT_EQ("dump", Comps[3 + static_cast(HasIntrospection)].DisplayText);
 

nit: I think `HasIntrospection ? 4 : 3` would be clearer.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D101365

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101365: [clang-query] Add check to prevent setting srcloc when no introspection is available.

2021-04-27 Thread Nathan James via Phabricator via cfe-commits
njames93 updated this revision to Diff 340902.
njames93 added a comment.

Fix up tests(probably, see what premerge says)


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(Q));
   EXPECT_EQ("expected variable name", cast(Q)->ErrStr);
@@ -69,8 +72,13 @@
 
   Q = parse("set output");
   ASSERT_TRUE(isa(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
-cast(Q)->ErrStr);
+  if (HasIntrospection)
+EXPECT_EQ(
+"expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', got ''",
+cast(Q)->ErrStr);
+  else
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got ''",
+  cast(Q)->ErrStr);
 
   Q = parse("set bind-root true foo");
   ASSERT_TRUE(isa(Q));
@@ -78,8 +86,13 @@
 
   Q = parse("set output foo");
   ASSERT_TRUE(isa(Q));
-  EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
-cast(Q)->ErrStr);
+  if (HasIntrospection)
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast', 'srcloc' or 'dump', "
+  "got 'foo'",
+  cast(Q)->ErrStr);
+  else
+EXPECT_EQ("expected 'diag', 'print', 'detailed-ast' or 'dump', got 'foo'",
+  cast(Q)->ErrStr);
 
   Q = parse("set output dump");
   ASSERT_TRUE(isa(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[3 + static_cast(HasIntrospection)].TypedText);
+  EXPECT_EQ("dump", Comps[3 + static_cast(HasIntrospection)].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 
@@ -104,17 +105,19 @@
 
 template  QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord(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(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'" : "") +
+ 

[PATCH] D101365: [clang-query] Add check to prevent setting srcloc when no introspection is available.

2021-04-27 Thread Nathan James via Phabricator via cfe-commits
njames93 updated this revision to Diff 340835.
njames93 added a comment.

Cleanup.


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/QueryParser.cpp


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 
@@ -104,17 +105,19 @@
 
 template  QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord(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(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(::PrintOutput);
   case OK_SrcLoc:
-return new QueryType(::SrcLocOutput);
+if (HasIntrospection)
+  return new QueryType(::SrcLocOutput);
+return new InvalidQuery("'srcloc' output support is not available.");
   }
 
   llvm_unreachable("Invalid output kind");


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 
@@ -104,17 +105,19 @@
 
 template  QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord(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(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(::PrintOutput);
   case OK_SrcLoc:
-return new QueryType(::SrcLocOutput);
+if (HasIntrospection)
+  return new QueryType(::SrcLocOutput);
+return new InvalidQuery("'srcloc' output support is not available.");
   }
 
   llvm_unreachable("Invalid output kind");
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101365: [clang-query] Add check to prevent setting srcloc when no introspection is available.

2021-04-27 Thread Nathan James via Phabricator via cfe-commits
njames93 created this revision.
njames93 added reviewers: steveire, aaron.ballman.
njames93 requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

Checks if introspection support is available set output kind parser.
If it isn't present the auto complete will not suggest `srcloc` and an error 
query will be reported if a user tries to access it.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101365

Files:
  clang-tools-extra/clang-query/QueryParser.cpp


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 
@@ -104,17 +105,23 @@
 
 template  QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord(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);
+  unsigned OutKind =
+  LexOrCompleteWord(this, ValStr)
+  .Case("diag", OK_Diag)
+  .Case("print", OK_Print)
+  .Case("detailed-ast", OK_DetailedAST)
+  .Case("srcloc", OK_SrcLoc,
+/*IsCompletion=*/
+tooling::NodeIntrospection::hasIntrospectionSupport())
+  .Case("dump", OK_DetailedAST)
+  .Default(~0u);
   if (OutKind == ~0u) {
 return new InvalidQuery(
-"expected 'diag', 'print', 'detailed-ast' or 'dump', got '" + ValStr +
-"'");
+"expected 'diag', 'print', 'detailed-ast'" +
+StringRef(tooling::NodeIntrospection::hasIntrospectionSupport()
+  ? ", 'srcloc'"
+  : "") +
+" or 'dump', got '" + ValStr + "'");
   }
 
   switch (OutKind) {
@@ -125,7 +132,9 @@
   case OK_Print:
 return new QueryType(::PrintOutput);
   case OK_SrcLoc:
-return new QueryType(::SrcLocOutput);
+if (tooling::NodeIntrospection::hasIntrospectionSupport())
+  return new QueryType(::SrcLocOutput);
+return new InvalidQuery("'srcloc' output support is not available.");
   }
 
   llvm_unreachable("Invalid output kind");


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 
@@ -104,17 +105,23 @@
 
 template  QueryRef QueryParser::parseSetOutputKind() {
   StringRef ValStr;
-  unsigned OutKind = LexOrCompleteWord(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);
+  unsigned OutKind =
+  LexOrCompleteWord(this, ValStr)
+  .Case("diag", OK_Diag)
+  .Case("print", OK_Print)
+  .Case("detailed-ast", OK_DetailedAST)
+  .Case("srcloc", OK_SrcLoc,
+/*IsCompletion=*/
+tooling::NodeIntrospection::hasIntrospectionSupport())
+  .Case("dump", OK_DetailedAST)
+  .Default(~0u);
   if (OutKind == ~0u) {
 return new InvalidQuery(
-"expected 'diag', 'print', 'detailed-ast' or 'dump', got '" + ValStr +
-"'");
+"expected 'diag', 'print', 'detailed-ast'" +
+StringRef(tooling::NodeIntrospection::hasIntrospectionSupport()
+  ? ", 'srcloc'"
+  : "") +
+" or 'dump', got '" + ValStr + "'");
   }
 
   switch (OutKind) {
@@ -125,7 +132,9 @@
   case OK_Print:
 return new QueryType(::PrintOutput);
   case OK_SrcLoc:
-return new QueryType(::SrcLocOutput);
+if (tooling::NodeIntrospection::hasIntrospectionSupport())
+  return new QueryType(::SrcLocOutput);
+return new InvalidQuery("'srcloc' output support is not available.");
   }
 
   llvm_unreachable("Invalid output kind");
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits