Skip to content

Commit

Permalink
[clang-tidy] Reserved-identifier: Improved AllowedIdentifiers option …
Browse files Browse the repository at this point in the history
…to support regular expressions

Fixes: #59119

Reviewed By: PiotrZSL

Differential Revision: https://reviews.llvm.org/D152764
  • Loading branch information
felix642 authored and PiotrZSL committed Jun 19, 2023
1 parent 7faed5c commit 87a3253
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 9 deletions.
32 changes: 26 additions & 6 deletions clang-tools-extra/clang-tidy/bugprone/ReservedIdentifierCheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,35 @@ static int getMessageSelectIndex(StringRef Tag) {
return 0;
}

llvm::SmallVector<llvm::Regex>
ReservedIdentifierCheck::parseAllowedIdentifiers() const {
llvm::SmallVector<llvm::Regex> AllowedIdentifiers;
AllowedIdentifiers.reserve(AllowedIdentifiersRaw.size());

for (const auto &Identifier : AllowedIdentifiersRaw) {
AllowedIdentifiers.emplace_back(Identifier.str());
if (!AllowedIdentifiers.back().isValid()) {
configurationDiag("Invalid allowed identifier regex '%0'") << Identifier;
AllowedIdentifiers.pop_back();
}
}

return AllowedIdentifiers;
}

ReservedIdentifierCheck::ReservedIdentifierCheck(StringRef Name,
ClangTidyContext *Context)
: RenamerClangTidyCheck(Name, Context),
Invert(Options.get("Invert", false)),
AllowedIdentifiers(utils::options::parseStringList(
Options.get("AllowedIdentifiers", ""))) {}
AllowedIdentifiersRaw(utils::options::parseStringList(
Options.get("AllowedIdentifiers", ""))),
AllowedIdentifiers(parseAllowedIdentifiers()) {}

void ReservedIdentifierCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
RenamerClangTidyCheck::storeOptions(Opts);
Options.store(Opts, "Invert", Invert);
Options.store(Opts, "AllowedIdentifiers",
utils::options::serializeStringList(AllowedIdentifiers));
utils::options::serializeStringList(AllowedIdentifiersRaw));
}

static std::string collapseConsecutive(StringRef Str, char C) {
Expand Down Expand Up @@ -108,11 +125,14 @@ static std::string getNonReservedFixup(std::string Name) {
static std::optional<RenamerClangTidyCheck::FailureInfo>
getFailureInfoImpl(StringRef Name, bool IsInGlobalNamespace,
const LangOptions &LangOpts, bool Invert,
ArrayRef<StringRef> AllowedIdentifiers) {
ArrayRef<llvm::Regex> AllowedIdentifiers) {
assert(!Name.empty());
if (llvm::is_contained(AllowedIdentifiers, Name))
return std::nullopt;

if (llvm::any_of(AllowedIdentifiers, [&](const llvm::Regex &Regex) {
return Regex.match(Name);
})) {
return std::nullopt;
}
// TODO: Check for names identical to language keywords, and other names
// specifically reserved by language standards, e.g. C++ 'zombie names' and C
// future library directions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ namespace clang::tidy::bugprone {
/// http://clang.llvm.org/extra/clang-tidy/checks/bugprone/reserved-identifier.html
class ReservedIdentifierCheck final : public RenamerClangTidyCheck {
const bool Invert;
const std::vector<StringRef> AllowedIdentifiers;
const std::vector<StringRef> AllowedIdentifiersRaw;
const llvm::SmallVector<llvm::Regex> AllowedIdentifiers;

public:
ReservedIdentifierCheck(StringRef Name, ClangTidyContext *Context);
Expand All @@ -46,6 +47,7 @@ class ReservedIdentifierCheck final : public RenamerClangTidyCheck {
const SourceManager &SM) const override;
DiagInfo getDiagInfo(const NamingCheckId &ID,
const NamingCheckFailure &Failure) const override;
llvm::SmallVector<llvm::Regex> parseAllowedIdentifiers() const;
};

} // namespace clang::tidy::bugprone
Expand Down
4 changes: 4 additions & 0 deletions clang-tools-extra/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,10 @@ Changes in existing checks
- Improved the performance of the :doc:`bugprone-reserved-identifier
<clang-tidy/checks/bugprone/reserved-identifier>` check through optimizations.

- Improved the :doc:`bugprone-reserved-identifier
<clang-tidy/checks/bugprone/reserved-identifier>` check by enhancing the
`AllowedIdentifiers` option to support regular expressions.

- Deprecated check-local options `HeaderFileExtensions` and `ImplementationFileExtensions`
in :doc:`bugprone-suspicious-include
<clang-tidy/checks/bugprone/suspicious-include>` check.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,5 @@ Options

.. option:: AllowedIdentifiers

Semicolon-separated list of names that the check ignores. Default is an
Semicolon-separated list of regular expressions that the check ignores. Default is an
empty list.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// RUN: %check_clang_tidy %s bugprone-reserved-identifier %t -- \
// RUN: -config='{CheckOptions: [ \
// RUN: {key: bugprone-reserved-identifier.Invert, value: true}, \
// RUN: {key: bugprone-reserved-identifier.AllowedIdentifiers, value: std;reference_wrapper;ref;cref;type;get}, \
// RUN: {key: bugprone-reserved-identifier.AllowedIdentifiers, value: "std;reference_wrapper;^c?ref;type;get"}, \
// RUN: ]}' -- \
// RUN: -I%S/Inputs/reserved-identifier \
// RUN: -isystem %S/Inputs/reserved-identifier/system
Expand Down

0 comments on commit 87a3253

Please sign in to comment.