diff options
| author | Yuka Takahashi <yukatkh@gmail.com> | 2017-06-20 16:31:31 +0000 |
|---|---|---|
| committer | Yuka Takahashi <yukatkh@gmail.com> | 2017-06-20 16:31:31 +0000 |
| commit | ba5d4af49096fa863f04736c5b0f54ff54a23905 (patch) | |
| tree | f501ba91ae7394ac04304a26cb42abfef13078e7 /llvm/lib/Option | |
| parent | 7f5313cb9f41f5c0dabfb19c2cc82089189d3bec (diff) | |
| download | bcm5719-llvm-ba5d4af49096fa863f04736c5b0f54ff54a23905.tar.gz bcm5719-llvm-ba5d4af49096fa863f04736c5b0f54ff54a23905.zip | |
[GSoC] Flag value completion for clang
This is patch for GSoC project, bash-completion for clang.
To use this on bash, please run `source clang/utils/bash-autocomplete.sh`.
bash-autocomplete.sh is code for bash-completion.
In this patch, Options.td was mainly changed in order to add value class
in Options.inc.
llvm-svn: 305805
Diffstat (limited to 'llvm/lib/Option')
| -rw-r--r-- | llvm/lib/Option/OptTable.cpp | 34 | ||||
| -rw-r--r-- | llvm/lib/Option/Option.cpp | 1 |
2 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/Option/OptTable.cpp b/llvm/lib/Option/OptTable.cpp index 52a81ff0e15..acb9e8d015b 100644 --- a/llvm/lib/Option/OptTable.cpp +++ b/llvm/lib/Option/OptTable.cpp @@ -194,6 +194,37 @@ static unsigned matchOption(const OptTable::Info *I, StringRef Str, return 0; } +// Returns true if one of the Prefixes + In.Names matches Option +static bool optionMatches(const OptTable::Info &In, StringRef Option) { + if (In.Values && In.Prefixes) + for (size_t I = 0; In.Prefixes[I]; I++) + if (Option == std::string(In.Prefixes[I]) + In.Name) + return true; + return false; +} + +// This function is for flag value completion. +// Eg. When "-stdlib=" and "l" was passed to this function, it will return +// appropiriate values for stdlib, which starts with l. +std::vector<std::string> +OptTable::suggestValueCompletions(StringRef Option, StringRef Arg) const { + // Search all options and return possible values. + for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) { + if (!optionMatches(In, Option)) + continue; + + SmallVector<StringRef, 8> Candidates; + StringRef(In.Values).split(Candidates, ",", -1, false); + + std::vector<std::string> Result; + for (StringRef Val : Candidates) + if (Val.startswith(Arg)) + Result.push_back(Val); + return Result; + } + return {}; +} + std::vector<std::string> OptTable::findByPrefix(StringRef Cur) const { std::vector<std::string> Ret; for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) { @@ -336,6 +367,9 @@ static std::string getOptionHelpName(const OptTable &Opts, OptSpecifier Id) { case Option::FlagClass: break; + case Option::ValuesClass: + break; + case Option::SeparateClass: case Option::JoinedOrSeparateClass: case Option::RemainingArgsClass: case Option::RemainingArgsJoinedClass: Name += ' '; diff --git a/llvm/lib/Option/Option.cpp b/llvm/lib/Option/Option.cpp index 4832e659f02..bf9f040bde5 100644 --- a/llvm/lib/Option/Option.cpp +++ b/llvm/lib/Option/Option.cpp @@ -47,6 +47,7 @@ void Option::print(raw_ostream &O) const { P(UnknownClass); P(FlagClass); P(JoinedClass); + P(ValuesClass); P(SeparateClass); P(CommaJoinedClass); P(MultiArgClass); |

