steveire updated this revision to Diff 336690.
steveire added a comment.

Update


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D93325

Files:
  clang-tools-extra/clang-query/CMakeLists.txt
  clang-tools-extra/clang-query/Query.cpp
  clang-tools-extra/clang-query/Query.h
  clang-tools-extra/clang-query/QueryParser.cpp
  clang-tools-extra/clang-query/QuerySession.h
  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
@@ -218,7 +218,7 @@
   EXPECT_EQ("output", Comps[0].DisplayText);
 
   Comps = QueryParser::complete("enable output ", 14, QS);
-  ASSERT_EQ(4u, Comps.size());
+  ASSERT_EQ(5u, Comps.size());
 
   EXPECT_EQ("diag ", Comps[0].TypedText);
   EXPECT_EQ("diag", Comps[0].DisplayText);
@@ -226,8 +226,10 @@
   EXPECT_EQ("print", Comps[1].DisplayText);
   EXPECT_EQ("detailed-ast ", Comps[2].TypedText);
   EXPECT_EQ("detailed-ast", Comps[2].DisplayText);
-  EXPECT_EQ("dump ", Comps[3].TypedText);
-  EXPECT_EQ("dump", Comps[3].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);
 
   Comps = QueryParser::complete("set traversal ", 14, QS);
   ASSERT_EQ(2u, Comps.size());
Index: clang-tools-extra/clang-query/QuerySession.h
===================================================================
--- clang-tools-extra/clang-query/QuerySession.h
+++ clang-tools-extra/clang-query/QuerySession.h
@@ -25,14 +25,15 @@
 public:
   QuerySession(llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs)
       : ASTs(ASTs), PrintOutput(false), DiagOutput(true),
-        DetailedASTOutput(false), BindRoot(true), PrintMatcher(false),
-        Terminate(false), TK(TK_AsIs) {}
+        DetailedASTOutput(false), SrcLocOutput(false), BindRoot(true),
+        PrintMatcher(false), Terminate(false), TK(TK_AsIs) {}
 
   llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs;
 
   bool PrintOutput;
   bool DiagOutput;
   bool DetailedASTOutput;
+  bool SrcLocOutput;
 
   bool BindRoot;
   bool PrintMatcher;
Index: clang-tools-extra/clang-query/QueryParser.cpp
===================================================================
--- clang-tools-extra/clang-query/QueryParser.cpp
+++ clang-tools-extra/clang-query/QueryParser.cpp
@@ -108,6 +108,7 @@
                          .Case("diag", OK_Diag)
                          .Case("print", OK_Print)
                          .Case("detailed-ast", OK_DetailedAST)
+                         .Case("srcloc", OK_SrcLoc)
                          .Case("dump", OK_DetailedAST)
                          .Default(~0u);
   if (OutKind == ~0u) {
@@ -123,6 +124,8 @@
     return new QueryType(&QuerySession::DiagOutput);
   case OK_Print:
     return new QueryType(&QuerySession::PrintOutput);
+  case OK_SrcLoc:
+    return new QueryType(&QuerySession::SrcLocOutput);
   }
 
   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
@@ -18,7 +18,7 @@
 namespace clang {
 namespace query {
 
-enum OutputKind { OK_Diag, OK_Print, OK_DetailedAST };
+enum OutputKind { OK_Diag, OK_Print, OK_DetailedAST, OK_SrcLoc };
 
 enum QueryKind {
   QK_Invalid,
Index: clang-tools-extra/clang-query/Query.cpp
===================================================================
--- clang-tools-extra/clang-query/Query.cpp
+++ clang-tools-extra/clang-query/Query.cpp
@@ -12,6 +12,7 @@
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Frontend/ASTUnit.h"
 #include "clang/Frontend/TextDiagnostic.h"
+#include "clang/Tooling/NodeIntrospection.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace clang::ast_matchers;
@@ -66,6 +67,8 @@
         "Diagnostic location for bound nodes.\n"
         "  detailed-ast                      "
         "Detailed AST output for bound nodes.\n"
+        "  srcloc                            "
+        "Source locations and ranges for bound nodes.\n"
         "  dump                              "
         "Detailed AST output for bound nodes (alias of detailed-ast).\n\n";
   return true;
@@ -86,6 +89,88 @@
   }
 };
 
+void dumpLocations(llvm::raw_ostream &OS, DynTypedNode Node, ASTContext &Ctx,
+                   const DiagnosticsEngine &Diags, SourceManager const &SM) {
+  auto Locs = clang::tooling::NodeIntrospection::GetLocations(Node);
+
+  auto printLocations = [](auto &OS, auto Iter, auto End) {
+    auto CommonEntry = Iter->first;
+    auto Scout = Iter;
+    while (Scout->first == CommonEntry) {
+      OS << " * "
+         << "\"" +
+                tooling::LocationCallFormatterCpp::format(Iter->second.get()) +
+                "\"\n";
+      if (Scout == End)
+        break;
+      ++Scout;
+      if (Scout->first == CommonEntry) {
+        ++Iter;
+      }
+    }
+  };
+
+  for (auto Iter = Locs.LocationAccessors.begin();
+       Iter != Locs.LocationAccessors.end(); ++Iter) {
+    if (!Iter->first.isValid())
+      continue;
+
+    TextDiagnostic TD(OS, Ctx.getLangOpts(), &Diags.getDiagnosticOptions());
+    TD.emitDiagnostic(FullSourceLoc(Iter->first, SM), DiagnosticsEngine::Note,
+                      "source locations here", None, None);
+
+    printLocations(OS, Iter, Locs.LocationAccessors.end());
+    OS << '\n';
+  }
+
+  for (auto Iter = Locs.RangeAccessors.begin();
+       Iter != Locs.RangeAccessors.end(); ++Iter) {
+
+    if (!Iter->first.getBegin().isValid())
+      continue;
+
+    if (SM.getPresumedLineNumber(Iter->first.getBegin()) !=
+        SM.getPresumedLineNumber(Iter->first.getEnd()))
+      continue;
+
+    TextDiagnostic TD(OS, Ctx.getLangOpts(), &Diags.getDiagnosticOptions());
+    TD.emitDiagnostic(FullSourceLoc(Iter->first.getBegin(), SM),
+                      DiagnosticsEngine::Note,
+                      "source ranges here " + Iter->first.printToString(SM),
+                      CharSourceRange::getTokenRange(Iter->first), None);
+
+    printLocations(OS, Iter, Locs.RangeAccessors.end());
+  }
+  for (auto Iter = Locs.RangeAccessors.begin();
+       Iter != Locs.RangeAccessors.end(); ++Iter) {
+
+    if (!Iter->first.getBegin().isValid())
+      continue;
+
+    if (SM.getPresumedLineNumber(Iter->first.getBegin()) ==
+        SM.getPresumedLineNumber(Iter->first.getEnd()))
+      continue;
+
+    TextDiagnostic TD(OS, Ctx.getLangOpts(), &Diags.getDiagnosticOptions());
+    TD.emitDiagnostic(
+        FullSourceLoc(Iter->first.getBegin(), SM), DiagnosticsEngine::Note,
+        "source range " + Iter->first.printToString(SM) + " starting here...",
+        CharSourceRange::getTokenRange(Iter->first), None);
+
+    auto ColNum = SM.getPresumedColumnNumber(Iter->first.getEnd());
+    auto LastLineLoc = Iter->first.getEnd().getLocWithOffset(-(ColNum - 1));
+
+    TD.emitDiagnostic(FullSourceLoc(Iter->first.getEnd(), SM),
+                      DiagnosticsEngine::Note, "... ending here",
+                      CharSourceRange::getTokenRange(
+                          SourceRange(LastLineLoc, Iter->first.getEnd())),
+                      None);
+
+    printLocations(OS, Iter, Locs.RangeAccessors.end());
+  }
+  OS << "\n";
+}
+
 } // namespace
 
 bool MatchQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const {
@@ -106,8 +191,10 @@
       return false;
     }
 
-    AST->getASTContext().getParentMapContext().setTraversalKind(QS.TK);
-    Finder.matchAST(AST->getASTContext());
+    auto &Ctx = AST->getASTContext();
+    const auto &SM = Ctx.getSourceManager();
+    Ctx.getParentMapContext().setTraversalKind(QS.TK);
+    Finder.matchAST(Ctx);
 
     if (QS.PrintMatcher) {
       SmallVector<StringRef, 4> Lines;
@@ -159,6 +246,13 @@
           Dumper.Visit(BI->second);
           OS << "\n";
         }
+        if (QS.SrcLocOutput) {
+          OS << "\n  \"" << BI->first << "\" Source locations\n";
+          OS << "  " << std::string(19 + BI->first.size(), '-') << '\n';
+
+          dumpLocations(OS, BI->second, Ctx, AST->getDiagnostics(), SM);
+          OS << "\n";
+        }
       }
 
       if (MI->getMap().empty())
Index: clang-tools-extra/clang-query/CMakeLists.txt
===================================================================
--- clang-tools-extra/clang-query/CMakeLists.txt
+++ clang-tools-extra/clang-query/CMakeLists.txt
@@ -19,6 +19,7 @@
   clangBasic
   clangDynamicASTMatchers
   clangFrontend
+  clangTooling
   clangSerialization
   )
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to