diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2009-10-14 18:03:49 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2009-10-14 18:03:49 +0000 |
commit | 9092c3e0fa01f3139b016d05d267a89e3b07747a (patch) | |
tree | 137ebebcae16fb0ce7ab4af456992bbd8d22fced /lib/Index/DeclReferenceMap.cpp | |
parent | 4981926bf654fe5a2c3893f24ca44106b217e71e (diff) | |
download | FreeBSD-src-9092c3e0fa01f3139b016d05d267a89e3b07747a.zip FreeBSD-src-9092c3e0fa01f3139b016d05d267a89e3b07747a.tar.gz |
Update clang to r84119.
Diffstat (limited to 'lib/Index/DeclReferenceMap.cpp')
-rw-r--r-- | lib/Index/DeclReferenceMap.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/lib/Index/DeclReferenceMap.cpp b/lib/Index/DeclReferenceMap.cpp new file mode 100644 index 0000000..0e48a36 --- /dev/null +++ b/lib/Index/DeclReferenceMap.cpp @@ -0,0 +1,91 @@ +//===--- DeclReferenceMap.cpp - Map Decls to their references -------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// DeclReferenceMap creates a mapping from Decls to the ASTLocations that +// reference them. +// +//===----------------------------------------------------------------------===// + +#include "clang/Index/DeclReferenceMap.h" +#include "clang/Index/ASTLocation.h" +#include "ASTVisitor.h" +#include "llvm/Support/Compiler.h" +using namespace clang; +using namespace idx; + +namespace { + +class VISIBILITY_HIDDEN RefMapper : public ASTVisitor<RefMapper> { + DeclReferenceMap::MapTy ⤅ + +public: + RefMapper(DeclReferenceMap::MapTy &map) : Map(map) { } + + void VisitDeclRefExpr(DeclRefExpr *Node); + void VisitMemberExpr(MemberExpr *Node); + void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node); + + void VisitTypedefLoc(TypedefLoc TL); + void VisitObjCInterfaceLoc(ObjCInterfaceLoc TL); +}; + +} // anonymous namespace + +//===----------------------------------------------------------------------===// +// RefMapper Implementation +//===----------------------------------------------------------------------===// + +void RefMapper::VisitDeclRefExpr(DeclRefExpr *Node) { + NamedDecl *PrimD = cast<NamedDecl>(Node->getDecl()->getCanonicalDecl()); + Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node))); +} + +void RefMapper::VisitMemberExpr(MemberExpr *Node) { + NamedDecl *PrimD = cast<NamedDecl>(Node->getMemberDecl()->getCanonicalDecl()); + Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node))); +} + +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 +//===----------------------------------------------------------------------===// + +DeclReferenceMap::DeclReferenceMap(ASTContext &Ctx) { + RefMapper(Map).Visit(Ctx.getTranslationUnitDecl()); +} + +DeclReferenceMap::astlocation_iterator +DeclReferenceMap::refs_begin(NamedDecl *D) const { + NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl()); + return astlocation_iterator(Map.lower_bound(Prim)); +} + +DeclReferenceMap::astlocation_iterator +DeclReferenceMap::refs_end(NamedDecl *D) const { + NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl()); + return astlocation_iterator(Map.upper_bound(Prim)); +} + +bool DeclReferenceMap::refs_empty(NamedDecl *D) const { + NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl()); + return refs_begin(Prim) == refs_end(Prim); +} |