]> granicus.if.org Git - clang/commitdiff
Keep track of type references in DeclReferenceMap.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 29 Sep 2009 21:26:53 +0000 (21:26 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 29 Sep 2009 21:26:53 +0000 (21:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83111 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Index/ASTVisitor.h
lib/Index/DeclReferenceMap.cpp

index fe0db40d204bf346c19bdc4bc10efc2e5b9f5190..4da188809592017f1c3a663defdfbe999d95a850 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "clang/AST/DeclVisitor.h"
 #include "clang/AST/StmtVisitor.h"
+#include "clang/AST/TypeLoc.h"
 
 namespace clang {
 
@@ -24,7 +25,8 @@ namespace idx {
 /// \brief Traverses the full AST, both Decls and Stmts.
 template<typename ImplClass>
 class ASTVisitor : public DeclVisitor<ImplClass>,
-                   public StmtVisitor<ImplClass> {
+                   public StmtVisitor<ImplClass>,
+                   public TypeLocVisitor<ImplClass> {
 public:
   ASTVisitor() : CurrentDecl(0) { }
 
@@ -33,6 +35,7 @@ public:
   typedef ASTVisitor<ImplClass>  Base;
   typedef DeclVisitor<ImplClass> BaseDeclVisitor;
   typedef StmtVisitor<ImplClass> BaseStmtVisitor;
+  typedef TypeLocVisitor<ImplClass> BaseTypeLocVisitor;
 
   using BaseStmtVisitor::Visit;
 
@@ -46,6 +49,12 @@ public:
     BaseDeclVisitor::Visit(D);
     CurrentDecl = PrevDecl;
   }
+  
+  void VisitDeclaratorDecl(DeclaratorDecl *D) {
+    BaseDeclVisitor::VisitDeclaratorDecl(D);
+    if (DeclaratorInfo *DInfo = D->getDeclaratorInfo())
+      Visit(DInfo->getTypeLoc());
+  }
 
   void VisitFunctionDecl(FunctionDecl *D) {
     BaseDeclVisitor::VisitFunctionDecl(D);
@@ -104,6 +113,28 @@ public:
       if (*I)
         Visit(*I);
   }
+
+  //===--------------------------------------------------------------------===//
+  // TypeLocVisitor
+  //===--------------------------------------------------------------------===//
+  
+  void Visit(TypeLoc TL) {
+    for (; TL; TL = TL.getNextTypeLoc())
+      BaseTypeLocVisitor::Visit(TL);
+  }
+  
+  void VisitArrayLoc(ArrayLoc TL) {
+    BaseTypeLocVisitor::VisitArrayLoc(TL);
+    if (TL.getSizeExpr())
+      Visit(TL.getSizeExpr());
+  }
+  
+  void VisitFunctionLoc(FunctionLoc TL) {
+    BaseTypeLocVisitor::VisitFunctionLoc(TL);
+    for (unsigned i = 0; i != TL.getNumArgs(); ++i)
+      Visit(TL.getArg(i));
+  }
+
 };
 
 } // namespace idx
index 0aee2a40ecd1f2e1f27232f1d6e4cff36da98fda..0e48a369d5d9acddfdb98c366233d3e8f148e950 100644 (file)
@@ -30,6 +30,9 @@ public:
   void VisitDeclRefExpr(DeclRefExpr *Node);
   void VisitMemberExpr(MemberExpr *Node);
   void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
+  
+  void VisitTypedefLoc(TypedefLoc TL);
+  void VisitObjCInterfaceLoc(ObjCInterfaceLoc TL);
 };
 
 } // anonymous namespace
@@ -52,6 +55,16 @@ void RefMapper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
   Map.insert(std::make_pair(Node->getDecl(), ASTLocation(CurrentDecl, Node)));
 }
 
+void RefMapper::VisitTypedefLoc(TypedefLoc TL) {
+  NamedDecl *ND = TL.getTypedefDecl();
+  Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc())));
+}
+
+void RefMapper::VisitObjCInterfaceLoc(ObjCInterfaceLoc TL) {
+  NamedDecl *ND = TL.getIFaceDecl();
+  Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc())));
+}
+
 //===----------------------------------------------------------------------===//
 // DeclReferenceMap Implementation
 //===----------------------------------------------------------------------===//