blob: 366cf1b10830734f382bd33e11d4c23d9e539a74 [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 +000018#include "llvm/Support/Compiler.h"
19using namespace clang;
Argyrios Kyrtzidisccbcb702009-07-06 21:34:47 +000020using namespace idx;
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000021
22namespace {
23
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000024class VISIBILITY_HIDDEN RefMapper : public ASTVisitor<RefMapper> {
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000025 DeclReferenceMap::MapTy &Map;
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000026
27public:
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000028 RefMapper(DeclReferenceMap::MapTy &map) : Map(map) { }
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000029
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000030 void VisitDeclRefExpr(DeclRefExpr *Node);
Argyrios Kyrtzidis9e6bc062009-07-14 03:18:09 +000031 void VisitMemberExpr(MemberExpr *Node);
Argyrios Kyrtzidis80ede1d2009-07-21 00:05:38 +000032 void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
Argyrios Kyrtzidisb1168842009-09-29 21:26:53 +000033
John McCall51bd8032009-10-18 01:05:36 +000034 void VisitTypedefTypeLoc(TypedefTypeLoc TL);
35 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL);
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000036};
37
38} // anonymous namespace
39
40//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000041// RefMapper Implementation
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000042//===----------------------------------------------------------------------===//
43
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000044void RefMapper::VisitDeclRefExpr(DeclRefExpr *Node) {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000045 NamedDecl *PrimD = cast<NamedDecl>(Node->getDecl()->getCanonicalDecl());
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000046 Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000047}
48
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000049void RefMapper::VisitMemberExpr(MemberExpr *Node) {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000050 NamedDecl *PrimD = cast<NamedDecl>(Node->getMemberDecl()->getCanonicalDecl());
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000051 Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis9e6bc062009-07-14 03:18:09 +000052}
53
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000054void RefMapper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
55 Map.insert(std::make_pair(Node->getDecl(), ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000056}
57
John McCall51bd8032009-10-18 01:05:36 +000058void RefMapper::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
Argyrios Kyrtzidisb1168842009-09-29 21:26:53 +000059 NamedDecl *ND = TL.getTypedefDecl();
60 Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc())));
61}
62
John McCall51bd8032009-10-18 01:05:36 +000063void RefMapper::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
Argyrios Kyrtzidisb1168842009-09-29 21:26:53 +000064 NamedDecl *ND = TL.getIFaceDecl();
65 Map.insert(std::make_pair(ND, ASTLocation(CurrentDecl, ND, TL.getNameLoc())));
66}
67
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000068//===----------------------------------------------------------------------===//
69// DeclReferenceMap Implementation
70//===----------------------------------------------------------------------===//
71
72DeclReferenceMap::DeclReferenceMap(ASTContext &Ctx) {
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000073 RefMapper(Map).Visit(Ctx.getTranslationUnitDecl());
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000074}
75
Argyrios Kyrtzidis874012b2009-07-06 21:34:20 +000076DeclReferenceMap::astlocation_iterator
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000077DeclReferenceMap::refs_begin(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000078 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000079 return astlocation_iterator(Map.lower_bound(Prim));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000080}
81
Argyrios Kyrtzidis874012b2009-07-06 21:34:20 +000082DeclReferenceMap::astlocation_iterator
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000083DeclReferenceMap::refs_end(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000084 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000085 return astlocation_iterator(Map.upper_bound(Prim));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000086}
87
88bool DeclReferenceMap::refs_empty(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000089 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000090 return refs_begin(Prim) == refs_end(Prim);
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000091}