diff options
author | Daniel Dunbar <daniel@zuster.org> | 2011-01-24 17:27:17 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2011-01-24 17:27:17 +0000 |
commit | c98d82a7f0a2a0a8b939c611954d59bab677bfe7 (patch) | |
tree | 0dbf5dad42fc9467dd1d212584fd08421edd16fc /lib/Support | |
parent | ccea167db53f52b2cda639cd184655b86dbf3952 (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.cpp | 35 |
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 { |