[clang-tidy] add depercation warning for non-whitelisted global options (#121057)

We plan to depercate `StrictMode` and `IgnoreMacros` global options
after 2 major versions and support local options only for them.
This patch introduces the depercation warning.
This commit is contained in:
Congcong Cai
2024-12-30 22:35:46 +08:00
committed by GitHub
parent ff936ce62b
commit 42dfaa15a6
4 changed files with 27 additions and 13 deletions

View File

@@ -7,11 +7,11 @@
//===----------------------------------------------------------------------===//
#include "ClangTidyCheck.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Support/YAMLParser.h"
#include <optional>
#include <string>
namespace clang::tidy {
@@ -62,16 +62,29 @@ ClangTidyCheck::OptionsView::get(StringRef LocalName) const {
return std::nullopt;
}
static const llvm::StringSet<> DeprecatedGlobalOptions{
"StrictMode",
"IgnoreMacros",
};
static ClangTidyOptions::OptionMap::const_iterator
findPriorityOption(const ClangTidyOptions::OptionMap &Options,
StringRef NamePrefix, StringRef LocalName,
llvm::StringSet<> *Collector) {
ClangTidyContext *Context) {
llvm::StringSet<> *Collector = Context->getOptionsCollector();
if (Collector) {
Collector->insert((NamePrefix + LocalName).str());
Collector->insert(LocalName);
}
auto IterLocal = Options.find((NamePrefix + LocalName).str());
auto IterGlobal = Options.find(LocalName);
// FIXME: temporary solution for deprecation warnings, should be removed
// after 22.x. Warn configuration deps on deprecation global options.
if (IterLocal == Options.end() && IterGlobal != Options.end() &&
DeprecatedGlobalOptions.contains(LocalName))
Context->configurationDiag(
"global option '%0' is deprecated, please use '%1%0' instead.")
<< LocalName << NamePrefix;
if (IterLocal == Options.end())
return IterGlobal;
if (IterGlobal == Options.end())
@@ -83,8 +96,7 @@ findPriorityOption(const ClangTidyOptions::OptionMap &Options,
std::optional<StringRef>
ClangTidyCheck::OptionsView::getLocalOrGlobal(StringRef LocalName) const {
auto Iter = findPriorityOption(CheckOptions, NamePrefix, LocalName,
Context->getOptionsCollector());
auto Iter = findPriorityOption(CheckOptions, NamePrefix, LocalName, Context);
if (Iter != CheckOptions.end())
return StringRef(Iter->getValue().Value);
return std::nullopt;
@@ -117,8 +129,7 @@ ClangTidyCheck::OptionsView::get<bool>(StringRef LocalName) const {
template <>
std::optional<bool>
ClangTidyCheck::OptionsView::getLocalOrGlobal<bool>(StringRef LocalName) const {
auto Iter = findPriorityOption(CheckOptions, NamePrefix, LocalName,
Context->getOptionsCollector());
auto Iter = findPriorityOption(CheckOptions, NamePrefix, LocalName, Context);
if (Iter != CheckOptions.end()) {
if (auto Result = getAsBool(Iter->getValue().Value, Iter->getKey()))
return Result;
@@ -157,10 +168,9 @@ std::optional<int64_t> ClangTidyCheck::OptionsView::getEnumInt(
bool IgnoreCase) const {
if (!CheckGlobal && Context->getOptionsCollector())
Context->getOptionsCollector()->insert((NamePrefix + LocalName).str());
auto Iter = CheckGlobal
? findPriorityOption(CheckOptions, NamePrefix, LocalName,
Context->getOptionsCollector())
: CheckOptions.find((NamePrefix + LocalName).str());
auto Iter = CheckGlobal ? findPriorityOption(CheckOptions, NamePrefix,
LocalName, Context)
: CheckOptions.find((NamePrefix + LocalName).str());
if (Iter == CheckOptions.end())
return std::nullopt;

View File

@@ -119,7 +119,8 @@ Improvements to clang-tidy
- Removed :program:`clang-tidy`'s global options for most of checks. All options
are changed to local options except `IncludeStyle`, `StrictMode` and
`IgnoreMacros`.
`IgnoreMacros`. Global scoped `StrictMode` and `IgnoreMacros` are deprecated
and will be removed in further releases.
.. csv-table::
:header: "Check", "Options removed from global option"

View File

@@ -1,6 +1,6 @@
// RUN: %check_clang_tidy %s modernize-use-std-format %t -- \
// RUN: -config="{CheckOptions: { \
// RUN: StrictMode: true, \
// RUN: modernize-use-std-format.StrictMode: true, \
// RUN: modernize-use-std-format.StrFormatLikeFunctions: 'fmt::sprintf', \
// RUN: modernize-use-std-format.ReplacementFormatFunction: 'fmt::format', \
// RUN: modernize-use-std-format.FormatHeader: '<fmt/core.h>' \

View File

@@ -0,0 +1,3 @@
// RUN: clang-tidy %s --config="{CheckOptions:{StrictMode: true}}" -checks="-*,modernize-use-std-format" | FileCheck %s
// CHECK: warning: global option 'StrictMode' is deprecated, please use 'modernize-use-std-format.StrictMode' instead. [clang-tidy-config]