[clang-tools-extra] r318287 - [clangd] Support returning a limited number of completion results.

Sam McCall via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 15 12:41:51 PST 2017


On Wed, Nov 15, 2017 at 8:46 PM, Sam McCall <sam.mccall at gmail.com> wrote:

> That sounds great - I think using the same default std as clang is what we
> want.
> Unfortunately, passing --std=c++11 isn't ideal - we want to keep using the
> existing logic to derive the std from the language of the input file.
> For now r318327 explicitly sets the target triple to -pc-, which should
> get us back to uniform behavior across platforms.
>
Well, this didn't fix it. Lacking a machine to test on, I'll try to disable
the tests on PS4 until this can be fixed in some other way.


> This is obviously a hack and makes for a rocky -std transition, I'll look
> into this.
>
> (All this defaulting only happens if the user hasn't set up a compilation
> database to tell clangd how to build their project - unfortunately the
> tests do this)
>
> On Wed, Nov 15, 2017 at 8:13 PM, Robinson, Paul <paul.robinson at sony.com>
> wrote:
>
>> Thanks for looking into it.
>>
>> I should point out that Clang is planning to update the default –std for
>> everyone, hopefully before 6.0 branches, and it might be best to be ready
>> for that rather than sticking with C++98.
>>
>> --paulr
>>
>>
>>
>> *From:* Sam McCall [mailto:sam.mccall at gmail.com]
>> *Sent:* Wednesday, November 15, 2017 11:09 AM
>> *To:* Robinson, Paul; Galina Kistanova
>> *Cc:* cfe-commits (cfe-commits at lists.llvm.org)
>> *Subject:* Re: [clang-tools-extra] r318287 - [clangd] Support returning
>> a limited number of completion results.
>>
>>
>>
>> Sorry about these - I've finally understood what's going on.
>>
>> It looks like the PS4 has a different default --std, which probably
>> doesn't make sense for clangd. I'll override it.
>>
>>
>>
>> On Wed, Nov 15, 2017 at 7:49 PM, Robinson, Paul <paul.robinson at sony.com>
>> wrote:
>>
>> Hi Sam,
>> It looks like llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast has been
>> failing a couple of clangd tests ever since this went in.
>>
>> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-
>> scei-ps4-windows10pro-fast/builds/13517
>>
>> Please fix or revert ASAP when bots go red.  Failures like this interfere
>> with our CI process.
>>
>> Thanks,
>> --paulr
>> PS4 code owner
>>
>>
>> > -----Original Message-----
>> > From: cfe-commits [mailto:cfe-commits-bounces at lists.llvm.org] On
>> Behalf Of
>> > Sam McCall via cfe-commits
>> > Sent: Wednesday, November 15, 2017 1:16 AM
>> > To: cfe-commits at lists.llvm.org
>> > Subject: [clang-tools-extra] r318287 - [clangd] Support returning a
>> > limited number of completion results.
>> >
>> > Author: sammccall
>> > Date: Wed Nov 15 01:16:29 2017
>> > New Revision: 318287
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=318287&view=rev
>> > Log:
>> > [clangd] Support returning a limited number of completion results.
>> >
>> > Summary:
>> > All results are scored, we only process CodeCompletionStrings for the
>> > winners.
>> > We now return CompletionList rather than CompletionItem[] (both are
>> > valid).
>> > sortText is now based on CodeCompletionResult::orderedName (mostly the
>> > same).
>> >
>> > This is the first clangd-only completion option, so plumbing changed.
>> > It requires a small clangd patch (exposing
>> > CodeCompletionResult::orderedName).
>> >
>> > (This can't usefully be enabled yet: we don't support server-side
>> > filtering)
>> >
>> > Reviewers: ilya-biryukov
>> >
>> > Subscribers: cfe-commits
>> >
>> > Differential Revision: https://reviews.llvm.org/D39852
>> >
>> > Modified:
>> >     clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
>> >     clang-tools-extra/trunk/clangd/ClangdServer.cpp
>> >     clang-tools-extra/trunk/clangd/ClangdServer.h
>> >     clang-tools-extra/trunk/clangd/ClangdUnit.cpp
>> >     clang-tools-extra/trunk/clangd/ClangdUnit.h
>> >     clang-tools-extra/trunk/clangd/Protocol.cpp
>> >     clang-tools-extra/trunk/clangd/Protocol.h
>> >     clang-tools-extra/trunk/test/clangd/authority-less-uri.test
>> >     clang-tools-extra/trunk/test/clangd/completion-items-kinds.test
>> >     clang-tools-extra/trunk/test/clangd/completion-priorities.test
>> >     clang-tools-extra/trunk/test/clangd/completion-qualifiers.test
>> >     clang-tools-extra/trunk/test/clangd/completion-snippet.test
>> >     clang-tools-extra/trunk/test/clangd/completion.test
>> >     clang-tools-extra/trunk/test/clangd/protocol.test
>> >     clang-tools-extra/trunk/unittests/clangd/ClangdTests.cpp
>> >
>> > Modified: clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/clangd/ClangdLSPServer.cpp?rev=318287&r1=318286&
>> r2=318287&view
>> > =diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp (original)
>> > +++ clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp Wed Nov 15
>> 01:16:29
>> > 2017
>> > @@ -195,15 +195,15 @@ void ClangdLSPServer::onCodeAction(Ctx C
>> >  }
>> >
>> >  void ClangdLSPServer::onCompletion(Ctx C, TextDocumentPositionParams
>> > &Params) {
>> > -  auto Items = Server
>> > -                   .codeComplete(Params.textDocument.uri.file,
>> > -                                 Position{Params.position.line,
>> > -                                          Params.position.character})
>> > -                   .get() // FIXME(ibiryukov): This could be made async
>> > if we
>> > -                          // had an API that would allow to attach
>> > callbacks to
>> > -                          // futures returned by ClangdServer.
>> > -                   .Value;
>> > -  C.reply(json::ary(Items));
>> > +  auto List = Server
>> > +                  .codeComplete(
>> > +                      Params.textDocument.uri.file,
>> > +                      Position{Params.position.line,
>> > Params.position.character})
>> > +                  .get() // FIXME(ibiryukov): This could be made async
>> if
>> > we
>> > +                         // had an API that would allow to attach
>> > callbacks to
>> > +                         // futures returned by ClangdServer.
>> > +                  .Value;
>> > +  C.reply(List);
>> >  }
>> >
>> >  void ClangdLSPServer::onSignatureHelp(Ctx C,
>> >
>> > Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/clangd/ClangdServer.cpp?rev=318287&r1=318286&r2=
>> 318287&view=di
>> > ff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original)
>> > +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Wed Nov 15 01:16:29
>> > 2017
>> > @@ -222,11 +222,11 @@ std::future<void> ClangdServer::forceRep
>> >                                   std::move(TaggedFS));
>> >  }
>> >
>> > -std::future<Tagged<std::vector<CompletionItem>>>
>> > +std::future<Tagged<CompletionList>>
>> >  ClangdServer::codeComplete(PathRef File, Position Pos,
>> >                             llvm::Optional<StringRef> OverridenContents,
>> >                             IntrusiveRefCntPtr<vfs::FileSystem>
>> *UsedFS) {
>> > -  using ResultType = Tagged<std::vector<CompletionItem>>;
>> > +  using ResultType = Tagged<CompletionList>;
>> >
>> >    std::promise<ResultType> ResultPromise;
>> >
>> > @@ -242,11 +242,10 @@ ClangdServer::codeComplete(PathRef File,
>> >  }
>> >
>> >  void ClangdServer::codeComplete(
>> > -    UniqueFunction<void(Tagged<std::vector<CompletionItem>>)>
>> Callback,
>> > -    PathRef File, Position Pos, llvm::Optional<StringRef>
>> > OverridenContents,
>> > +    UniqueFunction<void(Tagged<CompletionList>)> Callback, PathRef
>> File,
>> > +    Position Pos, llvm::Optional<StringRef> OverridenContents,
>> >      IntrusiveRefCntPtr<vfs::FileSystem> *UsedFS) {
>> > -  using CallbackType =
>> > -      UniqueFunction<void(Tagged<std::vector<CompletionItem>>)>;
>> > +  using CallbackType = UniqueFunction<void(Tagged<CompletionList>)>;
>> >
>> >    std::string Contents;
>> >    if (OverridenContents) {
>> > @@ -283,7 +282,7 @@ void ClangdServer::codeComplete(
>> >          // FIXME(ibiryukov): even if Preamble is non-null, we may want
>> to
>> > check
>> >          // both the old and the new version in case only one of them
>> > matches.
>> >
>> > -        std::vector<CompletionItem> Result = clangd::codeComplete(
>> > +        CompletionList Result = clangd::codeComplete(
>> >              File, Resources->getCompileCommand(),
>> >              Preamble ? &Preamble->Preamble : nullptr, Contents, Pos,
>> >              TaggedFS.Value, PCHs, CodeCompleteOpts, Logger);
>> >
>> > Modified: clang-tools-extra/trunk/clangd/ClangdServer.h
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/clangd/ClangdServer.h?rev=318287&r1=318286&r2=
>> 318287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/clangd/ClangdServer.h (original)
>> > +++ clang-tools-extra/trunk/clangd/ClangdServer.h Wed Nov 15 01:16:29
>> 2017
>> > @@ -251,18 +251,17 @@ public:
>> >    /// This method should only be called for currently tracked files.
>> > However, it
>> >    /// is safe to call removeDocument for \p File after this method
>> > returns, even
>> >    /// while returned future is not yet ready.
>> > -  std::future<Tagged<std::vector<CompletionItem>>>
>> > +  std::future<Tagged<CompletionList>>
>> >    codeComplete(PathRef File, Position Pos,
>> >                 llvm::Optional<StringRef> OverridenContents =
>> llvm::None,
>> >                 IntrusiveRefCntPtr<vfs::FileSystem> *UsedFS = nullptr);
>> >
>> >    /// A version of `codeComplete` that runs \p Callback on the
>> processing
>> > thread
>> >    /// when codeComplete results become available.
>> > -  void codeComplete(
>> > -      UniqueFunction<void(Tagged<std::vector<CompletionItem>>)>
>> Callback,
>> > -      PathRef File, Position Pos,
>> > -      llvm::Optional<StringRef> OverridenContents = llvm::None,
>> > -      IntrusiveRefCntPtr<vfs::FileSystem> *UsedFS = nullptr);
>> > +  void codeComplete(UniqueFunction<void(Tagged<CompletionList>)>
>> > Callback,
>> > +                    PathRef File, Position Pos,
>> > +                    llvm::Optional<StringRef> OverridenContents =
>> > llvm::None,
>> > +                    IntrusiveRefCntPtr<vfs::FileSystem> *UsedFS =
>> > nullptr);
>> >
>> >    /// Provide signature help for \p File at \p Pos. If \p
>> > OverridenContents is
>> >    /// not None, they will used only for signature help, i.e. no
>> > diagnostics
>> >
>> > Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/clangd/ClangdUnit.cpp?rev=318287&r1=318286&r2=31
>> 8287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original)
>> > +++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Wed Nov 15 01:16:29
>> 2017
>> > @@ -368,28 +368,90 @@ std::string getDocumentation(const CodeC
>> >    return Result;
>> >  }
>> >
>> > +/// A scored code completion result.
>> > +/// It may be promoted to a CompletionItem if it's among the top-ranked
>> > results.
>> > +struct CompletionCandidate {
>> > +  CompletionCandidate(CodeCompletionResult &Result)
>> > +      : Result(&Result), Score(score(Result)) {}
>> > +
>> > +  CodeCompletionResult *Result;
>> > +  // Higher score is worse. FIXME: use a more natural scale!
>> > +  int Score;
>> > +
>> > +  // Comparison reflects rank: better candidates are smaller.
>> > +  bool operator<(const CompletionCandidate &C) const {
>> > +    if (Score != C.Score)
>> > +      return Score < C.Score;
>> > +    return *Result < *C.Result;
>> > +  }
>> > +
>> > +  std::string sortText() const {
>> > +    // Fill in the sortText of the CompletionItem.
>> > +    assert(Score <= 999999 && "Expecting score to have at most 6-
>> > digits");
>> > +    std::string S, NameStorage;
>> > +    StringRef Name = Result->getOrderedName(NameStorage);
>> > +    llvm::raw_string_ostream(S)
>> > +        << llvm::format("%06d%.*s", Score, Name.size(), Name.data());
>> > +    return S;
>> > +  }
>> > +
>> > +private:
>> > +  static int score(const CodeCompletionResult &Result) {
>> > +    int Score = Result.Priority;
>> > +    // Fill in the sortText of the CompletionItem.
>> > +    assert(Score <= 99999 && "Expecting code completion result "
>> > +                             "priority to have at most 5-digits");
>> > +
>> > +    const int Penalty = 100000;
>> > +    switch (static_cast<CXAvailabilityKind>(Result.Availability)) {
>> > +    case CXAvailability_Available:
>> > +      // No penalty.
>> > +      break;
>> > +    case CXAvailability_Deprecated:
>> > +      Score += Penalty;
>> > +      break;
>> > +    case CXAvailability_NotAccessible:
>> > +      Score += 2 * Penalty;
>> > +      break;
>> > +    case CXAvailability_NotAvailable:
>> > +      Score += 3 * Penalty;
>> > +      break;
>> > +    }
>> > +    return Score;
>> > +  }
>> > +};
>> > +
>> >  class CompletionItemsCollector : public CodeCompleteConsumer {
>> >  public:
>> > -  CompletionItemsCollector(const clang::CodeCompleteOptions
>> > &CodeCompleteOpts,
>> > -                           std::vector<CompletionItem> &Items)
>> > -      : CodeCompleteConsumer(CodeCompleteOpts,
>> /*OutputIsBinary=*/false),
>> > -        Items(Items),
>> > +  CompletionItemsCollector(const clangd::CodeCompleteOptions
>> > &CodeCompleteOpts,
>> > +                           CompletionList &Items)
>> > +      : CodeCompleteConsumer(CodeCompleteOpts.getClangCompleteOpts(),
>> > +                             /*OutputIsBinary=*/false),
>> > +        ClangdOpts(CodeCompleteOpts), Items(Items),
>> >
>> > Allocator(std::make_shared<clang::GlobalCodeCompletionAllocator>()),
>> >          CCTUInfo(Allocator) {}
>> >
>> >    void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext
>> Context,
>> >                                    CodeCompletionResult *Results,
>> >                                    unsigned NumResults) override final {
>> > -    Items.reserve(NumResults);
>> > +    std::priority_queue<CompletionCandidate> Candidates;
>> >      for (unsigned I = 0; I < NumResults; ++I) {
>> > -      auto &Result = Results[I];
>> > -      const auto *CCS = Result.CreateCodeCompletionString(
>> > +      Candidates.emplace(Results[I]);
>> > +      if (ClangdOpts.Limit && Candidates.size() > ClangdOpts.Limit) {
>> > +        Candidates.pop();
>> > +        Items.isIncomplete = true;
>> > +      }
>> > +    }
>> > +    while (!Candidates.empty()) {
>> > +      auto &Candidate = Candidates.top();
>> > +      const auto *CCS = Candidate.Result->CreateCodeCompletionString(
>> >            S, Context, *Allocator, CCTUInfo,
>> >            CodeCompleteOpts.IncludeBriefComments);
>> >        assert(CCS && "Expected the CodeCompletionString to be
>> non-null");
>> > -      Items.push_back(ProcessCodeCompleteResult(Result, *CCS));
>> > +      Items.items.push_back(ProcessCodeCompleteResult(Candidate,
>> *CCS));
>> > +      Candidates.pop();
>> >      }
>> > -    std::sort(Items.begin(), Items.end());
>> > +    std::reverse(Items.items.begin(), Items.items.end());
>> >    }
>> >
>> >    GlobalCodeCompletionAllocator &getAllocator() override { return
>> > *Allocator; }
>> > @@ -398,7 +460,7 @@ public:
>> >
>> >  private:
>> >    CompletionItem
>> > -  ProcessCodeCompleteResult(const CodeCompletionResult &Result,
>> > +  ProcessCodeCompleteResult(const CompletionCandidate &Candidate,
>> >                              const CodeCompletionString &CCS) const {
>> >
>> >      // Adjust this to InsertTextFormat::Snippet iff we encounter a
>> > @@ -407,15 +469,14 @@ private:
>> >      Item.insertTextFormat = InsertTextFormat::PlainText;
>> >
>> >      Item.documentation = getDocumentation(CCS);
>> > +    Item.sortText = Candidate.sortText();
>> >
>> >      // Fill in the label, detail, insertText and filterText fields of
>> the
>> >      // CompletionItem.
>> >      ProcessChunks(CCS, Item);
>> >
>> >      // Fill in the kind field of the CompletionItem.
>> > -    Item.kind = getKind(Result.Kind, Result.CursorKind);
>> > -
>> > -    FillSortText(CCS, Item);
>> > +    Item.kind = getKind(Candidate.Result->Kind, Candidate.Result-
>> > >CursorKind);
>> >
>> >      return Item;
>> >    }
>> > @@ -423,42 +484,8 @@ private:
>> >    virtual void ProcessChunks(const CodeCompletionString &CCS,
>> >                               CompletionItem &Item) const = 0;
>> >
>> > -  static int GetSortPriority(const CodeCompletionString &CCS) {
>> > -    int Score = CCS.getPriority();
>> > -    // Fill in the sortText of the CompletionItem.
>> > -    assert(Score <= 99999 && "Expecting code completion result "
>> > -                             "priority to have at most 5-digits");
>> > -
>> > -    const int Penalty = 100000;
>> > -    switch (static_cast<CXAvailabilityKind>(CCS.getAvailability())) {
>> > -    case CXAvailability_Available:
>> > -      // No penalty.
>> > -      break;
>> > -    case CXAvailability_Deprecated:
>> > -      Score += Penalty;
>> > -      break;
>> > -    case CXAvailability_NotAccessible:
>> > -      Score += 2 * Penalty;
>> > -      break;
>> > -    case CXAvailability_NotAvailable:
>> > -      Score += 3 * Penalty;
>> > -      break;
>> > -    }
>> > -
>> > -    return Score;
>> > -  }
>> > -
>> > -  static void FillSortText(const CodeCompletionString &CCS,
>> > -                           CompletionItem &Item) {
>> > -    int Priority = GetSortPriority(CCS);
>> > -    // Fill in the sortText of the CompletionItem.
>> > -    assert(Priority <= 999999 &&
>> > -           "Expecting sort priority to have at most 6-digits");
>> > -    llvm::raw_string_ostream(Item.sortText)
>> > -        << llvm::format("%06d%s", Priority, Item.filterText.c_str());
>> > -  }
>> > -
>> > -  std::vector<CompletionItem> &Items;
>> > +  clangd::CodeCompleteOptions ClangdOpts;
>> > +  CompletionList &Items;
>> >    std::shared_ptr<clang::GlobalCodeCompletionAllocator> Allocator;
>> >    CodeCompletionTUInfo CCTUInfo;
>> >
>> > @@ -474,8 +501,8 @@ class PlainTextCompletionItemsCollector
>> >
>> >  public:
>> >    PlainTextCompletionItemsCollector(
>> > -      const clang::CodeCompleteOptions &CodeCompleteOpts,
>> > -      std::vector<CompletionItem> &Items)
>> > +      const clangd::CodeCompleteOptions &CodeCompleteOpts,
>> > +      CompletionList &Items)
>> >        : CompletionItemsCollector(CodeCompleteOpts, Items) {}
>> >
>> >  private:
>> > @@ -511,8 +538,8 @@ class SnippetCompletionItemsCollector fi
>> >
>> >  public:
>> >    SnippetCompletionItemsCollector(
>> > -      const clang::CodeCompleteOptions &CodeCompleteOpts,
>> > -      std::vector<CompletionItem> &Items)
>> > +      const clangd::CodeCompleteOptions &CodeCompleteOpts,
>> > +      CompletionList &Items)
>> >        : CompletionItemsCollector(CodeCompleteOpts, Items) {}
>> >
>> >  private:
>> > @@ -795,7 +822,8 @@ clangd::CodeCompleteOptions::CodeComplet
>> >        IncludeMacros(IncludeMacros), IncludeGlobals(IncludeGlobals),
>> >        IncludeBriefComments(IncludeBriefComments) {}
>> >
>> > -clang::CodeCompleteOptions
>> > clangd::CodeCompleteOptions::getClangCompleteOpts() {
>> > +clang::CodeCompleteOptions
>> > +clangd::CodeCompleteOptions::getClangCompleteOpts() const {
>> >    clang::CodeCompleteOptions Result;
>> >    Result.IncludeCodePatterns = EnableSnippets && IncludeCodePatterns;
>> >    Result.IncludeMacros = IncludeMacros;
>> > @@ -805,25 +833,24 @@ clang::CodeCompleteOptions clangd::CodeC
>> >    return Result;
>> >  }
>> >
>> > -std::vector<CompletionItem>
>> > +CompletionList
>> >  clangd::codeComplete(PathRef FileName, const tooling::CompileCommand
>> > &Command,
>> >                       PrecompiledPreamble const *Preamble, StringRef
>> > Contents,
>> >                       Position Pos, IntrusiveRefCntPtr<vfs::FileSystem>
>> > VFS,
>> >                       std::shared_ptr<PCHContainerOperations> PCHs,
>> >                       clangd::CodeCompleteOptions Opts, clangd::Logger
>> > &Logger) {
>> > -  std::vector<CompletionItem> Results;
>> > +  CompletionList Results;
>> >    std::unique_ptr<CodeCompleteConsumer> Consumer;
>> > -  clang::CodeCompleteOptions ClangCompleteOpts =
>> > Opts.getClangCompleteOpts();
>> >    if (Opts.EnableSnippets) {
>> > -    Consumer = llvm::make_unique<SnippetCompletionItemsCollector>(
>> > -        ClangCompleteOpts, Results);
>> > +    Consumer =
>> > +        llvm::make_unique<SnippetCompletionItemsCollector>(Opts,
>> > Results);
>> >    } else {
>> > -    Consumer = llvm::make_unique<PlainTextCompletionItemsCollector>(
>> > -        ClangCompleteOpts, Results);
>> > +    Consumer =
>> > +        llvm::make_unique<PlainTextCompletionItemsCollector>(Opts,
>> > Results);
>> >    }
>> > -  invokeCodeComplete(std::move(Consumer), ClangCompleteOpts, FileName,
>> > Command,
>> > -                     Preamble, Contents, Pos, std::move(VFS),
>> > std::move(PCHs),
>> > -                     Logger);
>> > +  invokeCodeComplete(std::move(Consumer), Opts.getClangCompleteOpts(),
>> > FileName,
>> > +                     Command, Preamble, Contents, Pos, std::move(VFS),
>> > +                     std::move(PCHs), Logger);
>> >    return Results;
>> >  }
>> >
>> >
>> > Modified: clang-tools-extra/trunk/clangd/ClangdUnit.h
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/clangd/ClangdUnit.h?rev=318287&r1=318286&r2=3182
>> 87&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/clangd/ClangdUnit.h (original)
>> > +++ clang-tools-extra/trunk/clangd/ClangdUnit.h Wed Nov 15 01:16:29
>> 2017
>> > @@ -263,7 +263,7 @@ struct CodeCompleteOptions {
>> >                        bool IncludeBriefComments);
>> >
>> >    /// Returns options that can be passed to clang's completion engine.
>> > -  clang::CodeCompleteOptions getClangCompleteOpts();
>> > +  clang::CodeCompleteOptions getClangCompleteOpts() const;
>> >
>> >    /// When true, completion items will contain expandable code snippets
>> > in
>> >    /// completion (e.g.  `return ${1:expression}` or `foo(${1:int a},
>> > ${2:int
>> > @@ -285,10 +285,14 @@ struct CodeCompleteOptions {
>> >    /// FIXME(ibiryukov): it looks like turning this option on
>> > significantly slows
>> >    /// down completion, investigate if it can be made faster.
>> >    bool IncludeBriefComments = true;
>> > +
>> > +  /// Limit the number of results returned (0 means no limit).
>> > +  /// If more results are available, we set
>> CompletionList.isIncomplete.
>> > +  size_t Limit = 0;
>> >  };
>> >
>> >  /// Get code completions at a specified \p Pos in \p FileName.
>> > -std::vector<CompletionItem>
>> > +CompletionList
>> >  codeComplete(PathRef FileName, const tooling::CompileCommand &Command,
>> >               PrecompiledPreamble const *Preamble, StringRef Contents,
>> >               Position Pos, IntrusiveRefCntPtr<vfs::FileSystem> VFS,
>> >
>> > Modified: clang-tools-extra/trunk/clangd/Protocol.cpp
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/clangd/Protocol.cpp?rev=318287&r1=318286&r2=3182
>> 87&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/clangd/Protocol.cpp (original)
>> > +++ clang-tools-extra/trunk/clangd/Protocol.cpp Wed Nov 15 01:16:29
>> 2017
>> > @@ -1043,6 +1043,13 @@ bool clangd::operator<(const CompletionI
>> >           (R.sortText.empty() ? R.label : R.sortText);
>> >  }
>> >
>> > +json::Expr CompletionList::unparse(const CompletionList &L) {
>> > +  return json::obj{
>> > +      {"isIncomplete", L.isIncomplete},
>> > +      {"items", json::ary(L.items)},
>> > +  };
>> > +}
>> > +
>> >  json::Expr ParameterInformation::unparse(const ParameterInformation
>> &PI)
>> > {
>> >    assert(!PI.label.empty() && "parameter information label is
>> required");
>> >    json::obj Result{{"label", PI.label}};
>> >
>> > Modified: clang-tools-extra/trunk/clangd/Protocol.h
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/clangd/Protocol.h?rev=318287&r1=318286&r2=318287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/clangd/Protocol.h (original)
>> > +++ clang-tools-extra/trunk/clangd/Protocol.h Wed Nov 15 01:16:29 2017
>> > @@ -547,6 +547,18 @@ struct CompletionItem {
>> >
>> >  bool operator<(const CompletionItem &, const CompletionItem &);
>> >
>> > +/// Represents a collection of completion items to be presented in the
>> > editor.
>> > +struct CompletionList {
>> > +  /// The list is not complete. Further typing should result in
>> > recomputing the
>> > +  /// list.
>> > +  bool isIncomplete = false;
>> > +
>> > +  /// The completion items.
>> > +  std::vector<CompletionItem> items;
>> > +
>> > +  static json::Expr unparse(const CompletionList &);
>> > +};
>> > +
>> >  /// A single parameter of a particular signature.
>> >  struct ParameterInformation {
>> >
>> >
>> > Modified: clang-tools-extra/trunk/test/clangd/authority-less-uri.test
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/test/clangd/authority-less-
>> > uri.test?rev=318287&r1=318286&r2=318287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/test/clangd/authority-less-uri.test
>> (original)
>> > +++ clang-tools-extra/trunk/test/clangd/authority-less-uri.test Wed
>> Nov 15
>> > 01:16:29 2017
>> > @@ -17,14 +17,17 @@ Content-Length: 146
>> >  #
>> >  #      CHECK:  "id": 1,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -#      CHECK:      "filterText": "fake",
>> > -# CHECK-NEXT:      "insertText": "fake",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 7,
>> > -# CHECK-NEXT:      "label": "fake::",
>> > -# CHECK-NEXT:      "sortText": "000075fake"
>> > -#      CHECK:  ]
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +#      CHECK:        "filterText": "fake",
>> > +# CHECK-NEXT:        "insertText": "fake",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 7,
>> > +# CHECK-NEXT:        "label": "fake::",
>> > +# CHECK-NEXT:        "sortText": "000075fake"
>> > +#      CHECK:    ]
>> > +# CHECK-NEXT:  }
>> >  Content-Length: 172
>> >
>> >
>> > {"jsonrpc":"2.0","id":2,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"uri":"file:///main.cpp
>> ","position":{
>> > "line":3,"character":5}}}
>> > @@ -32,14 +35,17 @@ Content-Length: 172
>> >  #
>> >  #      CHECK:  "id": 2,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -#      CHECK:      "filterText": "fake",
>> > -# CHECK-NEXT:      "insertText": "fake",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 7,
>> > -# CHECK-NEXT:      "label": "fake::",
>> > -# CHECK-NEXT:      "sortText": "000075fake"
>> > -#      CHECK:  ]
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +#      CHECK:        "filterText": "fake",
>> > +# CHECK-NEXT:        "insertText": "fake",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 7,
>> > +# CHECK-NEXT:        "label": "fake::",
>> > +# CHECK-NEXT:        "sortText": "000075fake"
>> > +#      CHECK:    ]
>> > +# CHECK-NEXT:  }
>> >  Content-Length: 44
>> >
>> >  {"jsonrpc":"2.0","id":3,"method":"shutdown"}
>> >
>> > Modified: clang-tools-extra/trunk/test/clangd/completion-items-kinds.t
>> est
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/test/clangd/completion-items-
>> > kinds.test?rev=318287&r1=318286&r2=318287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/test/clangd/completion-items-kinds.test
>> > (original)
>> > +++ clang-tools-extra/trunk/test/clangd/completion-items-kinds.test Wed
>> > Nov 15 01:16:29 2017
>> > @@ -11,7 +11,7 @@ Content-Length: 148
>> >
>> >
>> > {"jsonrpc":"2.0","id":1,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":4,"
>> character":7}}}
>> >  Content-Length: 58
>> > -# CHECK: {"id":1,"jsonrpc":"2.0","result":[
>> > +# CHECK: {"id":1,"jsonrpc":"2.0","result":{"isIncomplete":false,"
>> items":
>> >  #
>> >  # Keyword
>> >  # CHECK-DAG:
>> > {"filterText":"int","insertText":"int","insertTextFormat":1,
>> "kind":14,"lab
>> > el":"int","sortText":"000050int"}
>> > @@ -31,6 +31,6 @@ Content-Length: 58
>> >  # Function
>> >  # CHECK-DAG:
>> > {"detail":"int","filterText":"function","insertText":"functi
>> on()","insertT
>> > extFormat":1,"kind":3,"label":"function()","sortText":"000012function"}
>> >  #
>> > -# CHECK-SAME: ]}
>> > +# CHECK-SAME: ]}}
>> >
>> >  {"jsonrpc":"2.0","id":3,"method":"shutdown","params":null}
>> >
>> > Modified: clang-tools-extra/trunk/test/clangd/completion-priorities.te
>> st
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/test/clangd/completion-
>> > priorities.test?rev=318287&r1=318286&r2=318287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/test/clangd/completion-priorities.test
>> > (original)
>> > +++ clang-tools-extra/trunk/test/clangd/completion-priorities.test Wed
>> Nov
>> > 15 01:16:29 2017
>> > @@ -15,69 +15,74 @@ Content-Length: 151
>> >
>> > {"jsonrpc":"2.0","id":2,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":12,"
>> character":8}}
>> > }
>> >  #      CHECK:  "id": 2,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "void",
>> > -# CHECK-NEXT:      "filterText": "priv",
>> > -# CHECK-NEXT:      "insertText": "priv",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "priv()",
>> > -# CHECK-NEXT:      "sortText": "000034priv"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "void",
>> > -# CHECK-NEXT:      "filterText": "prot",
>> > -# CHECK-NEXT:      "insertText": "prot",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "prot()",
>> > -# CHECK-NEXT:      "sortText": "000034prot"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "void",
>> > -# CHECK-NEXT:      "filterText": "pub",
>> > -# CHECK-NEXT:      "insertText": "pub",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "pub()",
>> > -# CHECK-NEXT:      "sortText": "000034pub"
>> > -# CHECK-NEXT:    },
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "void",
>> > +# CHECK-NEXT:        "filterText": "priv",
>> > +# CHECK-NEXT:        "insertText": "priv",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "priv()",
>> > +# CHECK-NEXT:        "sortText": "000034priv"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "void",
>> > +# CHECK-NEXT:        "filterText": "prot",
>> > +# CHECK-NEXT:        "insertText": "prot",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "prot()",
>> > +# CHECK-NEXT:        "sortText": "000034prot"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "void",
>> > +# CHECK-NEXT:        "filterText": "pub",
>> > +# CHECK-NEXT:        "insertText": "pub",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "pub()",
>> > +# CHECK-NEXT:        "sortText": "000034pub"
>> > +# CHECK-NEXT:      },
>> >  Content-Length: 151
>> >
>> >
>> > {"jsonrpc":"2.0","id":3,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":17,"
>> character":4}}
>> > }
>> >  #      CHECK:  "id": 3,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "void",
>> > -# CHECK-NEXT:      "filterText": "pub",
>> > -# CHECK-NEXT:      "insertText": "pub",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "pub()",
>> > -# CHECK-NEXT:      "sortText": "000034pub"
>> > -# CHECK-NEXT:    },
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "void",
>> > +# CHECK-NEXT:        "filterText": "pub",
>> > +# CHECK-NEXT:        "insertText": "pub",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "pub()",
>> > +# CHECK-NEXT:        "sortText": "000034pub"
>> > +# CHECK-NEXT:      },
>> >  # priv() and prot() are at the end of the list
>> > -# CHECK-NEXT:    {
>> > -#      CHECK:      "detail": "void",
>> > -#      CHECK:      "filterText": "priv",
>> > -# CHECK-NEXT:      "insertText": "priv",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "priv()",
>> > -# CHECK-NEXT:      "sortText": "200034priv"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "void",
>> > -# CHECK-NEXT:      "filterText": "prot",
>> > -# CHECK-NEXT:      "insertText": "prot",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "prot()",
>> > -# CHECK-NEXT:      "sortText": "200034prot"
>> > -# CHECK-NEXT:    }
>> > -# CHECK-NEXT:  ]
>> > +# CHECK-NEXT:      {
>> > +#      CHECK:        "detail": "void",
>> > +#      CHECK:        "filterText": "priv",
>> > +# CHECK-NEXT:        "insertText": "priv",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "priv()",
>> > +# CHECK-NEXT:        "sortText": "200034priv"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "void",
>> > +# CHECK-NEXT:        "filterText": "prot",
>> > +# CHECK-NEXT:        "insertText": "prot",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "prot()",
>> > +# CHECK-NEXT:        "sortText": "200034prot"
>> > +# CHECK-NEXT:      }
>> > +# CHECK-NEXT:    ]
>> > +# CHECK-NEXT:  }
>> >  Content-Length: 58
>> >
>> >  {"jsonrpc":"2.0","id":4,"method":"shutdown","params":null}
>> >
>> > Modified: clang-tools-extra/trunk/test/clangd/completion-qualifiers.te
>> st
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/test/clangd/completion-
>> > qualifiers.test?rev=318287&r1=318286&r2=318287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/test/clangd/completion-qualifiers.test
>> > (original)
>> > +++ clang-tools-extra/trunk/test/clangd/completion-qualifiers.test Wed
>> Nov
>> > 15 01:16:29 2017
>> > @@ -10,37 +10,40 @@ Content-Length: 151
>> >
>> > {"jsonrpc":"2.0","id":2,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":11,"
>> character":8}}
>> > }
>> >  #      CHECK:  "id": 2,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> >  # Eligible const functions are at the top of the list.
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "int",
>> > -# CHECK-NEXT:      "filterText": "bar",
>> > -# CHECK-NEXT:      "insertText": "bar",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "bar() const",
>> > -# CHECK-NEXT:      "sortText": "000037bar"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "int",
>> > -# CHECK-NEXT:      "filterText": "foo",
>> > -# CHECK-NEXT:      "insertText": "foo",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "Foo::foo() const",
>> > -# CHECK-NEXT:      "sortText": "000037foo"
>> > -# CHECK-NEXT:    },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "int",
>> > +# CHECK-NEXT:        "filterText": "bar",
>> > +# CHECK-NEXT:        "insertText": "bar",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "bar() const",
>> > +# CHECK-NEXT:        "sortText": "000037bar"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "int",
>> > +# CHECK-NEXT:        "filterText": "foo",
>> > +# CHECK-NEXT:        "insertText": "foo",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "Foo::foo() const",
>> > +# CHECK-NEXT:        "sortText": "000037foo"
>> > +# CHECK-NEXT:      },
>> >  # Ineligible non-const function is at the bottom of the list.
>> > -# CHECK-NEXT:    {
>> > -#      CHECK:      "detail": "int",
>> > -#      CHECK:      "filterText": "foo",
>> > -# CHECK-NEXT:      "insertText": "foo",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "foo() const",
>> > -# CHECK-NEXT:      "sortText": "200035foo"
>> > -# CHECK-NEXT:    }
>> > -# CHECK-NEXT:  ]
>> > +# CHECK-NEXT:      {
>> > +#      CHECK:        "detail": "int",
>> > +#      CHECK:        "filterText": "foo",
>> > +# CHECK-NEXT:        "insertText": "foo",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "foo() const",
>> > +# CHECK-NEXT:        "sortText": "200035foo"
>> > +# CHECK-NEXT:      }
>> > +# CHECK-NEXT:    ]
>> > +# CHECK-NEXT:  }
>> >  Content-Length: 44
>> >
>> >  {"jsonrpc":"2.0","id":4,"method":"shutdown"}
>> >
>> > Modified: clang-tools-extra/trunk/test/clangd/completion-snippet.test
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/test/clangd/completion-
>> > snippet.test?rev=318287&r1=318286&r2=318287&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/test/clangd/completion-snippet.test
>> (original)
>> > +++ clang-tools-extra/trunk/test/clangd/completion-snippet.test Wed
>> Nov 15
>> > 01:16:29 2017
>> > @@ -14,71 +14,74 @@ Content-Length: 148
>> >
>> > {"jsonrpc":"2.0","id":1,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":3,"
>> character":5}}}
>> >  #      CHECK:  "id": 1,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "int",
>> > -# CHECK-NEXT:      "filterText": "a",
>> > -# CHECK-NEXT:      "insertText": "a",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 5,
>> > -# CHECK-NEXT:      "label": "a",
>> > -# CHECK-NEXT:      "sortText": "000035a"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "int",
>> > -# CHECK-NEXT:      "filterText": "bb",
>> > -# CHECK-NEXT:      "insertText": "bb",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 5,
>> > -# CHECK-NEXT:      "label": "bb",
>> > -# CHECK-NEXT:      "sortText": "000035bb"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "int",
>> > -# CHECK-NEXT:      "filterText": "ccc",
>> > -# CHECK-NEXT:      "insertText": "ccc",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 5,
>> > -# CHECK-NEXT:      "label": "ccc",
>> > -# CHECK-NEXT:      "sortText": "000035ccc"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "int",
>> > -# CHECK-NEXT:      "filterText": "f",
>> > -# CHECK-NEXT:      "insertText": "f(${1:int i}, ${2:const float f})",
>> > -# CHECK-NEXT:      "insertTextFormat": 2,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "f(int i, const float f) const",
>> > -# CHECK-NEXT:      "sortText": "000035f"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "filterText": "fake",
>> > -# CHECK-NEXT:      "insertText": "fake::",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 7,
>> > -# CHECK-NEXT:      "label": "fake::",
>> > -# CHECK-NEXT:      "sortText": "000075fake"
>> > -# CHECK-NEXT:    },
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "fake &",
>> > -# CHECK-NEXT:      "filterText": "operator=",
>> > -# CHECK-NEXT:      "insertText": "operator=(${1:const fake &})",
>> > -# CHECK-NEXT:      "insertTextFormat": 2,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "operator=(const fake &)",
>> > -# CHECK-NEXT:      "sortText": "000079operator="
>> > -# CHECK-NEXT:    },
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "int",
>> > +# CHECK-NEXT:        "filterText": "a",
>> > +# CHECK-NEXT:        "insertText": "a",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 5,
>> > +# CHECK-NEXT:        "label": "a",
>> > +# CHECK-NEXT:        "sortText": "000035a"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "int",
>> > +# CHECK-NEXT:        "filterText": "bb",
>> > +# CHECK-NEXT:        "insertText": "bb",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 5,
>> > +# CHECK-NEXT:        "label": "bb",
>> > +# CHECK-NEXT:        "sortText": "000035bb"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "int",
>> > +# CHECK-NEXT:        "filterText": "ccc",
>> > +# CHECK-NEXT:        "insertText": "ccc",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 5,
>> > +# CHECK-NEXT:        "label": "ccc",
>> > +# CHECK-NEXT:        "sortText": "000035ccc"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "int",
>> > +# CHECK-NEXT:        "filterText": "f",
>> > +# CHECK-NEXT:        "insertText": "f(${1:int i}, ${2:const float f})",
>> > +# CHECK-NEXT:        "insertTextFormat": 2,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "f(int i, const float f) const",
>> > +# CHECK-NEXT:        "sortText": "000035f"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "filterText": "fake",
>> > +# CHECK-NEXT:        "insertText": "fake::",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 7,
>> > +# CHECK-NEXT:        "label": "fake::",
>> > +# CHECK-NEXT:        "sortText": "000075fake"
>> > +# CHECK-NEXT:      },
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "fake &",
>> > +# CHECK-NEXT:        "filterText": "operator=",
>> > +# CHECK-NEXT:        "insertText": "operator=(${1:const fake &})",
>> > +# CHECK-NEXT:        "insertTextFormat": 2,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "operator=(const fake &)",
>> > +# CHECK-NEXT:        "sortText": "000079operator="
>> > +# CHECK-NEXT:      },
>> >  # FIXME: Why do some buildbots show an extra operator==(fake&&) here?
>> > -#      CHECK:    {
>> > -#      CHECK:      "detail": "void",
>> > -# CHECK-NEXT:      "filterText": "~fake",
>> > -# CHECK-NEXT:      "insertText": "~fake()",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 4,
>> > -# CHECK-NEXT:      "label": "~fake()",
>> > -# CHECK-NEXT:      "sortText": "000079~fake"
>> > -# CHECK-NEXT:    }
>> > -# CHECK-NEXT:  ]
>> > +#      CHECK:      {
>> > +#      CHECK:        "detail": "void",
>> > +# CHECK-NEXT:        "filterText": "~fake",
>> > +# CHECK-NEXT:        "insertText": "~fake()",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 4,
>> > +# CHECK-NEXT:        "label": "~fake()",
>> > +# CHECK-NEXT:        "sortText": "000079~fake"
>> > +# CHECK-NEXT:      }
>> > +# CHECK-NEXT:    ]
>> > +# CHECK-NEXT:  }
>> >  # Update the source file and check for completions again.
>> >  Content-Length: 226
>> >
>> > @@ -89,16 +92,18 @@ Content-Length: 148
>> >
>> > {"jsonrpc":"2.0","id":3,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":3,"
>> character":5}}}
>> >  #      CHECK:  "id": 3,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -# CHECK-NEXT:    {
>> > -# CHECK-NEXT:      "detail": "int (*)(int, int)",
>> > -# CHECK-NEXT:      "filterText": "func",
>> > -# CHECK-NEXT:      "insertText": "func()",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 2,
>> > -# CHECK-NEXT:      "label": "func()",
>> > -# CHECK-NEXT:      "sortText": "000034func"
>> > -# CHECK-NEXT:    },
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +# CHECK-NEXT:      {
>> > +# CHECK-NEXT:        "detail": "int (*)(int, int)",
>> > +# CHECK-NEXT:        "filterText": "func",
>> > +# CHECK-NEXT:        "insertText": "func()",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 2,
>> > +# CHECK-NEXT:        "label": "func()",
>> > +# CHECK-NEXT:        "sortText": "000034func"
>> > +# CHECK-NEXT:      },
>> >  Content-Length: 44
>> >
>> >  {"jsonrpc":"2.0","id":4,"method":"shutdown"}
>> >
>> > Modified: clang-tools-extra/trunk/test/clangd/completion.test
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/test/clangd/completion.test?rev=318287&r1=318286
>> &r2=318287&vie
>> > w=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/test/clangd/completion.test (original)
>> > +++ clang-tools-extra/trunk/test/clangd/completion.test Wed Nov 15
>> > 01:16:29 2017
>> > @@ -14,7 +14,9 @@ Content-Length: 148
>> >
>> > {"jsonrpc":"2.0","id":1,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":3,"
>> character":5}}}
>> >  #      CHECK:  "id": 1
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> >  # CHECK-NEXT:    {
>> >  # CHECK-NEXT:      "detail": "int",
>> >  # CHECK-NEXT:      "filterText": "a",
>> > @@ -84,7 +86,9 @@ Content-Length: 148
>> >
>> > {"jsonrpc":"2.0","id":2,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":3,"
>> character":5}}}
>> >  #      CHECK:  "id": 2
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> >  # CHECK-NEXT:    {
>> >  # CHECK-NEXT:      "detail": "int",
>> >  # CHECK-NEXT:      "filterText": "a",
>> > @@ -158,7 +162,9 @@ Content-Length: 148
>> >
>> > {"jsonrpc":"2.0","id":3,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:///main.cpp"},"position":{"line":3,"
>> character":5}}}
>> >  #      CHECK:    "id": 3,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> >  # CHECK-NEXT:    {
>> >  # CHECK-NEXT:      "detail": "int (*)(int, int)",
>> >  # CHECK-NEXT:      "filterText": "func",
>> >
>> > Modified: clang-tools-extra/trunk/test/clangd/protocol.test
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/test/clangd/protocol.test?rev=318287&r1=318286&
>> r2=318287&view=
>> > diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/test/clangd/protocol.test (original)
>> > +++ clang-tools-extra/trunk/test/clangd/protocol.test Wed Nov 15
>> 01:16:29
>> > 2017
>> > @@ -31,14 +31,17 @@ Content-Length: 146
>> >  #
>> >  #      CHECK:  "id": 1,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -#      CHECK:      "filterText": "fake",
>> > -# CHECK-NEXT:      "insertText": "fake",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 7,
>> > -# CHECK-NEXT:      "label": "fake::",
>> > -# CHECK-NEXT:      "sortText": "000075fake"
>> > -#      CHECK:  ]
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +#      CHECK:        "filterText": "fake",
>> > +# CHECK-NEXT:        "insertText": "fake",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 7,
>> > +# CHECK-NEXT:        "label": "fake::",
>> > +# CHECK-NEXT:        "sortText": "000075fake"
>> > +#      CHECK:    ]
>> > +# CHECK-NEXT:  }
>> >
>> >  X-Test: Testing
>> >  Content-Type: application/vscode-jsonrpc; charset-utf-8
>> > @@ -57,14 +60,17 @@ Content-Length: 146
>> >  #
>> >  #      CHECK:  "id": 3,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -#      CHECK:      "filterText": "fake",
>> > -# CHECK-NEXT:      "insertText": "fake",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 7,
>> > -# CHECK-NEXT:      "label": "fake::",
>> > -# CHECK-NEXT:      "sortText": "000075fake"
>> > -#      CHECK:  ]
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +#      CHECK:        "filterText": "fake",
>> > +# CHECK-NEXT:        "insertText": "fake",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 7,
>> > +# CHECK-NEXT:        "label": "fake::",
>> > +# CHECK-NEXT:        "sortText": "000075fake"
>> > +#      CHECK:    ]
>> > +# CHECK-NEXT:  }
>> >  # STDERR: Warning: Duplicate Content-Length header received. The
>> previous
>> > value for this message (10) was ignored.
>> >
>> >  Content-Type: application/vscode-jsonrpc; charset-utf-8
>> > @@ -83,14 +89,17 @@ Content-Length: 146
>> >  #
>> >  #      CHECK:  "id": 5,
>> >  # CHECK-NEXT:  "jsonrpc": "2.0",
>> > -# CHECK-NEXT:  "result": [
>> > -#      CHECK:      "filterText": "fake",
>> > -# CHECK-NEXT:      "insertText": "fake",
>> > -# CHECK-NEXT:      "insertTextFormat": 1,
>> > -# CHECK-NEXT:      "kind": 7,
>> > -# CHECK-NEXT:      "label": "fake::",
>> > -# CHECK-NEXT:      "sortText": "000075fake"
>> > -#      CHECK:  ]
>> > +# CHECK-NEXT:  "result": {
>> > +# CHECK-NEXT:    "isIncomplete": false,
>> > +# CHECK-NEXT:    "items": [
>> > +#      CHECK:        "filterText": "fake",
>> > +# CHECK-NEXT:        "insertText": "fake",
>> > +# CHECK-NEXT:        "insertTextFormat": 1,
>> > +# CHECK-NEXT:        "kind": 7,
>> > +# CHECK-NEXT:        "label": "fake::",
>> > +# CHECK-NEXT:        "sortText": "000075fake"
>> > +#      CHECK:    ]
>> > +# CHECK-NEXT:  }
>> >  Content-Length: 1024
>> >
>> >
>> > {"jsonrpc":"2.0","id":5,"method":"textDocument/completion","
>> params":{"text
>> > Document":{"uri":"file:/main.cpp"},"position":{"line":3,"cha
>> racter":5}}}
>> >
>> > Modified: clang-tools-extra/trunk/unittests/clangd/ClangdTests.cpp
>> > URL: http://llvm.org/viewvc/llvm-project/clang-tools-
>> > extra/trunk/unittests/clangd/ClangdTests.cpp?rev=318287&r1=3
>> 18286&r2=31828
>> > 7&view=diff
>> > ============================================================
>> ==============
>> > ====
>> > --- clang-tools-extra/trunk/unittests/clangd/ClangdTests.cpp (original)
>> > +++ clang-tools-extra/trunk/unittests/clangd/ClangdTests.cpp Wed Nov 15
>> > 01:16:29 2017
>> > @@ -619,16 +619,15 @@ struct bar { T x; };
>> >  class ClangdCompletionTest : public ClangdVFSTest {
>> >  protected:
>> >    template <class Predicate>
>> > -  bool ContainsItemPred(std::vector<CompletionItem> const &Items,
>> > -                        Predicate Pred) {
>> > -    for (const auto &Item : Items) {
>> > +  bool ContainsItemPred(CompletionList const &Items, Predicate Pred) {
>> > +    for (const auto &Item : Items.items) {
>> >        if (Pred(Item))
>> >          return true;
>> >      }
>> >      return false;
>> >    }
>> >
>> > -  bool ContainsItem(std::vector<CompletionItem> const &Items,
>> StringRef
>> > Name) {
>> > +  bool ContainsItem(CompletionList const &Items, StringRef Name) {
>> >      return ContainsItemPred(Items, [Name](clangd::CompletionItem Item)
>> {
>> >        return Item.insertText == Name;
>> >      });
>> > @@ -694,6 +693,44 @@ int b =   ;
>> >    }
>> >  }
>> >
>> > +TEST_F(ClangdCompletionTest, Limit) {
>> > +  MockFSProvider FS;
>> > +  MockCompilationDatabase CDB(/*AddFreestandingFlag=*/true);
>> > +  CDB.ExtraClangFlags.push_back("-xc++");
>> > +  ErrorCheckingDiagConsumer DiagConsumer;
>> > +  clangd::CodeCompleteOptions Opts;
>> > +  Opts.Limit = 2;
>> > +  ClangdServer Server(CDB, DiagConsumer, FS,
>> > getDefaultAsyncThreadsCount(),
>> > +                      Opts, EmptyLogger::getInstance());
>> > +
>> > +  auto FooCpp = getVirtualTestFilePath("foo.cpp");
>> > +  FS.Files[FooCpp] = "";
>> > +  FS.ExpectedFile = FooCpp;
>> > +  StringWithPos Completion = parseTextMarker(R"cpp(
>> > +struct ClassWithMembers {
>> > +  int AAA();
>> > +  int BBB();
>> > +  int CCC();
>> > +}
>> > +int main() { ClassWithMembers().{complete} }
>> > +      )cpp",
>> > +                                             "complete");
>> > +  Server.addDocument(FooCpp, Completion.Text);
>> > +
>> > +  /// For after-dot completion we must always get consistent results.
>> > +  auto Results = Server
>> > +                     .codeComplete(FooCpp, Completion.MarkerPos,
>> > +                                   StringRef(Completion.Text))
>> > +                     .get()
>> > +                     .Value;
>> > +
>> > +  EXPECT_TRUE(Results.isIncomplete);
>> > +  EXPECT_EQ(Opts.Limit, Results.items.size());
>> > +  EXPECT_TRUE(ContainsItem(Results, "AAA"));
>> > +  EXPECT_TRUE(ContainsItem(Results, "BBB"));
>> > +  EXPECT_FALSE(ContainsItem(Results, "CCC"));
>> > +}
>> > +
>> >  TEST_F(ClangdCompletionTest, CompletionOptions) {
>> >    MockFSProvider FS;
>> >    ErrorCheckingDiagConsumer DiagConsumer;
>> >
>> >
>> > _______________________________________________
>> > cfe-commits mailing list
>> > cfe-commits at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171115/c2d3a692/attachment-0001.html>


More information about the cfe-commits mailing list