};
private:
- /// \brief The option information table.
- std::vector<Info> OptionInfos;
+ /// \brief The static option information table.
+ ArrayRef<Info> OptionInfos;
bool IgnoreCase;
unsigned TheInputOptionID = 0;
std::vector<std::string> findByPrefix(StringRef Cur,
unsigned short DisableFlags) const;
- /// Add Values to Option's Values class
- ///
- /// \param [in] Option - Prefix + Name of the flag which Values will be
- /// changed. For example, "-analyzer-checker".
- /// \param [in] Values - String of Values seperated by ",", such as
- /// "foo, bar..", where foo and bar is the argument which the Option flag
- /// takes
- ///
- /// \return true in success, and false in fail.
- bool addValues(const char *Option, const char *Values);
-
/// \brief Parse a single argument; returning the new argument and
/// updating Index.
///
// Returns true if one of the Prefixes + In.Names matches Option
static bool optionMatches(const OptTable::Info &In, StringRef Option) {
- if (In.Prefixes)
+ 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;
std::vector<std::string>
OptTable::suggestValueCompletions(StringRef Option, StringRef Arg) const {
// Search all options and return possible values.
- for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) {
- const Info &In = OptionInfos[I];
- if (!In.Values || !optionMatches(In, Option))
+ for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) {
+ if (!optionMatches(In, Option))
continue;
SmallVector<StringRef, 8> Candidates;
std::vector<std::string>
OptTable::findByPrefix(StringRef Cur, unsigned short DisableFlags) const {
std::vector<std::string> Ret;
- for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) {
- const Info &In = OptionInfos[I];
+ for (const Info &In : OptionInfos.slice(FirstSearchableIndex)) {
if (!In.Prefixes || (!In.HelpText && !In.GroupID))
continue;
if (In.Flags & DisableFlags)
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 {
if (isInput(PrefixesUnion, Str))
return new Arg(getOption(TheInputOptionID), Str, Index++, Str);
- const Info *Start = OptionInfos.data() + FirstSearchableIndex;
- const Info *End = OptionInfos.data() + OptionInfos.size();
+ const Info *Start = OptionInfos.begin() + FirstSearchableIndex;
+ const Info *End = OptionInfos.end();
StringRef Name = StringRef(Str).ltrim(PrefixChars);
// Search for the first next option which could be a prefix.
OS << ")\n";
}
OS << "#endif // OPTION\n";
-
- OS << "\n";
- OS << "#ifdef OPTTABLE_ARG_INIT\n";
- OS << "//////////\n";
- OS << "// Option Values\n\n";
- for (unsigned I = 0, E = Opts.size(); I != E; ++I) {
- const Record &R = *Opts[I];
- if (isa<UnsetInit>(R.getValueInit("ValuesCode")))
- continue;
- OS << "{\n";
- OS << R.getValueAsString("ValuesCode");
- OS << "\n";
- for (const std::string &Pref : R.getValueAsListOfStrings("Prefixes")) {
- OS << "bool ValuesWereAdded = ";
- OS << "Opt.addValues(";
- std::string S = (Pref + R.getValueAsString("Name")).str();
- write_cstring(OS, S);
- OS << ", Values);\n";
- OS << "(void)ValuesWereAdded;\n";
- OS << "assert(ValuesWereAdded && \"Couldn't add values to "
- "OptTable!\");\n";
- }
- OS << "}\n";
- }
- OS << "\n";
- OS << "#endif // OPTTABLE_ARG_INIT\n";
}
} // end namespace llvm