summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Gesiak <modocache@gmail.com>2018-05-19 16:21:01 +0000
committerBrian Gesiak <modocache@gmail.com>2018-05-19 16:21:01 +0000
commit9968e0dd4975d3939e7810ac9e6c52cea7f1aeb1 (patch)
tree36e8bf1aade485efe159a4bb07a95d074ee90cc7
parente076700b7786959206acef136ecf05d54078e4e1 (diff)
downloadbcm5719-llvm-9968e0dd4975d3939e7810ac9e6c52cea7f1aeb1.tar.gz
bcm5719-llvm-9968e0dd4975d3939e7810ac9e6c52cea7f1aeb1.zip
Re-revert "[Option] Fix PR37006 prefix choice in findNearest"
Summary: Reverting due to a test failure in an llvm-mt test on some buildbots, namely http://green.lab.llvm.org/green/job/clang-stage2-configure-Rlto/26020/. llvm-svn: 332812
-rw-r--r--llvm/lib/Option/OptTable.cpp48
-rw-r--r--llvm/unittests/Option/OptionParsingTest.cpp4
-rw-r--r--llvm/unittests/Option/Opts.td1
3 files changed, 24 insertions, 29 deletions
diff --git a/llvm/lib/Option/OptTable.cpp b/llvm/lib/Option/OptTable.cpp
index 293b6e54e21..022b9d5d933 100644
--- a/llvm/lib/Option/OptTable.cpp
+++ b/llvm/lib/Option/OptTable.cpp
@@ -252,33 +252,38 @@ unsigned OptTable::findNearest(StringRef Option, std::string &NearestString,
unsigned MinimumLength) const {
assert(!Option.empty());
- // Consider each [option prefix + option name] pair as a candidate, finding
- // the closest match.
+ // Consider each option as a candidate, finding the closest match.
unsigned BestDistance = UINT_MAX;
for (const Info &CandidateInfo :
ArrayRef<Info>(OptionInfos).drop_front(FirstSearchableIndex)) {
StringRef CandidateName = CandidateInfo.Name;
- // We can eliminate some option prefix/name pairs as candidates right away:
- // * Ignore option candidates with empty names, such as "--", or names
- // that do not meet the minimum length.
+ // Ignore option candidates with empty names, such as "--", or names
+ // that do not meet the minimum length.
if (CandidateName.empty() || CandidateName.size() < MinimumLength)
continue;
- // * If FlagsToInclude were specified, ignore options that don't include
- // those flags.
+ // If FlagsToInclude were specified, ignore options that don't include
+ // those flags.
if (FlagsToInclude && !(CandidateInfo.Flags & FlagsToInclude))
continue;
- // * Ignore options that contain the FlagsToExclude.
+ // Ignore options that contain the FlagsToExclude.
if (CandidateInfo.Flags & FlagsToExclude)
continue;
- // * Ignore positional argument option candidates (which do not
- // have prefixes).
+ // Ignore positional argument option candidates (which do not
+ // have prefixes).
if (!CandidateInfo.Prefixes)
continue;
+ // Find the most appropriate prefix. For example, if a user asks for
+ // "--helm", suggest "--help" over "-help".
+ StringRef Prefix = CandidateInfo.Prefixes[0];
+ for (int P = 1; CandidateInfo.Prefixes[P]; P++) {
+ if (Option.startswith(CandidateInfo.Prefixes[P]))
+ Prefix = CandidateInfo.Prefixes[P];
+ }
- // Now check if the candidate ends with a character commonly used when
+ // Check if the candidate ends with a character commonly used when
// delimiting an option from its value, such as '=' or ':'. If it does,
// attempt to split the given option based on that delimiter.
std::string Delimiter = "";
@@ -292,19 +297,14 @@ unsigned OptTable::findNearest(StringRef Option, std::string &NearestString,
else
std::tie(LHS, RHS) = Option.split(Last);
- // Consider each possible prefix for each candidate to find the most
- // appropriate one. For example, if a user asks for "--helm", suggest
- // "--help" over "-help".
- for (int P = 0; const char *const CandidatePrefix = CandidateInfo.Prefixes[P]; P++) {
- std::string NormalizedName = (LHS + Delimiter).str();
- StringRef Candidate = (CandidatePrefix + CandidateName).str();
- unsigned Distance =
- Candidate.edit_distance(NormalizedName, /*AllowReplacements=*/true,
- /*MaxEditDistance=*/BestDistance);
- if (Distance < BestDistance) {
- BestDistance = Distance;
- NearestString = (Candidate + RHS).str();
- }
+ std::string NormalizedName =
+ (LHS.drop_front(Prefix.size()) + Delimiter).str();
+ unsigned Distance =
+ CandidateName.edit_distance(NormalizedName, /*AllowReplacements=*/true,
+ /*MaxEditDistance=*/BestDistance);
+ if (Distance < BestDistance) {
+ BestDistance = Distance;
+ NearestString = (Prefix + CandidateName + RHS).str();
}
}
return BestDistance;
diff --git a/llvm/unittests/Option/OptionParsingTest.cpp b/llvm/unittests/Option/OptionParsingTest.cpp
index 99c1ef32476..eef21ab5120 100644
--- a/llvm/unittests/Option/OptionParsingTest.cpp
+++ b/llvm/unittests/Option/OptionParsingTest.cpp
@@ -283,10 +283,6 @@ TEST(Option, FindNearest) {
EXPECT_EQ(Nearest, "-blorp");
EXPECT_EQ(1U, T.findNearest("--blorm", Nearest));
EXPECT_EQ(Nearest, "--blorp");
- EXPECT_EQ(1U, T.findNearest("-blarg", Nearest));
- EXPECT_EQ(Nearest, "-blarn");
- EXPECT_EQ(1U, T.findNearest("--blarm", Nearest));
- EXPECT_EQ(Nearest, "--blarn");
EXPECT_EQ(1U, T.findNearest("-fjormp", Nearest));
EXPECT_EQ(Nearest, "--fjormp");
diff --git a/llvm/unittests/Option/Opts.td b/llvm/unittests/Option/Opts.td
index e6151d375ef..c4544b5b3f9 100644
--- a/llvm/unittests/Option/Opts.td
+++ b/llvm/unittests/Option/Opts.td
@@ -30,7 +30,6 @@ def Slurp : Option<["-"], "slurp", KIND_REMAINING_ARGS>;
def SlurpJoined : Option<["-"], "slurpjoined", KIND_REMAINING_ARGS_JOINED>;
def Blorp : Flag<["-", "--"], "blorp">, HelpText<"The blorp option">, Flags<[OptFlag1]>;
-def Blarn : Flag<["--", "-"], "blarn">, HelpText<"The blarn option">, Flags<[OptFlag1]>;
def Cramb : Joined<["/"], "cramb:">, HelpText<"The cramb option">, MetaVarName<"CRAMB">, Flags<[OptFlag1]>;
def Doopf1 : Flag<["-"], "doopf1">, HelpText<"The doopf1 option">, Flags<[OptFlag1]>;
def Doopf2 : Flag<["-"], "doopf2">, HelpText<"The doopf2 option">, Flags<[OptFlag2]>;
OpenPOWER on IntegriCloud