================ @@ -0,0 +1,198 @@ +//===--- BoolBitwiseOperationCheck.cpp - clang-tidy -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "BoolBitwiseOperationCheck.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Lex/Lexer.h" +#include <array> +#include <optional> +#include <utility> + +using namespace clang::ast_matchers; + +namespace clang::tidy::misc { + +static const NamedDecl * +getLHSNamedDeclIfCompoundAssign(const BinaryOperator *BO) { + if (BO->isCompoundAssignmentOp()) { + const auto *DelcRefLHS = + dyn_cast<DeclRefExpr>(BO->getLHS()->IgnoreImpCasts()); + return DelcRefLHS ? DelcRefLHS->getDecl() : nullptr; + } + return nullptr; +} + +static bool hasExplicitParentheses(const Expr *E, const SourceManager &SM, + const LangOptions &LangOpts) { + if (!E) + return false; + + const SourceLocation Start = E->getBeginLoc(); + const SourceLocation End = E->getEndLoc(); + + if (Start.isMacroID() || End.isMacroID() || Start.isInvalid() || + End.isInvalid()) + return false; + + const std::optional<Token> PrevTok = + Lexer::findPreviousToken(Start, SM, LangOpts, /*IncludeComments=*/false); + const std::optional<Token> NextTok = + Lexer::findNextToken(End, SM, LangOpts, /*IncludeComments=*/false); + + return (PrevTok && PrevTok->is(tok::l_paren)) && + (NextTok && NextTok->is(tok::r_paren)); +} + +constexpr std::array<std::pair<llvm::StringRef, llvm::StringRef>, 8U> + OperatorsTransformation{{{"|", "||"}, + {"|=", "||"}, + {"&", "&&"}, + {"&=", "&&"}, + {"bitand", "and"}, + {"and_eq", "and"}, + {"bitor", "or"}, + {"or_eq", "or"}}}; + +static std::string translate(llvm::StringRef Value) { + for (const auto &[Bitwise, Logical] : OperatorsTransformation) { + if (Value == Bitwise) + return Logical.str(); + } + + return {}; +} + +BoolBitwiseOperationCheck::BoolBitwiseOperationCheck(StringRef Name, + ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + StrictMode(Options.get("StrictMode", false)), + IgnoreMacros(Options.get("IgnoreMacros", false)) {} + +void BoolBitwiseOperationCheck::storeOptions( + ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "StrictMode", StrictMode); + Options.store(Opts, "IgnoreMacros", IgnoreMacros); +} + +void BoolBitwiseOperationCheck::registerMatchers(MatchFinder *Finder) { + Finder->addMatcher( + binaryOperator( + unless(isExpansionInSystemHeader()), + hasAnyOperatorName("|", "&", "|=", "&="), ---------------- vbvictor wrote:
you could write ```cpp IgnoreMacros ? unless(isInMacro()) : static_cast<ast_matchers::internal::Matcher<BinaryOperator>>( anything()) ``` https://github.com/llvm/llvm-project/pull/142324 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits