blob: d6e30ab39658d4c4214bdc32ea1be16c96639890 [file] [log] [blame]
Chris Lattnerc3a65402009-07-12 22:33:12 +00001//===--- DeclReferenceMap.cpp - Map Decls to their references -------------===//
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Argyrios Kyrtzidis874012b2009-07-06 21:34:20 +000010// DeclReferenceMap creates a mapping from Decls to the ASTLocations that
11// reference them.
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000012//
13//===----------------------------------------------------------------------===//
14
Argyrios Kyrtzidisccbcb702009-07-06 21:34:47 +000015#include "clang/Index/DeclReferenceMap.h"
16#include "clang/Index/ASTLocation.h"
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000017#include "ASTVisitor.h"
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000018using namespace clang;
Argyrios Kyrtzidisccbcb702009-07-06 21:34:47 +000019using namespace idx;
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000020
21namespace {
22
Benjamin Kramer85b45212009-11-28 19:45:26 +000023class RefMapper : public ASTVisitor<RefMapper> {
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000024 DeclReferenceMap::MapTy &Map;
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000025
26public:
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000027 RefMapper(DeclReferenceMap::MapTy &map) : Map(map) { }
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000028
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000029 void VisitDeclRefExpr(DeclRefExpr *Node);
Argyrios Kyrtzidis9e6bc062009-07-14 03:18:09 +000030 void VisitMemberExpr(MemberExpr *Node);
Argyrios Kyrtzidis80ede1d2009-07-21 00:05:38 +000031 void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
Argyrios Kyrtzidisb1168842009-09-29 21:26:53 +000032
John McCall51bd8032009-10-18 01:05:36 +000033 void VisitTypedefTypeLoc(TypedefTypeLoc TL);
34 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL);
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000035};
36
37} // anonymous namespace
38
39//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000040// RefMapper Implementation
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000041//===----------------------------------------------------------------------===//
42
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000043void RefMapper::VisitDeclRefExpr(DeclRefExpr *Node) {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000044 NamedDecl *PrimD = cast<NamedDecl>(Node->getDecl()->getCanonicalDecl());
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000045 Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000046}
47
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000048void RefMapper::VisitMemberExpr(MemberExpr *Node) {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000049 NamedDecl *PrimD = cast<NamedDecl>(Node->getMemberDecl()->getCanonicalDecl());
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000050 Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis9e6bc062009-07-14 03:18:09 +000051}
52
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000053void RefMapper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
54 Map.insert(std::make_pair(Node->getDecl(), ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000055}
56
John McCall51bd8032009-10-18 01:05:36 +000057void RefMapper::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
Argyrios Kyrtzidisb1168842009-09-29 21:26:53 +000058 NamedDecl *ND = TL.getTypedefDecl();
59 Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc())));
60}
61
John McCall51bd8032009-10-18 01:05:36 +000062void RefMapper::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
Argyrios Kyrtzidisb1168842009-09-29 21:26:53 +000063 NamedDecl *ND = TL.getIFaceDecl();
64 Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc())));
65}
66
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000067//===----------------------------------------------------------------------===//
68// DeclReferenceMap Implementation
69//===----------------------------------------------------------------------===//
70
71DeclReferenceMap::DeclReferenceMap(ASTContext &Ctx) {
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000072 RefMapper(Map).Visit(Ctx.getTranslationUnitDecl());
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000073}
74
Argyrios Kyrtzidis874012b2009-07-06 21:34:20 +000075DeclReferenceMap::astlocation_iterator
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000076DeclReferenceMap::refs_begin(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000077 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000078 return astlocation_iterator(Map.lower_bound(Prim));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000079}
80
Argyrios Kyrtzidis874012b2009-07-06 21:34:20 +000081DeclReferenceMap::astlocation_iterator
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000082DeclReferenceMap::refs_end(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000083 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000084 return astlocation_iterator(Map.upper_bound(Prim));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000085}
86
87bool DeclReferenceMap::refs_empty(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000088 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000089 return refs_begin(Prim) == refs_end(Prim);
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000090}