mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-26 05:25:47 +00:00
In option typo correction, consider -foo=VALUE flags as two distinct parts. The
comments claimed it did this, but the LHS value was actually an unused variable. The new system considers only the '-foo' part when comparing it for typos against flags that have values, but still look at the whole string for flags that don't. That way, we'll still correct '-inst=combine' to '-instcombine'. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130685 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -186,12 +186,14 @@ static Option *LookupOption(StringRef &Arg, StringRef &Value,
|
|||||||
/// have already been stripped.
|
/// have already been stripped.
|
||||||
static Option *LookupNearestOption(StringRef Arg,
|
static Option *LookupNearestOption(StringRef Arg,
|
||||||
const StringMap<Option*> &OptionsMap,
|
const StringMap<Option*> &OptionsMap,
|
||||||
const char *&NearestString) {
|
std::string &NearestString) {
|
||||||
// Reject all dashes.
|
// Reject all dashes.
|
||||||
if (Arg.empty()) return 0;
|
if (Arg.empty()) return 0;
|
||||||
|
|
||||||
// Split on any equal sign.
|
// Split on any equal sign.
|
||||||
StringRef LHS = Arg.split('=').first;
|
std::pair<StringRef, StringRef> SplitArg = Arg.split('=');
|
||||||
|
StringRef &LHS = SplitArg.first; // LHS == Arg when no '=' is present.
|
||||||
|
StringRef &RHS = SplitArg.second;
|
||||||
|
|
||||||
// Find the closest match.
|
// Find the closest match.
|
||||||
Option *Best = 0;
|
Option *Best = 0;
|
||||||
@@ -204,14 +206,19 @@ static Option *LookupNearestOption(StringRef Arg,
|
|||||||
if (O->ArgStr[0])
|
if (O->ArgStr[0])
|
||||||
OptionNames.push_back(O->ArgStr);
|
OptionNames.push_back(O->ArgStr);
|
||||||
|
|
||||||
|
bool PermitValue = O->getValueExpectedFlag() != cl::ValueDisallowed;
|
||||||
|
StringRef Flag = PermitValue ? LHS : Arg;
|
||||||
for (size_t i = 0, e = OptionNames.size(); i != e; ++i) {
|
for (size_t i = 0, e = OptionNames.size(); i != e; ++i) {
|
||||||
StringRef Name = OptionNames[i];
|
StringRef Name = OptionNames[i];
|
||||||
unsigned Distance = StringRef(Name).edit_distance(
|
unsigned Distance = StringRef(Name).edit_distance(
|
||||||
Arg, /*AllowReplacements=*/true, /*MaxEditDistance=*/BestDistance);
|
Flag, /*AllowReplacements=*/true, /*MaxEditDistance=*/BestDistance);
|
||||||
if (!Best || Distance < BestDistance) {
|
if (!Best || Distance < BestDistance) {
|
||||||
Best = O;
|
Best = O;
|
||||||
NearestString = OptionNames[i];
|
|
||||||
BestDistance = Distance;
|
BestDistance = Distance;
|
||||||
|
if (RHS.empty() || !PermitValue)
|
||||||
|
NearestString = OptionNames[i];
|
||||||
|
else
|
||||||
|
NearestString = std::string(OptionNames[i]) + "=" + RHS.str();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -611,7 +618,7 @@ void cl::ParseCommandLineOptions(int argc, char **argv,
|
|||||||
for (int i = 1; i < argc; ++i) {
|
for (int i = 1; i < argc; ++i) {
|
||||||
Option *Handler = 0;
|
Option *Handler = 0;
|
||||||
Option *NearestHandler = 0;
|
Option *NearestHandler = 0;
|
||||||
const char *NearestHandlerString = 0;
|
std::string NearestHandlerString;
|
||||||
StringRef Value;
|
StringRef Value;
|
||||||
StringRef ArgName = "";
|
StringRef ArgName = "";
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user