summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Gennadiy Rozental <rogeeff@google.com>2023-03-13 21:22:11 -0700
committerGravatar Copybara-Service <copybara-worker@google.com>2023-03-13 21:22:51 -0700
commit6db185d8e2ba93adf32d689fd702ee0465b2e5ec (patch)
tree9726a1a6a1e38b7c579feacb53ae6922dbdbb655
parent52578edd8950227f1eb28821622c861804241de6 (diff)
Correct semantic and documentation for the ReportUnrecognizedFlags interface
PiperOrigin-RevId: 516411395 Change-Id: I442fc9435bd7a829802c325e2e4106aa6775c263
-rw-r--r--absl/flags/parse.cc67
-rw-r--r--absl/flags/parse.h13
2 files changed, 41 insertions, 39 deletions
diff --git a/absl/flags/parse.cc b/absl/flags/parse.cc
index fcd6a52d..236d31b7 100644
--- a/absl/flags/parse.cc
+++ b/absl/flags/parse.cc
@@ -22,7 +22,6 @@
#include <cstdlib>
#include <fstream>
#include <iostream>
-#include <iterator>
#include <string>
#include <tuple>
#include <utility>
@@ -600,6 +599,34 @@ bool CanIgnoreUndefinedFlag(absl::string_view flag_name) {
return false;
}
+// --------------------------------------------------------------------
+
+void ReportUnrecognizedFlags(
+ const std::vector<UnrecognizedFlag>& unrecognized_flags,
+ bool report_as_fatal_error) {
+ for (const auto& unrecognized : unrecognized_flags) {
+ // Verify if flag_name has the "no" already removed
+ std::vector<std::string> misspelling_hints;
+ if (unrecognized.source == UnrecognizedFlag::kFromArgv) {
+ misspelling_hints =
+ flags_internal::GetMisspellingHints(unrecognized.flag_name);
+ }
+
+ if (misspelling_hints.empty()) {
+ flags_internal::ReportUsageError(
+ absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
+ "'"),
+ report_as_fatal_error);
+ } else {
+ flags_internal::ReportUsageError(
+ absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
+ "'. Did you mean: ",
+ absl::StrJoin(misspelling_hints, ", "), " ?"),
+ report_as_fatal_error);
+ }
+ }
+}
+
} // namespace
// --------------------------------------------------------------------
@@ -674,12 +701,15 @@ std::vector<char*> ParseCommandLineImpl(int argc, char* argv[],
argc, argv, positional_args, unrecognized_flags);
if (undef_flag_action != OnUndefinedFlag::kIgnoreUndefined) {
- ReportUnrecognizedFlags(
- unrecognized_flags,
- undef_flag_action ==
- flags_internal::OnUndefinedFlag::kAbortIfUndefined);
+ if (parse_successful &&
+ undef_flag_action == OnUndefinedFlag::kAbortIfUndefined) {
+ if (!unrecognized_flags.empty()) { parse_successful = false; }
+ }
- if (!unrecognized_flags.empty()) { parse_successful = false; }
+ flags_internal::ReportUnrecognizedFlags(
+ unrecognized_flags,
+ !parse_successful &&
+ (undef_flag_action == OnUndefinedFlag::kAbortIfUndefined));
}
#if ABSL_FLAGS_STRIP_NAMES
@@ -871,29 +901,8 @@ bool ParseAbseilFlagsOnly(int argc, char* argv[],
// --------------------------------------------------------------------
void ReportUnrecognizedFlags(
- const std::vector<UnrecognizedFlag>& unrecognized_flags,
- bool report_fatal_error) {
- for (const auto& unrecognized : unrecognized_flags) {
- // Verify if flag_name has the "no" already removed
- std::vector<std::string> misspelling_hints;
- if (unrecognized.source == UnrecognizedFlag::kFromArgv) {
- misspelling_hints =
- flags_internal::GetMisspellingHints(unrecognized.flag_name);
- }
-
- if (misspelling_hints.empty()) {
- flags_internal::ReportUsageError(
- absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
- "'"),
- report_fatal_error);
- } else {
- flags_internal::ReportUsageError(
- absl::StrCat("Unknown command line flag '", unrecognized.flag_name,
- "'. Did you mean: ",
- absl::StrJoin(misspelling_hints, ", "), " ?"),
- report_fatal_error);
- }
- }
+ const std::vector<UnrecognizedFlag>& unrecognized_flags) {
+ flags_internal::ReportUnrecognizedFlags(unrecognized_flags, true);
}
// --------------------------------------------------------------------
diff --git a/absl/flags/parse.h b/absl/flags/parse.h
index a5629375..97327274 100644
--- a/absl/flags/parse.h
+++ b/absl/flags/parse.h
@@ -90,17 +90,10 @@ bool ParseAbseilFlagsOnly(int argc, char* argv[],
// ReportUnrecognizedFlags()
//
-// Reports an error for all non-ignored unrecognized flags in the provided
-// `unrecognized_flags` list.
-//
-// If `report_fatal_error` is true, the fatal error is reported and program is
-// aborted. Otherwise non-fatal error is reported for all flags.
-//
-// This function returns true if any non-ignored unrecognized flags were
-// located in the list and false otherwise.
+// Reports an error to `stderr` for all non-ignored unrecognized flags in
+// the provided `unrecognized_flags` list.
void ReportUnrecognizedFlags(
- const std::vector<UnrecognizedFlag>& unrecognized_flags,
- bool report_fatal_error);
+ const std::vector<UnrecognizedFlag>& unrecognized_flags);
// ParseCommandLine()
//