[Bash-autocompletion] Auto complete cc1 options if -cc1 is specified
Summary: We don't want to autocomplete flags whose Flags class has `NoDriverOption` when argv[1] is not `-cc1`. Another idea for this implementation is to make --autocomplete a cc1 option and handle it in clang Frontend, by porting --autocomplete handler from Driver to Frontend, so that we can handle Driver options and CC1 options in unified manner. Differential Revision: https://reviews.llvm.org/D34770 llvm-svn: 307479
This commit is contained in:
parent
15309d1ce1
commit
33cf63b7f2
|
@ -1261,11 +1261,20 @@ bool Driver::HandleImmediateArgs(const Compilation &C) {
|
|||
StringRef PassedFlags = A->getValue();
|
||||
std::vector<std::string> SuggestedCompletions;
|
||||
|
||||
unsigned short DisableFlags = options::NoDriverOption | options::Unsupported | options::Ignored;
|
||||
// We want to show cc1-only options only when clang is invoked as "clang -cc1".
|
||||
// When clang is invoked as "clang -cc1", we add "#" to the beginning of an --autocomplete
|
||||
// option so that the clang driver can distinguish whether it is requested to show cc1-only options or not.
|
||||
if (PassedFlags[0] == '#') {
|
||||
DisableFlags &= ~options::NoDriverOption;
|
||||
PassedFlags = PassedFlags.substr(1);
|
||||
}
|
||||
|
||||
if (PassedFlags.find(',') == StringRef::npos) {
|
||||
// If the flag is in the form of "--autocomplete=-foo",
|
||||
// we were requested to print out all option names that start with "-foo".
|
||||
// For example, "--autocomplete=-fsyn" is expanded to "-fsyntax-only".
|
||||
SuggestedCompletions = Opts->findByPrefix(PassedFlags);
|
||||
SuggestedCompletions = Opts->findByPrefix(PassedFlags, DisableFlags);
|
||||
} else {
|
||||
// If the flag is in the form of "--autocomplete=foo,bar", we were
|
||||
// requested to print out all option values for "-foo" that start with
|
||||
|
|
|
@ -36,3 +36,7 @@
|
|||
// MTHREADMODELALL: posix single
|
||||
// RUN: %clang --autocomplete=-mrelocation-model, | FileCheck %s -check-prefix=MRELOCMODELALL
|
||||
// MRELOCMODELALL: dynamic-no-pic pic ropi ropi-rwpi rwpi static
|
||||
// RUN: %clang --autocomplete=-mrelocation-mode | FileCheck %s -check-prefix=MRELOCMODEL_CLANG
|
||||
// MRELOCMODEL_CLANG-NOT: -mrelocation-model
|
||||
// RUN: %clang --autocomplete=#-mrelocation-mode | FileCheck %s -check-prefix=MRELOCMODEL_CC1
|
||||
// MRELOCMODEL_CC1: -mrelocation-model
|
||||
|
|
|
@ -27,25 +27,29 @@ _clang()
|
|||
w1="${COMP_WORDS[$cword - 1]}"
|
||||
if [[ $cword > 1 ]]; then
|
||||
w2="${COMP_WORDS[$cword - 2]}"
|
||||
# Clang want to know if -cc1 or -Xclang option is specified or not, because we don't want to show
|
||||
# cc1 options otherwise.
|
||||
if [[ "${COMP_WORDS[1]}" == "-cc1" || "$w1" == "-Xclang" ]]; then
|
||||
arg="#"
|
||||
fi
|
||||
if [[ "$cur" == -* ]]; then
|
||||
# -foo<tab>
|
||||
arg="$cur"
|
||||
arg="$arg$cur"
|
||||
elif [[ "$w1" == -* && "$cur" == '=' ]]; then
|
||||
# -foo=<tab>
|
||||
arg="$w1=,"
|
||||
arg="$arg$w1=,"
|
||||
elif [[ "$cur" == -*= ]]; then
|
||||
# -foo=<tab>
|
||||
arg="$cur,"
|
||||
arg="$arg$cur,"
|
||||
elif [[ "$w1" == -* ]]; then
|
||||
# -foo <tab> or -foo bar<tab>
|
||||
arg="$w1,$cur"
|
||||
arg="$arg$w1,$cur"
|
||||
elif [[ "$w2" == -* && "$w1" == '=' ]]; then
|
||||
# -foo=bar<tab>
|
||||
arg="$w2=,$cur"
|
||||
arg="$arg$w2=,$cur"
|
||||
elif [[ ${cur: -1} != '=' && ${cur/=} != $cur ]]; then
|
||||
# -foo=bar<tab>
|
||||
arg="${cur%=*}=,${cur#*=}"
|
||||
arg="$arg${cur%=*}=,${cur#*=}"
|
||||
fi
|
||||
|
||||
# expand ~ to $HOME
|
||||
|
|
|
@ -140,7 +140,8 @@ public:
|
|||
// to start with.
|
||||
///
|
||||
/// \return The vector of flags which start with Cur.
|
||||
std::vector<std::string> findByPrefix(StringRef Cur) const;
|
||||
std::vector<std::string> findByPrefix(StringRef Cur,
|
||||
unsigned short DisableFlags) const;
|
||||
|
||||
/// \brief Parse a single argument; returning the new argument and
|
||||
/// updating Index.
|
||||
|
|
|
@ -225,11 +225,15 @@ OptTable::suggestValueCompletions(StringRef Option, StringRef Arg) const {
|
|||
return {};
|
||||
}
|
||||
|
||||
std::vector<std::string> OptTable::findByPrefix(StringRef Cur) 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)) {
|
||||
if (!In.Prefixes || (!In.HelpText && !In.GroupID))
|
||||
continue;
|
||||
if (In.Flags & DisableFlags)
|
||||
continue;
|
||||
|
||||
for (int I = 0; In.Prefixes[I]; I++) {
|
||||
std::string S = std::string(In.Prefixes[I]) + std::string(In.Name);
|
||||
if (StringRef(S).startswith(Cur))
|
||||
|
|
Loading…
Reference in New Issue