Home | History | Annotate | Download | only in Checkers
      1 //=== SelectorExtras.h - Helpers for checkers using selectors -----*- C++ -*-=//
      2 //
      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 
     10 #ifndef LLVM_CLANG_SA_CHECKERS_SELECTOREXTRAS
     11 #define LLVM_CLANG_SA_CHECKERS_SELECTOREXTRAS
     12 
     13 #include "clang/AST/ASTContext.h"
     14 #include <cstdarg>
     15 
     16 namespace clang {
     17 namespace ento {
     18 
     19 static inline Selector getKeywordSelectorImpl(ASTContext &Ctx,
     20                                               const char *First,
     21                                               va_list argp) {
     22   SmallVector<IdentifierInfo*, 10> II;
     23   II.push_back(&Ctx.Idents.get(First));
     24 
     25   while (const char *s = va_arg(argp, const char *))
     26     II.push_back(&Ctx.Idents.get(s));
     27 
     28   return Ctx.Selectors.getSelector(II.size(), &II[0]);
     29 }
     30 
     31 static inline Selector getKeywordSelector(ASTContext &Ctx, va_list argp) {
     32   const char *First = va_arg(argp, const char *);
     33   assert(First && "keyword selectors must have at least one argument");
     34   return getKeywordSelectorImpl(Ctx, First, argp);
     35 }
     36 
     37 END_WITH_NULL
     38 static inline Selector getKeywordSelector(ASTContext &Ctx,
     39                                           const char *First, ...) {
     40   va_list argp;
     41   va_start(argp, First);
     42   Selector result = getKeywordSelectorImpl(Ctx, First, argp);
     43   va_end(argp);
     44   return result;
     45 }
     46 
     47 END_WITH_NULL
     48 static inline void lazyInitKeywordSelector(Selector &Sel, ASTContext &Ctx,
     49                                            const char *First, ...) {
     50   if (!Sel.isNull())
     51     return;
     52   va_list argp;
     53   va_start(argp, First);
     54   Sel = getKeywordSelectorImpl(Ctx, First, argp);
     55   va_end(argp);
     56 }
     57 
     58 static inline void lazyInitNullarySelector(Selector &Sel, ASTContext &Ctx,
     59                                            const char *Name) {
     60   if (!Sel.isNull())
     61     return;
     62   Sel = GetNullarySelector(Name, Ctx);
     63 }
     64 
     65 } // end namespace ento
     66 } // end namespace clang
     67 
     68 #endif
     69