1c3a6540f174ac61a884e452456cbad88b427a745Chris Lattner//===--- DeclReferenceMap.cpp - Map Decls to their references -------------===// 22c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// 32c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 42c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// 52c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 62c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 72c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// 82c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 92c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// 10874012b1fb80dff2ec227c726a0c63d55e3db63fArgyrios Kyrtzidis// DeclReferenceMap creates a mapping from Decls to the ASTLocations that 11874012b1fb80dff2ec227c726a0c63d55e3db63fArgyrios Kyrtzidis// reference them. 122c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// 132c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 142c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 15ccbcb70ee96cb67ed6c8b4142d050f3a6764edd7Argyrios Kyrtzidis#include "clang/Index/DeclReferenceMap.h" 16ccbcb70ee96cb67ed6c8b4142d050f3a6764edd7Argyrios Kyrtzidis#include "clang/Index/ASTLocation.h" 1781e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidis#include "ASTVisitor.h" 182c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidisusing namespace clang; 19ccbcb70ee96cb67ed6c8b4142d050f3a6764edd7Argyrios Kyrtzidisusing namespace idx; 202c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 212c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidisnamespace { 222c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 2385b4521e34dcd4a0a4a1f0819e1123128e5a3125Benjamin Kramerclass RefMapper : public ASTVisitor<RefMapper> { 242c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis DeclReferenceMap::MapTy ⤅ 252c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 262c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidispublic: 2781e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidis RefMapper(DeclReferenceMap::MapTy &map) : Map(map) { } 282c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 292c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis void VisitDeclRefExpr(DeclRefExpr *Node); 309e6bc0657e3e1b6ec0462620b59d1441195bedc8Argyrios Kyrtzidis void VisitMemberExpr(MemberExpr *Node); 3180ede1d7148582b7647d7cbe09c86e3305976839Argyrios Kyrtzidis void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node); 32b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis 3351bd803fbdade51d674598ed45da3d54190a656cJohn McCall void VisitTypedefTypeLoc(TypedefTypeLoc TL); 3451bd803fbdade51d674598ed45da3d54190a656cJohn McCall void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL); 352c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis}; 362c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 372c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} // anonymous namespace 382c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 392c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 4081e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidis// RefMapper Implementation 412c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 422c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 4381e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidisvoid RefMapper::VisitDeclRefExpr(DeclRefExpr *Node) { 44b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis NamedDecl *PrimD = cast<NamedDecl>(Node->getDecl()->getCanonicalDecl()); 4581e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidis Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node))); 462c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} 472c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 4881e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidisvoid RefMapper::VisitMemberExpr(MemberExpr *Node) { 49b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis NamedDecl *PrimD = cast<NamedDecl>(Node->getMemberDecl()->getCanonicalDecl()); 5081e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidis Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node))); 512c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} 522c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 5381e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidisvoid RefMapper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 5481e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidis Map.insert(std::make_pair(Node->getDecl(), ASTLocation(CurrentDecl, Node))); 552c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} 562c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 5751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid RefMapper::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 58162e1c1b487352434552147967c3dd296ebee2f7Richard Smith NamedDecl *ND = TL.getTypedefNameDecl(); 59b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc()))); 60b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis} 61b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis 6251bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid RefMapper::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 63b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis NamedDecl *ND = TL.getIFaceDecl(); 64b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc()))); 65b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis} 66b11688485a696a31136bb2e63fc8739c945178a3Argyrios Kyrtzidis 672c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 682c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis// DeclReferenceMap Implementation 692c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 702c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 712c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios KyrtzidisDeclReferenceMap::DeclReferenceMap(ASTContext &Ctx) { 7281e84560c85c5d3727072f5b9e8bd2a963adf8e7Argyrios Kyrtzidis RefMapper(Map).Visit(Ctx.getTranslationUnitDecl()); 732c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} 742c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 75874012b1fb80dff2ec227c726a0c63d55e3db63fArgyrios KyrtzidisDeclReferenceMap::astlocation_iterator 762c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios KyrtzidisDeclReferenceMap::refs_begin(NamedDecl *D) const { 77b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl()); 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return astlocation_iterator(Map.lower_bound(Prim)); 792c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} 802c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 81874012b1fb80dff2ec227c726a0c63d55e3db63fArgyrios KyrtzidisDeclReferenceMap::astlocation_iterator 822c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios KyrtzidisDeclReferenceMap::refs_end(NamedDecl *D) const { 83b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl()); 841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return astlocation_iterator(Map.upper_bound(Prim)); 852c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} 862c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis 872c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidisbool DeclReferenceMap::refs_empty(NamedDecl *D) const { 88b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl()); 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return refs_begin(Prim) == refs_end(Prim); 902c2ba3e258961dd98cacffe3a2167bb6d958fd53Argyrios Kyrtzidis} 91