diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-11-15 12:26:39 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-11-15 12:26:39 +0000 |
commit | dce6327160a6e333137b34cce77e2dfc2cd5aab6 (patch) | |
tree | b3c9761cd9f8857e4cc879fc515e0e5b22fdf9a5 | |
parent | f7ce19400ba4d7e7f17f804490b76035de6fdf5e (diff) |
Warning option typo correction: When two options have the same edit_distance don't display either.
Also add a maximum edit distance threshold, so we don't correct "-Wx" to "-W#pragma-messages".
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144644 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticFrontendKinds.td | 8 | ||||
-rw-r--r-- | lib/Basic/DiagnosticIDs.cpp | 10 | ||||
-rw-r--r-- | lib/Frontend/Warnings.cpp | 32 |
3 files changed, 31 insertions, 19 deletions
diff --git a/include/clang/Basic/DiagnosticFrontendKinds.td b/include/clang/Basic/DiagnosticFrontendKinds.td index 91e32200f2..857f77e855 100644 --- a/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/include/clang/Basic/DiagnosticFrontendKinds.td @@ -148,9 +148,15 @@ def warn_pch_compiler_options_mismatch : Error< def err_not_a_pch_file : Error< "'%0' does not appear to be a precompiled header file">, DefaultFatal; def warn_unknown_warning_option : Warning< - "unknown warning option '%0'; did you mean '%1'?">, + "unknown warning option '%0'">, InGroup<DiagGroup<"unknown-warning-option"> >; def warn_unknown_negative_warning_option : Warning< + "unknown warning option '%0'?">, + InGroup<DiagGroup<"unknown-warning-option"> >, DefaultIgnore; +def warn_unknown_warning_option_suggest : Warning< + "unknown warning option '%0'; did you mean '%1'?">, + InGroup<DiagGroup<"unknown-warning-option"> >; +def warn_unknown_negative_warning_option_suggest : Warning< "unknown warning option '%0'; did you mean '%1'?">, InGroup<DiagGroup<"unknown-warning-option"> >, DefaultIgnore; def warn_unknown_warning_specifier : Warning< diff --git a/lib/Basic/DiagnosticIDs.cpp b/lib/Basic/DiagnosticIDs.cpp index 39fee69adb..cbca8d1c76 100644 --- a/lib/Basic/DiagnosticIDs.cpp +++ b/lib/Basic/DiagnosticIDs.cpp @@ -683,7 +683,7 @@ bool DiagnosticIDs::getDiagnosticsInGroup( StringRef DiagnosticIDs::getNearestWarningOption(StringRef Group) { StringRef Best; - unsigned BestDistance = 0; + unsigned BestDistance = Group.size() + 1; // Sanity threshold. for (const WarningOption *i = OptionTable, *e = OptionTable + OptionTableSize; i != e; ++i) { // Don't suggest ignored warning flags. @@ -691,9 +691,11 @@ StringRef DiagnosticIDs::getNearestWarningOption(StringRef Group) { continue; unsigned Distance = i->getName().edit_distance(Group, true, BestDistance); - - // Check if this is a better match. - if (Best.empty() || Distance < BestDistance) { + if (Distance == BestDistance) { + // Two matches with the same distance, don't prefer one over the other. + Best = ""; + } else if (Distance < BestDistance) { + // This is a better match. Best = i->getName(); BestDistance = Distance; } diff --git a/lib/Frontend/Warnings.cpp b/lib/Frontend/Warnings.cpp index ba0cd38045..4e41e22138 100644 --- a/lib/Frontend/Warnings.cpp +++ b/lib/Frontend/Warnings.cpp @@ -31,6 +31,21 @@ #include <algorithm> using namespace clang; +// EmitUnkownDiagWarning - Emit a warning and typo hint for unknown warning opts +static void EmitUnkownDiagWarning(DiagnosticsEngine &Diags, + StringRef Prefix, StringRef Opt, + bool isPositive) { + StringRef Suggestion = DiagnosticIDs::getNearestWarningOption(Opt); + if (!Suggestion.empty()) + Diags.Report(isPositive? diag::warn_unknown_warning_option_suggest : + diag::warn_unknown_negative_warning_option_suggest) + << (Prefix.str() += Opt) << (Prefix.str() += Suggestion); + else + Diags.Report(isPositive? diag::warn_unknown_warning_option : + diag::warn_unknown_negative_warning_option) + << (Prefix.str() += Opt); +} + void clang::ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts) { Diags.setSuppressSystemWarnings(true); // Default to -Wno-system-headers @@ -118,11 +133,7 @@ void clang::ProcessWarningOptions(DiagnosticsEngine &Diags, // Set the warning as error flag for this specifier. Diags.setDiagnosticGroupWarningAsError(Specifier, isPositive); } else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) { - Diags.Report(isPositive ? diag::warn_unknown_warning_option : - diag::warn_unknown_negative_warning_option) - << ("-W" + Opt.str()) - << ("-Werror=" + - DiagnosticIDs::getNearestWarningOption(Specifier).str()); + EmitUnkownDiagWarning(Diags, "-Werror", Specifier, isPositive); } continue; } @@ -150,20 +161,13 @@ void clang::ProcessWarningOptions(DiagnosticsEngine &Diags, // Set the error as fatal flag for this specifier. Diags.setDiagnosticGroupErrorAsFatal(Specifier, isPositive); } else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) { - Diags.Report(isPositive ? diag::warn_unknown_warning_option : - diag::warn_unknown_negative_warning_option) - << ("-W" + Opt.str()) - << ("-Wfatal-errors=" + - DiagnosticIDs::getNearestWarningOption(Specifier).str()); + EmitUnkownDiagWarning(Diags, "-Wfatal-errors", Specifier, isPositive); } continue; } if (Report && DiagIDs->getDiagnosticsInGroup(Opt, _Diags)) { - Diags.Report(isPositive ? diag::warn_unknown_warning_option : - diag::warn_unknown_negative_warning_option) - << ("-W" + Opt.str()) - << ("-W" + DiagnosticIDs::getNearestWarningOption(Opt).str()); + EmitUnkownDiagWarning(Diags, "-W", Opt, isPositive); } else { Diags.setDiagnosticGroupMapping(Opt, Mapping); } |