blob: 0aee2a40ecd1f2e1f27232f1d6e4cff36da98fda [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 Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000033};
34
35} // anonymous namespace
36
37//===----------------------------------------------------------------------===//
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000038// RefMapper Implementation
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000039//===----------------------------------------------------------------------===//
40
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000041void RefMapper::VisitDeclRefExpr(DeclRefExpr *Node) {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000042 NamedDecl *PrimD = cast<NamedDecl>(Node->getDecl()->getCanonicalDecl());
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000043 Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000044}
45
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000046void RefMapper::VisitMemberExpr(MemberExpr *Node) {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000047 NamedDecl *PrimD = cast<NamedDecl>(Node->getMemberDecl()->getCanonicalDecl());
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000048 Map.insert(std::make_pair(PrimD, ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis9e6bc062009-07-14 03:18:09 +000049}
50
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000051void RefMapper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
52 Map.insert(std::make_pair(Node->getDecl(), ASTLocation(CurrentDecl, Node)));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000053}
54
55//===----------------------------------------------------------------------===//
56// DeclReferenceMap Implementation
57//===----------------------------------------------------------------------===//
58
59DeclReferenceMap::DeclReferenceMap(ASTContext &Ctx) {
Argyrios Kyrtzidis81e84562009-07-29 23:40:39 +000060 RefMapper(Map).Visit(Ctx.getTranslationUnitDecl());
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000061}
62
Argyrios Kyrtzidis874012b2009-07-06 21:34:20 +000063DeclReferenceMap::astlocation_iterator
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000064DeclReferenceMap::refs_begin(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000065 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000066 return astlocation_iterator(Map.lower_bound(Prim));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000067}
68
Argyrios Kyrtzidis874012b2009-07-06 21:34:20 +000069DeclReferenceMap::astlocation_iterator
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000070DeclReferenceMap::refs_end(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000071 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000072 return astlocation_iterator(Map.upper_bound(Prim));
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000073}
74
75bool DeclReferenceMap::refs_empty(NamedDecl *D) const {
Argyrios Kyrtzidisb57a4fe2009-07-18 00:34:07 +000076 NamedDecl *Prim = cast<NamedDecl>(D->getCanonicalDecl());
Mike Stump1eb44332009-09-09 15:08:12 +000077 return refs_begin(Prim) == refs_end(Prim);
Argyrios Kyrtzidis2c2ba3e2009-07-05 22:22:06 +000078}