r307479 - [Bash-autocompletion] Auto complete cc1 options if -cc1 is specified
Yuka Takahashi via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 8 10:48:59 PDT 2017
Author: yamaguchi
Date: Sat Jul 8 10:48:59 2017
New Revision: 307479
URL: http://llvm.org/viewvc/llvm-project?rev=307479&view=rev
Log:
[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
Modified:
cfe/trunk/lib/Driver/Driver.cpp
cfe/trunk/test/Driver/autocomplete.c
cfe/trunk/utils/bash-autocomplete.sh
Modified: cfe/trunk/lib/Driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=307479&r1=307478&r2=307479&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Driver.cpp (original)
+++ cfe/trunk/lib/Driver/Driver.cpp Sat Jul 8 10:48:59 2017
@@ -1261,11 +1261,20 @@ bool Driver::HandleImmediateArgs(const 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
Modified: cfe/trunk/test/Driver/autocomplete.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/autocomplete.c?rev=307479&r1=307478&r2=307479&view=diff
==============================================================================
--- cfe/trunk/test/Driver/autocomplete.c (original)
+++ cfe/trunk/test/Driver/autocomplete.c Sat Jul 8 10:48:59 2017
@@ -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
Modified: cfe/trunk/utils/bash-autocomplete.sh
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/bash-autocomplete.sh?rev=307479&r1=307478&r2=307479&view=diff
==============================================================================
--- cfe/trunk/utils/bash-autocomplete.sh (original)
+++ cfe/trunk/utils/bash-autocomplete.sh Sat Jul 8 10:48:59 2017
@@ -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
More information about the cfe-commits
mailing list