12 #include "clang/ASTMatchers/ASTMatchFinder.h" 13 #include "clang/ASTMatchers/ASTMatchers.h" 14 #include "clang/Lex/Lexer.h" 19 using namespace ast_matchers;
22 const Stmt &Statement) {
23 return selectFirst<const FunctionDecl>(
24 "function", match(stmt(hasAncestor(functionDecl().bind(
"function"))),
29 const Expr *E_base = E->IgnoreImpCasts();
30 if (clang::isa<clang::BinaryOperator>(E_base) ||
31 clang::isa<clang::ConditionalOperator>(E_base)) {
35 if (
const auto *Operator =
36 clang::dyn_cast<clang::CXXOperatorCallExpr>(E_base)) {
37 return Operator->isInfixBinaryOp();
44 const LangOptions &LangOpts,
47 if (isa<IntegerLiteral>(Flags)) {
48 if (!SM.isMacroBodyExpansion(Flags->getBeginLoc()) &&
49 !SM.isMacroArgExpansion(Flags->getBeginLoc()))
53 auto MacroName = Lexer::getSourceText(
54 CharSourceRange::getTokenRange(Flags->getSourceRange()), SM, LangOpts);
56 return MacroName == FlagName;
59 if (
const auto *BO = dyn_cast<BinaryOperator>(Flags))
60 if (BO->getOpcode() == clang::BinaryOperatorKind::BO_Or)
62 LangOpts, FlagName) ||
71 const SourceManager *SM) {
73 SourceLocation MacroArgExpansionStartForRangeBegin;
74 SourceLocation MacroArgExpansionStartForRangeEnd;
75 bool RangeIsEntirelyWithinMacroArgument =
77 SM->isMacroArgExpansion(Range.getBegin(),
78 &MacroArgExpansionStartForRangeBegin) &&
79 SM->isMacroArgExpansion(Range.getEnd(),
80 &MacroArgExpansionStartForRangeEnd) &&
81 MacroArgExpansionStartForRangeBegin == MacroArgExpansionStartForRangeEnd;
83 return RangeIsEntirelyWithinMacroArgument;
88 Range.getBegin().isMacroID() || Range.getEnd().isMacroID();
bool IsBinaryOrTernary(const Expr *E)
bool rangeIsEntirelyWithinMacroArgument(SourceRange Range, const SourceManager *SM)
bool rangeContainsMacroExpansion(SourceRange Range, const SourceManager *SM)
bool exprHasBitFlagWithSpelling(const Expr *Flags, const SourceManager &SM, const LangOptions &LangOpts, StringRef FlagName)
Checks whether a macro flag is present in the given argument.
const FunctionDecl * getSurroundingFunction(ASTContext &Context, const Stmt &Statement)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
CharSourceRange Range
SourceRange for the file name.
bool rangeCanBeFixed(SourceRange Range, const SourceManager *SM)