clang API Documentation

SelectorMap.cpp
Go to the documentation of this file.
00001 //===- SelectorMap.cpp - Maps selectors to methods and messages -*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 //  SelectorMap creates a mapping from selectors to ObjC method declarations
00011 //  and ObjC message expressions.
00012 //
00013 //===----------------------------------------------------------------------===//
00014 
00015 #include "clang/Index/SelectorMap.h"
00016 #include "ASTVisitor.h"
00017 using namespace clang;
00018 using namespace idx;
00019 
00020 namespace {
00021 
00022 class SelMapper : public ASTVisitor<SelMapper> {
00023   SelectorMap::SelMethMapTy &SelMethMap;
00024   SelectorMap::SelRefMapTy &SelRefMap;
00025 
00026 public:
00027   SelMapper(SelectorMap::SelMethMapTy &MethMap,
00028             SelectorMap::SelRefMapTy &RefMap)
00029     : SelMethMap(MethMap), SelRefMap(RefMap) { }
00030 
00031   void VisitObjCMethodDecl(ObjCMethodDecl *D);
00032   void VisitObjCMessageExpr(ObjCMessageExpr *Node);
00033   void VisitObjCSelectorExpr(ObjCSelectorExpr *Node);
00034 };
00035 
00036 } // anonymous namespace
00037 
00038 //===----------------------------------------------------------------------===//
00039 // SelMapper Implementation
00040 //===----------------------------------------------------------------------===//
00041 
00042 void SelMapper::VisitObjCMethodDecl(ObjCMethodDecl *D) {
00043   if (D->getCanonicalDecl() == D)
00044     SelMethMap.insert(std::make_pair(D->getSelector(), D));
00045   Base::VisitObjCMethodDecl(D);
00046 }
00047 
00048 void SelMapper::VisitObjCMessageExpr(ObjCMessageExpr *Node) {
00049   ASTLocation ASTLoc(CurrentDecl, Node);
00050   SelRefMap.insert(std::make_pair(Node->getSelector(), ASTLoc));
00051 }
00052 
00053 void SelMapper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
00054   ASTLocation ASTLoc(CurrentDecl, Node);
00055   SelRefMap.insert(std::make_pair(Node->getSelector(), ASTLoc));
00056 }
00057 
00058 //===----------------------------------------------------------------------===//
00059 // SelectorMap Implementation
00060 //===----------------------------------------------------------------------===//
00061 
00062 SelectorMap::SelectorMap(ASTContext &Ctx) {
00063   SelMapper(SelMethMap, SelRefMap).Visit(Ctx.getTranslationUnitDecl());
00064 }
00065 
00066 SelectorMap::method_iterator
00067 SelectorMap::methods_begin(Selector Sel) const {
00068   return method_iterator(SelMethMap.lower_bound(Sel));
00069 }
00070 
00071 SelectorMap::method_iterator
00072 SelectorMap::methods_end(Selector Sel) const {
00073   return method_iterator(SelMethMap.upper_bound(Sel));
00074 }
00075 
00076 SelectorMap::astlocation_iterator
00077 SelectorMap::refs_begin(Selector Sel) const {
00078   return astlocation_iterator(SelRefMap.lower_bound(Sel));
00079 }
00080 
00081 SelectorMap::astlocation_iterator
00082 SelectorMap::refs_end(Selector Sel) const {
00083   return astlocation_iterator(SelRefMap.upper_bound(Sel));
00084 }