]> granicus.if.org Git - clang/commitdiff
Make use of ASTNode for return value of clang::ResolveLocationInAST() and in the...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 5 Jul 2009 22:21:40 +0000 (22:21 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 5 Jul 2009 22:21:40 +0000 (22:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74798 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/Utils.h
lib/Frontend/ResolveLocation.cpp
tools/index-test/index-test.cpp

index 77df60cd7210ae0d2ffda6e402f32c6a27a82ba1..7e7efbce578a8c7ea7c5ab9c27a5012e2042e4c9 100644 (file)
@@ -36,6 +36,7 @@ class Decl;
 class Stmt;
 class ASTContext;
 class SourceLocation;
+class ASTNode;
 
 /// ProcessWarningOptions - Initialize the diagnostic client and process the
 /// warning options specified on the command line.
@@ -102,8 +103,7 @@ void CacheTokens(Preprocessor& PP, llvm::raw_fd_ostream* OS);
 /// Pointing at '100' will return a <VarDecl 'foo', IntegerLiteral '100'> pair.
 /// Pointing at '++foo' will return a <FunctionDecl 'f', UnaryOperator> pair.
 ///
-std::pair<Decl *, Stmt *> ResolveLocationInAST(ASTContext &Ctx,
-                                               SourceLocation Loc);
+ASTNode ResolveLocationInAST(ASTContext &Ctx, SourceLocation Loc);
 
 }  // end namespace clang
 
index fd5cacf127e8933b7b277af341fef8b457dfcdf4..3dcd2143cbc97a0e4c809866463ec30c8b5204d5 100644 (file)
@@ -13,6 +13,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/Frontend/Utils.h"
+#include "clang/AST/ASTNode.h"
 #include "clang/AST/DeclVisitor.h"
 #include "clang/AST/StmtVisitor.h"
 #include "clang/Lex/Lexer.h"
@@ -313,12 +314,11 @@ void LocResolverBase::print(Stmt *Node) {
 
 /// \brief Returns the AST node that a source location points to.
 ///
-std::pair<Decl *, Stmt *>
-clang::ResolveLocationInAST(ASTContext &Ctx, SourceLocation Loc) {
+ASTNode clang::ResolveLocationInAST(ASTContext &Ctx, SourceLocation Loc) {
   if (Loc.isInvalid())
-    return std::make_pair((Decl*)0, (Stmt*)0);
+    return ASTNode();
   
   DeclLocResolver DLR(Ctx, Loc);
   DLR.Visit(Ctx.getTranslationUnitDecl());
-  return DLR.getResult();
+  return ASTNode(DLR.getDecl(), DLR.getStmt());
 }
index 552b7b01498aca391dd426b11fe7a969f25d056a..0fa0d5a466f6ed0f779c21ce6ba5fd5774451e31 100644 (file)
@@ -28,6 +28,7 @@
 #include "clang/Frontend/CommandLineSourceLoc.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/Stmt.h"
+#include "clang/AST/ASTNode.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/SourceManager.h"
 #include "llvm/ADT/STLExtras.h"
@@ -77,13 +78,7 @@ int main(int argc, char **argv) {
     return 1;
   }
 
-  struct ASTPoint {
-    Decl *D;
-    Stmt *Node;
-    ASTPoint() : D(0), Node(0) {}
-  };
-  
-  ASTPoint Point;
+  ASTNode Node;
 
   if (!PointAtLocation.empty()) {
     const std::string &Filename = PointAtLocation[0].FileName;
@@ -114,30 +109,31 @@ int main(int argc, char **argv) {
       return 1;
     }
     
-    llvm::tie(Point.D, Point.Node) =
-      ResolveLocationInAST(AST->getASTContext(), Loc);
-    if (Point.D == 0) {
+    Node = ResolveLocationInAST(AST->getASTContext(), Loc);
+    if (Node.isInvalid()) {
       llvm::errs() << "[" << InFile << "] Error: " <<
         "Couldn't resolve source location (no declaration found)\n";
       return 1;
     }
   }
   
-  if (Point.D) {
+  if (Node.isValid()) {
     llvm::raw_ostream &OS = llvm::outs();
-    OS << "Declaration node at point: " << Point.D->getDeclKindName() << " ";
-    if (NamedDecl *ND = dyn_cast<NamedDecl>(Point.D))
+    OS << "Declaration node at point: " << Node.getDecl()->getDeclKindName()
+       << " ";
+    if (NamedDecl *ND = dyn_cast<NamedDecl>(Node.getDecl()))
       OS << ND->getNameAsString();
     OS << "\n";
     
-    if (const char *Comment = AST->getASTContext().getCommentForDecl(Point.D))
+    if (const char *Comment =
+          AST->getASTContext().getCommentForDecl(Node.getDecl()))
       OS << "Comment associated with this declaration:\n" << Comment << "\n";
         
-    if (Point.Node) {
-      OS << "Statement node at point: " << Point.Node->getStmtClassName()
+    if (Node.getStmt()) {
+      OS << "Statement node at point: " << Node.getStmt()->getStmtClassName()
          << " ";
-      Point.Node->printPretty(OS, AST->getASTContext(), 0,
-                        PrintingPolicy(AST->getASTContext().getLangOptions()));
+      Node.getStmt()->printPretty(OS, AST->getASTContext(), 0,
+                         PrintingPolicy(AST->getASTContext().getLangOptions()));
       OS << "\n";
     }
   }