16bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//=== SelectorExtras.h - Helpers for checkers using selectors -----*- C++ -*-=//
26bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//
36bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//                     The LLVM Compiler Infrastructure
46bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//
56bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// This file is distributed under the University of Illinois Open Source
66bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// License. See LICENSE.TXT for details.
76bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//
86bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===//
96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_SELECTOREXTRAS_H
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_SELECTOREXTRAS_H
126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/AST/ASTContext.h"
146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include <cstdarg>
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace clang {
176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ento {
186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic inline Selector getKeywordSelectorImpl(ASTContext &Ctx,
206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              const char *First,
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              va_list argp) {
226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SmallVector<IdentifierInfo*, 10> II;
236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  II.push_back(&Ctx.Idents.get(First));
246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  while (const char *s = va_arg(argp, const char *))
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    II.push_back(&Ctx.Idents.get(s));
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return Ctx.Selectors.getSelector(II.size(), &II[0]);
296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic inline Selector getKeywordSelector(ASTContext &Ctx, va_list argp) {
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const char *First = va_arg(argp, const char *);
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  assert(First && "keyword selectors must have at least one argument");
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return getKeywordSelectorImpl(Ctx, First, argp);
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_END_WITH_NULL
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic inline Selector getKeywordSelector(ASTContext &Ctx,
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          const char *First, ...) {
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  va_list argp;
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  va_start(argp, First);
426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Selector result = getKeywordSelectorImpl(Ctx, First, argp);
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  va_end(argp);
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return result;
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_END_WITH_NULL
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic inline void lazyInitKeywordSelector(Selector &Sel, ASTContext &Ctx,
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                           const char *First, ...) {
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Sel.isNull())
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  va_list argp;
536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  va_start(argp, First);
546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Sel = getKeywordSelectorImpl(Ctx, First, argp);
556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  va_end(argp);
566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic inline void lazyInitNullarySelector(Selector &Sel, ASTContext &Ctx,
596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                           const char *Name) {
606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Sel.isNull())
616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Sel = GetNullarySelector(Name, Ctx);
636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} // end namespace ento
666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} // end namespace clang
676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
69