clang API Documentation
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 }