[clang-tools-extra] 1fd2049 - [clang-tidy][NFC] Added convienence methods for getting optional options
Nathan James via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 31 17:45:48 PDT 2020
Author: Nathan James
Date: 2020-08-01T01:45:34+01:00
New Revision: 1fd2049e38daf0992f63883d68609b85dfb9cb26
URL: https://github.com/llvm/llvm-project/commit/1fd2049e38daf0992f63883d68609b85dfb9cb26
DIFF: https://github.com/llvm/llvm-project/commit/1fd2049e38daf0992f63883d68609b85dfb9cb26.diff
LOG: [clang-tidy][NFC] Added convienence methods for getting optional options
These methods abstract away Error handling when trying to read options that can't be parsed by logging the error automatically and returning None.
Reviewed By: gribozavr2
Differential Revision: https://reviews.llvm.org/D84812
Added:
Modified:
clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
clang-tools-extra/clang-tidy/ClangTidyCheck.h
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
index 737d85e092d9..c99931e0aa3a 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
@@ -10,6 +10,7 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
+#include "llvm/Support/WithColor.h"
#include "llvm/Support/raw_ostream.h"
namespace clang {
@@ -126,7 +127,7 @@ bool ClangTidyCheck::OptionsView::get<bool>(StringRef LocalName,
llvm::Expected<bool> ValueOr = get<bool>(LocalName);
if (ValueOr)
return *ValueOr;
- logErrToStdErr(ValueOr.takeError());
+ logIfOptionParsingError(ValueOr.takeError());
return Default;
}
@@ -145,7 +146,7 @@ bool ClangTidyCheck::OptionsView::getLocalOrGlobal<bool>(StringRef LocalName,
llvm::Expected<bool> ValueOr = getLocalOrGlobal<bool>(LocalName);
if (ValueOr)
return *ValueOr;
- logErrToStdErr(ValueOr.takeError());
+ logIfOptionParsingError(ValueOr.takeError());
return Default;
}
@@ -204,13 +205,33 @@ llvm::Expected<int64_t> ClangTidyCheck::OptionsView::getEnumInt(
Iter->getValue().Value);
}
-void ClangTidyCheck::OptionsView::logErrToStdErr(llvm::Error &&Err) {
- llvm::logAllUnhandledErrors(
- llvm::handleErrors(std::move(Err),
- [](const MissingOptionError &) -> llvm::Error {
- return llvm::Error::success();
- }),
- llvm::errs(), "warning: ");
+void ClangTidyCheck::OptionsView::logIfOptionParsingError(llvm::Error &&Err) {
+ if (auto RemainingErrors =
+ llvm::handleErrors(std::move(Err), [](const MissingOptionError &) {}))
+ llvm::logAllUnhandledErrors(std::move(RemainingErrors),
+ llvm::WithColor::warning());
}
+
+template <>
+Optional<std::string> ClangTidyCheck::OptionsView::getOptional<std::string>(
+ StringRef LocalName) const {
+ if (auto ValueOr = get(LocalName))
+ return *ValueOr;
+ else
+ consumeError(ValueOr.takeError());
+ return llvm::None;
+}
+
+template <>
+Optional<std::string>
+ClangTidyCheck::OptionsView::getOptionalLocalOrGlobal<std::string>(
+ StringRef LocalName) const {
+ if (auto ValueOr = getLocalOrGlobal(LocalName))
+ return *ValueOr;
+ else
+ consumeError(ValueOr.takeError());
+ return llvm::None;
+}
+
} // namespace tidy
} // namespace clang
diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.h b/clang-tools-extra/clang-tidy/ClangTidyCheck.h
index 4df8071c841e..6237e216656b 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyCheck.h
+++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.h
@@ -268,7 +268,7 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
if (llvm::Expected<T> ValueOr = get<T>(LocalName))
return *ValueOr;
else
- logErrToStdErr(ValueOr.takeError());
+ logIfOptionParsingError(ValueOr.takeError());
return Default;
}
@@ -314,7 +314,7 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
if (llvm::Expected<T> ValueOr = getLocalOrGlobal<T>(LocalName))
return *ValueOr;
else
- logErrToStdErr(ValueOr.takeError());
+ logIfOptionParsingError(ValueOr.takeError());
return Default;
}
@@ -353,7 +353,7 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
if (auto ValueOr = get<T>(LocalName, IgnoreCase))
return *ValueOr;
else
- logErrToStdErr(ValueOr.takeError());
+ logIfOptionParsingError(ValueOr.takeError());
return Default;
}
@@ -395,10 +395,35 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
if (auto ValueOr = getLocalOrGlobal<T>(LocalName, IgnoreCase))
return *ValueOr;
else
- logErrToStdErr(ValueOr.takeError());
+ logIfOptionParsingError(ValueOr.takeError());
return Default;
}
+ /// Returns the value for the option \p LocalName represented as a ``T``.
+ /// If the option is missing returns None, if the option can't be parsed
+ /// as a ``T``, log that to stderr and return None.
+ template <typename T = std::string>
+ llvm::Optional<T> getOptional(StringRef LocalName) const {
+ if (auto ValueOr = get<T>(LocalName))
+ return *ValueOr;
+ else
+ logIfOptionParsingError(ValueOr.takeError());
+ return llvm::None;
+ }
+
+ /// Returns the value for the local or global option \p LocalName
+ /// represented as a ``T``.
+ /// If the option is missing returns None, if the
+ /// option can't be parsed as a ``T``, log that to stderr and return None.
+ template <typename T = std::string>
+ llvm::Optional<T> getOptionalLocalOrGlobal(StringRef LocalName) const {
+ if (auto ValueOr = getLocalOrGlobal<T>(LocalName))
+ return *ValueOr;
+ else
+ logIfOptionParsingError(ValueOr.takeError());
+ return llvm::None;
+ }
+
/// Stores an option with the check-local name \p LocalName with
/// string value \p Value to \p Options.
void store(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
@@ -456,7 +481,8 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
void storeInt(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
int64_t Value) const;
- static void logErrToStdErr(llvm::Error &&Err);
+ /// Logs an Error to stderr if a \p Err is not a MissingOptionError.
+ static void logIfOptionParsingError(llvm::Error &&Err);
std::string NamePrefix;
const ClangTidyOptions::OptionMap &CheckOptions;
@@ -524,6 +550,19 @@ void ClangTidyCheck::OptionsView::store<bool>(
ClangTidyOptions::OptionMap &Options, StringRef LocalName,
bool Value) const;
+/// Returns the value for the option \p LocalName.
+/// If the option is missing returns None.
+template <>
+Optional<std::string> ClangTidyCheck::OptionsView::getOptional<std::string>(
+ StringRef LocalName) const;
+
+/// Returns the value for the local or global option \p LocalName.
+/// If the option is missing returns None.
+template <>
+Optional<std::string>
+ClangTidyCheck::OptionsView::getOptionalLocalOrGlobal<std::string>(
+ StringRef LocalName) const;
+
} // namespace tidy
} // namespace clang
More information about the cfe-commits
mailing list