diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-07-29 23:40:58 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-07-29 23:40:58 +0000 |
commit | b8470e4f7591a255a801c66d10bbedcf0bdc855f (patch) | |
tree | 5725d488b7f12c5047ae3420a177cfd3f5a5d953 /clang/lib/Index/SelectorMap.cpp | |
parent | 34be01b9f4f262d5b5d5259b70e4c71c006dbc7d (diff) | |
download | bcm5719-llvm-b8470e4f7591a255a801c66d10bbedcf0bdc855f.tar.gz bcm5719-llvm-b8470e4f7591a255a801c66d10bbedcf0bdc855f.zip |
Introduce SelectorMap whose purpose is to map selectors to objc methods and message exprs,
inside a particular ASTContext.
llvm-svn: 77541
Diffstat (limited to 'clang/lib/Index/SelectorMap.cpp')
-rw-r--r-- | clang/lib/Index/SelectorMap.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/clang/lib/Index/SelectorMap.cpp b/clang/lib/Index/SelectorMap.cpp new file mode 100644 index 00000000000..325b3711e80 --- /dev/null +++ b/clang/lib/Index/SelectorMap.cpp @@ -0,0 +1,85 @@ +//===- SelectorMap.cpp - Maps selectors to methods and messages -*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// SelectorMap creates a mapping from selectors to ObjC method declarations +// and ObjC message expressions. +// +//===----------------------------------------------------------------------===// + +#include "clang/Index/SelectorMap.h" +#include "ASTVisitor.h" +#include "llvm/Support/Compiler.h" +using namespace clang; +using namespace idx; + +namespace { + +class VISIBILITY_HIDDEN SelMapper : public ASTVisitor<SelMapper> { + SelectorMap::SelMethMapTy &SelMethMap; + SelectorMap::SelRefMapTy &SelRefMap; + +public: + SelMapper(SelectorMap::SelMethMapTy &MethMap, + SelectorMap::SelRefMapTy &RefMap) + : SelMethMap(MethMap), SelRefMap(RefMap) { } + + void VisitObjCMethodDecl(ObjCMethodDecl *D); + void VisitObjCMessageExpr(ObjCMessageExpr *Node); + void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); +}; + +} // anonymous namespace + +//===----------------------------------------------------------------------===// +// SelMapper Implementation +//===----------------------------------------------------------------------===// + +void SelMapper::VisitObjCMethodDecl(ObjCMethodDecl *D) { + if (D->getCanonicalDecl() == D) + SelMethMap.insert(std::make_pair(D->getSelector(), D)); + Base::VisitObjCMethodDecl(D); +} + +void SelMapper::VisitObjCMessageExpr(ObjCMessageExpr *Node) { + ASTLocation ASTLoc(CurrentDecl, Node); + SelRefMap.insert(std::make_pair(Node->getSelector(), ASTLoc)); +} + +void SelMapper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { + ASTLocation ASTLoc(CurrentDecl, Node); + SelRefMap.insert(std::make_pair(Node->getSelector(), ASTLoc)); +} + +//===----------------------------------------------------------------------===// +// SelectorMap Implementation +//===----------------------------------------------------------------------===// + +SelectorMap::SelectorMap(ASTContext &Ctx) { + SelMapper(SelMethMap, SelRefMap).Visit(Ctx.getTranslationUnitDecl()); +} + +SelectorMap::method_iterator +SelectorMap::methods_begin(Selector Sel) const { + return method_iterator(SelMethMap.lower_bound(Sel)); +} + +SelectorMap::method_iterator +SelectorMap::methods_end(Selector Sel) const { + return method_iterator(SelMethMap.upper_bound(Sel)); +} + +SelectorMap::astlocation_iterator +SelectorMap::refs_begin(Selector Sel) const { + return astlocation_iterator(SelRefMap.lower_bound(Sel)); +} + +SelectorMap::astlocation_iterator +SelectorMap::refs_end(Selector Sel) const { + return astlocation_iterator(SelRefMap.upper_bound(Sel)); +} |