diff options
author | Yuka Takahashi <yukatkh@gmail.com> | 2017-08-23 13:39:47 +0000 |
---|---|---|
committer | Yuka Takahashi <yukatkh@gmail.com> | 2017-08-23 13:39:47 +0000 |
commit | c2ae4dbfbe624074ec17687fabc27a4bf2137db8 (patch) | |
tree | bc5ae4f4a3d3d8591348a2ae8f5a10bdd678269a /lib/Option | |
parent | 631020137d65fd384b764524f61dc032d58a7be9 (diff) |
[Bash-autocompletion] Add support for static analyzer flags
Summary:
This is a patch for clang autocomplete feature.
It will collect values which -analyzer-checker takes, which is defined in
clang/StaticAnalyzer/Checkers/Checkers.inc, dynamically.
First, from ValuesCode class in Options.td, TableGen will generate C++
code in Options.inc. Options.inc will be included in DriverOptions.cpp, and
calls OptTable's addValues function. addValues function will add second
argument to Option's Values class. Values contains string like "foo,bar,.."
which is handed to Values class
in OptTable.
Reviewers: v.g.vassilev, teemperor, ruiu
Subscribers: hiraditya, cfe-commits
Differential Revision: https://reviews.llvm.org/D36782
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311552 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Option')
-rw-r--r-- | lib/Option/OptTable.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/lib/Option/OptTable.cpp b/lib/Option/OptTable.cpp index 7910bea0dcc..d4486c6e8fd 100644 --- a/lib/Option/OptTable.cpp +++ b/lib/Option/OptTable.cpp @@ -196,7 +196,7 @@ static unsigned matchOption(const OptTable::Info *I, StringRef Str, // 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) + if (In.Prefixes) for (size_t I = 0; In.Prefixes[I]; I++) if (Option == std::string(In.Prefixes[I]) + In.Name) return true; @@ -209,8 +209,9 @@ static bool optionMatches(const OptTable::Info &In, StringRef Option) { 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)) + for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) { + const Info &In = OptionInfos[I]; + if (!In.Values || !optionMatches(In, Option)) continue; SmallVector<StringRef, 8> Candidates; @@ -228,7 +229,8 @@ OptTable::suggestValueCompletions(StringRef Option, StringRef Arg) const { std::vector<std::string> OptTable::findByPrefix(StringRef Cur, unsigned short DisableFlags) const { std::vector<std::string> Ret; - for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) { + for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) { + const Info &In = OptionInfos[I]; if (!In.Prefixes || (!In.HelpText && !In.GroupID)) continue; if (In.Flags & DisableFlags) @@ -245,6 +247,17 @@ OptTable::findByPrefix(StringRef Cur, unsigned short DisableFlags) const { return Ret; } +bool OptTable::addValues(const char *Option, const char *Values) { + for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) { + Info &In = OptionInfos[I]; + if (optionMatches(In, Option)) { + In.Values = Values; + return true; + } + } + return false; +} + Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, unsigned FlagsToInclude, unsigned FlagsToExclude) const { @@ -256,8 +269,8 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, if (isInput(PrefixesUnion, Str)) return new Arg(getOption(TheInputOptionID), Str, Index++, Str); - const Info *Start = OptionInfos.begin() + FirstSearchableIndex; - const Info *End = OptionInfos.end(); + const Info *Start = OptionInfos.data() + FirstSearchableIndex; + const Info *End = OptionInfos.data() + OptionInfos.size(); StringRef Name = StringRef(Str).ltrim(PrefixChars); // Search for the first next option which could be a prefix. |