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 &Map;
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