Author: yamaguchi Date: Wed Oct 24 05:43:25 2018 New Revision: 345133 URL: http://llvm.org/viewvc/llvm-project?rev=345133&view=rev Log: [autocompletion] Handle the space before pressing tab
Summary: Distinguish "--autocomplete=-someflag" and "--autocomplete=-someflag," because the latter indicates that the user put a space before pushing tab which should end up in a file completion. Differential Revision: https://reviews.llvm.org/D53639 Modified: cfe/trunk/lib/Driver/Driver.cpp cfe/trunk/test/Driver/autocomplete.c Modified: cfe/trunk/lib/Driver/Driver.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=345133&r1=345132&r2=345133&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Driver.cpp (original) +++ cfe/trunk/lib/Driver/Driver.cpp Wed Oct 24 05:43:25 2018 @@ -1508,6 +1508,11 @@ void Driver::HandleAutocompletions(Strin unsigned short DisableFlags = options::NoDriverOption | options::Unsupported | options::Ignored; + // Distinguish "--autocomplete=-someflag" and "--autocomplete=-someflag," + // because the latter indicates that the user put space before pushing tab + // which should end up in a file completion. + const bool HasSpace = PassedFlags.endswith(","); + // Parse PassedFlags by "," as all the command-line flags are passed to this // function separated by "," StringRef TargetFlags = PassedFlags; @@ -1534,6 +1539,16 @@ void Driver::HandleAutocompletions(Strin if (SuggestedCompletions.empty()) SuggestedCompletions = Opts->suggestValueCompletions(Cur, ""); + // If Flags were empty, it means the user typed `clang [tab]` where we should + // list all possible flags. If there was no value completion and the user + // pressed tab after a space, we should fall back to a file completion. + // We're printing a newline to be consistent with what we print at the end of + // this function. + if (SuggestedCompletions.empty() && HasSpace && !Flags.empty()) { + llvm::outs() << '\n'; + return; + } + // When flag ends with '=' and there was no value completion, return empty // string and fall back to the file autocompletion. if (SuggestedCompletions.empty() && !Cur.endswith("=")) { Modified: cfe/trunk/test/Driver/autocomplete.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/autocomplete.c?rev=345133&r1=345132&r2=345133&view=diff ============================================================================== --- cfe/trunk/test/Driver/autocomplete.c (original) +++ cfe/trunk/test/Driver/autocomplete.c Wed Oct 24 05:43:25 2018 @@ -25,6 +25,7 @@ // STDLIBALL-NEXT: platform // RUN: %clang --autocomplete=-meabi,d | FileCheck %s -check-prefix=MEABI // MEABI: default +// RUN: %clang --autocomplete=-meabi, | FileCheck %s -check-prefix=MEABIALL // RUN: %clang --autocomplete=-meabi | FileCheck %s -check-prefix=MEABIALL // MEABIALL: 4 // MEABIALL-NEXT: 5 @@ -121,3 +122,8 @@ // MODULE_FILE_EQUAL-NOT: -fmodule-file= // RUN: %clang --autocomplete=-fmodule-file | FileCheck %s -check-prefix=MODULE_FILE // MODULE_FILE: -fmodule-file= + +// RUN: %clang --autocomplete=-Qunused-arguments, | FileCheck %s -check-prefix=QUNUSED_COMMA +// QUNUSED_COMMA-NOT: -Qunused-arguments +// RUN: %clang --autocomplete=-Qunused-arguments | FileCheck %s -check-prefix=QUNUSED +// QUNUSED: -Qunused-arguments _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits