aboutsummaryrefslogtreecommitdiff
path: root/lib/Support
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2011-01-24 17:27:17 +0000
committerDaniel Dunbar <daniel@zuster.org>2011-01-24 17:27:17 +0000
commitc98d82a7f0a2a0a8b939c611954d59bab677bfe7 (patch)
tree0dbf5dad42fc9467dd1d212584fd08421edd16fc /lib/Support
parentccea167db53f52b2cda639cd184655b86dbf3952 (diff)
Support/CommandLine: Fix LookupNearestOption to also search extra option names.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124124 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/CommandLine.cpp35
1 files changed, 25 insertions, 10 deletions
diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp
index 2b4fba8062..7e744993a7 100644
--- a/lib/Support/CommandLine.cpp
+++ b/lib/Support/CommandLine.cpp
@@ -185,7 +185,8 @@ static Option *LookupOption(StringRef &Arg, StringRef &Value,
/// (after an equal sign) return that as well. This assumes that leading dashes
/// have already been stripped.
static Option *LookupNearestOption(StringRef Arg,
- const StringMap<Option*> &OptionsMap) {
+ const StringMap<Option*> &OptionsMap,
+ const char *&NearestString) {
// Reject all dashes.
if (Arg.empty()) return 0;
@@ -197,11 +198,21 @@ static Option *LookupNearestOption(StringRef Arg,
unsigned BestDistance = 0;
for (StringMap<Option*>::const_iterator it = OptionsMap.begin(),
ie = OptionsMap.end(); it != ie; ++it) {
- unsigned Distance = StringRef(it->second->ArgStr).edit_distance(
- Arg, /*AllowReplacements=*/true, /*MaxEditDistance=*/BestDistance);
- if (!Best || Distance < BestDistance) {
- Best = it->second;
- BestDistance = Distance;
+ Option *O = it->second;
+ SmallVector<const char*, 16> OptionNames;
+ O->getExtraOptionNames(OptionNames);
+ if (O->ArgStr[0])
+ OptionNames.push_back(O->ArgStr);
+
+ for (size_t i = 0, e = OptionNames.size(); i != e; ++i) {
+ StringRef Name = OptionNames[i];
+ unsigned Distance = StringRef(Name).edit_distance(
+ Arg, /*AllowReplacements=*/true, /*MaxEditDistance=*/BestDistance);
+ if (!Best || Distance < BestDistance) {
+ Best = O;
+ NearestString = OptionNames[i];
+ BestDistance = Distance;
+ }
}
}
@@ -600,6 +611,7 @@ void cl::ParseCommandLineOptions(int argc, char **argv,
for (int i = 1; i < argc; ++i) {
Option *Handler = 0;
Option *NearestHandler = 0;
+ const char *NearestHandlerString = 0;
StringRef Value;
StringRef ArgName = "";
@@ -677,7 +689,8 @@ void cl::ParseCommandLineOptions(int argc, char **argv,
// Otherwise, look for the closest available option to report to the user
// in the upcoming error.
if (Handler == 0 && SinkOpts.empty())
- NearestHandler = LookupNearestOption(ArgName, Opts);
+ NearestHandler = LookupNearestOption(ArgName, Opts,
+ NearestHandlerString);
}
if (Handler == 0) {
@@ -685,9 +698,11 @@ void cl::ParseCommandLineOptions(int argc, char **argv,
errs() << ProgramName << ": Unknown command line argument '"
<< argv[i] << "'. Try: '" << argv[0] << " -help'\n";
- // If we know a near match, report it as well.
- errs() << ProgramName << ": Did you mean '-"
- << NearestHandler->ArgStr << "'?\n";
+ if (NearestHandler) {
+ // If we know a near match, report it as well.
+ errs() << ProgramName << ": Did you mean '-"
+ << NearestHandlerString << "'?\n";
+ }
ErrorParsing = true;
} else {