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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits