[clang-tools-extra] r317670 - [clangd] Sort completion results.

Sam McCall via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 7 23:44:13 PST 2017


Author: sammccall
Date: Tue Nov  7 23:44:12 2017
New Revision: 317670

URL: http://llvm.org/viewvc/llvm-project?rev=317670&view=rev
Log:
[clangd] Sort completion results.

Summary:
This is (probably) not required by LSP, but at least one buggy client wants it.
It also simplifies some tests - changed a few completion tests to use -pretty.

Reviewers: hokein, malaperle

Subscribers: ilya-biryukov, cfe-commits

Differential Revision: https://reviews.llvm.org/D39738

Modified:
    clang-tools-extra/trunk/clangd/ClangdUnit.cpp
    clang-tools-extra/trunk/clangd/Protocol.cpp
    clang-tools-extra/trunk/clangd/Protocol.h
    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

Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.cpp?rev=317670&r1=317669&r2=317670&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original)
+++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Tue Nov  7 23:44:12 2017
@@ -389,6 +389,7 @@ public:
       assert(CCS && "Expected the CodeCompletionString to be non-null");
       Items.push_back(ProcessCodeCompleteResult(Result, *CCS));
     }
+    std::sort(Items.begin(), Items.end());
   }
 
   GlobalCodeCompletionAllocator &getAllocator() override { return *Allocator; }

Modified: clang-tools-extra/trunk/clangd/Protocol.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.cpp?rev=317670&r1=317669&r2=317670&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/Protocol.cpp (original)
+++ clang-tools-extra/trunk/clangd/Protocol.cpp Tue Nov  7 23:44:12 2017
@@ -1038,6 +1038,11 @@ json::Expr CompletionItem::unparse(const
   return std::move(Result);
 }
 
+bool clangd::operator<(const CompletionItem &L, const CompletionItem &R) {
+  return (L.sortText.empty() ? L.label : L.sortText) <
+         (R.sortText.empty() ? R.label : R.sortText);
+}
+
 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=317670&r1=317669&r2=317670&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/Protocol.h (original)
+++ clang-tools-extra/trunk/clangd/Protocol.h Tue Nov  7 23:44:12 2017
@@ -545,6 +545,8 @@ struct CompletionItem {
   static json::Expr unparse(const CompletionItem &P);
 };
 
+bool operator<(const CompletionItem &, const CompletionItem &);
+
 /// A single parameter of a particular signature.
 struct ParameterInformation {
 

Modified: clang-tools-extra/trunk/test/clangd/completion-priorities.test
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clangd/completion-priorities.test?rev=317670&r1=317669&r2=317670&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clangd/completion-priorities.test (original)
+++ clang-tools-extra/trunk/test/clangd/completion-priorities.test Tue Nov  7 23:44:12 2017
@@ -1,4 +1,4 @@
-# RUN: clangd -run-synchronously < %s | FileCheck %s
+# RUN: clangd -pretty -run-synchronously < %s | FileCheck -strict-whitespace %s
 # It is absolutely vital that this file has CRLF line endings.
 #
 
@@ -13,24 +13,71 @@ Content-Length: 312
 Content-Length: 151
 
 {"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":12,"character":8}}}
-# The order of results returned by codeComplete seems to be
-# nondeterministic, so we check regardless of order.
-#
-# CHECK: {"id":2,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"void","filterText":"pub","insertText":"pub","insertTextFormat":1,"kind":2,"label":"pub()","sortText":"000034pub"}
-# CHECK-DAG: {"detail":"void","filterText":"prot","insertText":"prot","insertTextFormat":1,"kind":2,"label":"prot()","sortText":"000034prot"}
-# CHECK-DAG: {"detail":"void","filterText":"priv","insertText":"priv","insertTextFormat":1,"kind":2,"label":"priv()","sortText":"000034priv"}
-# CHECK-SAME: ]}
-
+#      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:    },
 Content-Length: 151
 
 {"jsonrpc":"2.0","id":3,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":17,"character":4}}}
-# CHECK: {"id":3,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"void","filterText":"pub","insertText":"pub","insertTextFormat":1,"kind":2,"label":"pub()","sortText":"000034pub"}
-# CHECK-DAG: {"detail":"void","filterText":"prot","insertText":"prot","insertTextFormat":1,"kind":2,"label":"prot()","sortText":"200034prot"}
-# CHECK-DAG: {"detail":"void","filterText":"priv","insertText":"priv","insertTextFormat":1,"kind":2,"label":"priv()","sortText":"200034priv"}
-# CHECK-SAME: ]}
-
+#      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:    },
+# 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:  ]
 Content-Length: 58
 
 {"jsonrpc":"2.0","id":4,"method":"shutdown","params":null}

Modified: clang-tools-extra/trunk/test/clangd/completion-qualifiers.test
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clangd/completion-qualifiers.test?rev=317670&r1=317669&r2=317670&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clangd/completion-qualifiers.test (original)
+++ clang-tools-extra/trunk/test/clangd/completion-qualifiers.test Tue Nov  7 23:44:12 2017
@@ -1,4 +1,4 @@
-# RUN: clangd -run-synchronously < %s | FileCheck %s
+# RUN: clangd -pretty -run-synchronously < %s | FileCheck -strict-whitespace %s
 Content-Length: 125
 
 {"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
@@ -8,11 +8,39 @@ Content-Length: 297
 Content-Length: 151
 
 {"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":11,"character":8}}}
-# CHECK: {"id":2,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"int","filterText":"foo","insertText":"foo","insertTextFormat":1,"kind":2,"label":"foo() const","sortText":"200035foo"}
-# CHECK-DAG: {"detail":"int","filterText":"bar","insertText":"bar","insertTextFormat":1,"kind":2,"label":"bar() const","sortText":"000037bar"}
-# CHECK-DAG: {"detail":"int","filterText":"foo","insertText":"foo","insertTextFormat":1,"kind":2,"label":"Foo::foo() const","sortText":"000037foo"}
-# CHECK-SAME: ]}
+#      CHECK:  "id": 2,
+# CHECK-NEXT:  "jsonrpc": "2.0",
+# CHECK-NEXT:  "result": [
+# 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:    },
+# 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:  ]
 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=317670&r1=317669&r2=317670&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clangd/completion-snippet.test (original)
+++ clang-tools-extra/trunk/test/clangd/completion-snippet.test Tue Nov  7 23:44:12 2017
@@ -1,4 +1,4 @@
-# RUN: clangd -run-synchronously -enable-snippets < %s | FileCheck %s
+# RUN: clangd -pretty -run-synchronously -enable-snippets < %s | FileCheck -strict-whitespace %s
 # It is absolutely vital that this file has CRLF line endings.
 #
 Content-Length: 125
@@ -12,30 +12,72 @@ Content-Length: 246
 Content-Length: 148
 
 {"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":3,"character":5}}}
-# The order of results returned by codeComplete seems to be
-# nondeterministic, so we check regardless of order.
-#
-# CHECK: {"id":1,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"int","filterText":"a","insertText":"a","insertTextFormat":1,"kind":5,"label":"a","sortText":"000035a"}
-# CHECK-DAG: {"detail":"int","filterText":"bb","insertText":"bb","insertTextFormat":1,"kind":5,"label":"bb","sortText":"000035bb"}
-# CHECK-DAG: {"detail":"int","filterText":"ccc","insertText":"ccc","insertTextFormat":1,"kind":5,"label":"ccc","sortText":"000035ccc"}
-# CHECK-DAG: {"detail":"fake &","filterText":"operator=","insertText":"operator=(${1:const fake &})","insertTextFormat":2,"kind":2,"label":"operator=(const fake &)","sortText":"000079operator="}
-# CHECK-DAG: {"detail":"void","filterText":"~fake","insertText":"~fake()","insertTextFormat":1,"kind":4,"label":"~fake()","sortText":"000079~fake"}
-# CHECK-DAG: {"detail":"int","filterText":"f","insertText":"f(${1:int i}, ${2:const float f})","insertTextFormat":2,"kind":2,"label":"f(int i, const float f) const","sortText":"000035f"}
-# CHECK-SAME: ]}
-Content-Length: 148
-
-{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":3,"character":5}}}
-# Repeat the completion request, expect the same results.
-#
-# CHECK: {"id":2,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"int","filterText":"a","insertText":"a","insertTextFormat":1,"kind":5,"label":"a","sortText":"000035a"}
-# CHECK-DAG: {"detail":"int","filterText":"bb","insertText":"bb","insertTextFormat":1,"kind":5,"label":"bb","sortText":"000035bb"}
-# CHECK-DAG: {"detail":"int","filterText":"ccc","insertText":"ccc","insertTextFormat":1,"kind":5,"label":"ccc","sortText":"000035ccc"}
-# CHECK-DAG: {"detail":"fake &","filterText":"operator=","insertText":"operator=(${1:const fake &})","insertTextFormat":2,"kind":2,"label":"operator=(const fake &)","sortText":"000079operator="}
-# CHECK-DAG: {"detail":"void","filterText":"~fake","insertText":"~fake()","insertTextFormat":1,"kind":4,"label":"~fake()","sortText":"000079~fake"}
-# CHECK-DAG: {"detail":"int","filterText":"f","insertText":"f(${1:int i}, ${2:const float f})","insertTextFormat":2,"kind":2,"label":"f(int i, const float f) const","sortText":"000035f"}
-# CHECK-SAME: ]}
+#      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:    {
+# CHECK-NEXT:      "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:  ]
 # Update the source file and check for completions again.
 Content-Length: 226
 
@@ -44,9 +86,18 @@ Content-Length: 226
 Content-Length: 148
 
 {"jsonrpc":"2.0","id":3,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":3,"character":5}}}
-# CHECK: {"id":3,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"int (*)(int, int)","filterText":"func","insertText":"func()","insertTextFormat":1,"kind":2,"label":"func()","sortText":"000034func"}
-# CHECK-SAME: ]}
+#      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:    },
 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=317670&r1=317669&r2=317670&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clangd/completion.test (original)
+++ clang-tools-extra/trunk/test/clangd/completion.test Tue Nov  7 23:44:12 2017
@@ -1,4 +1,4 @@
-# RUN: clangd -run-synchronously < %s | FileCheck %s
+# RUN: clangd -pretty -run-synchronously < %s | FileCheck -strict-whitespace %s
 # It is absolutely vital that this file has CRLF line endings.
 #
 Content-Length: 125
@@ -12,30 +12,141 @@ Content-Length: 246
 Content-Length: 148
 
 {"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":3,"character":5}}}
-# The order of results returned by codeComplete seems to be
-# nondeterministic, so we check regardless of order.
-#
-# CHECK: {"id":1,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"int","filterText":"a","insertText":"a","insertTextFormat":1,"kind":5,"label":"a","sortText":"000035a"}
-# CHECK-DAG: {"detail":"int","filterText":"bb","insertText":"bb","insertTextFormat":1,"kind":5,"label":"bb","sortText":"000035bb"}
-# CHECK-DAG: {"detail":"int","filterText":"ccc","insertText":"ccc","insertTextFormat":1,"kind":5,"label":"ccc","sortText":"000035ccc"}
-# CHECK-DAG: {"detail":"fake &","filterText":"operator=","insertText":"operator=","insertTextFormat":1,"kind":2,"label":"operator=(const fake &)","sortText":"000079operator="}
-# CHECK-DAG: {"detail":"void","filterText":"~fake","insertText":"~fake","insertTextFormat":1,"kind":4,"label":"~fake()","sortText":"000079~fake"}
-# CHECK-DAG: {"detail":"int","filterText":"f","insertText":"f","insertTextFormat":1,"kind":2,"label":"f(int i, const float f) const","sortText":"000035f"}
-# CHECK-SAME: ]}
+#      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",
+# CHECK-NEXT:      "insertTextFormat": 1,
+# 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=",
+# CHECK-NEXT:      "insertTextFormat": 1,
+# CHECK-NEXT:      "kind": 2,
+# CHECK-NEXT:      "label": "operator=(const fake &)",
+# CHECK-NEXT:      "sortText": "000079operator="
+# CHECK-NEXT:    },
+# CHECK-NEXT:    {
+# CHECK-NEXT:      "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:  ]
 Content-Length: 148
 
 {"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":3,"character":5}}}
-# Repeat the completion request, expect the same results.
-#
-# CHECK: {"id":2,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"int","filterText":"a","insertText":"a","insertTextFormat":1,"kind":5,"label":"a","sortText":"000035a"}
-# CHECK-DAG: {"detail":"int","filterText":"bb","insertText":"bb","insertTextFormat":1,"kind":5,"label":"bb","sortText":"000035bb"}
-# CHECK-DAG: {"detail":"int","filterText":"ccc","insertText":"ccc","insertTextFormat":1,"kind":5,"label":"ccc","sortText":"000035ccc"}
-# CHECK-DAG: {"detail":"fake &","filterText":"operator=","insertText":"operator=","insertTextFormat":1,"kind":2,"label":"operator=(const fake &)","sortText":"000079operator="}
-# CHECK-DAG: {"detail":"void","filterText":"~fake","insertText":"~fake","insertTextFormat":1,"kind":4,"label":"~fake()","sortText":"000079~fake"}
-# CHECK-DAG: {"detail":"int","filterText":"f","insertText":"f","insertTextFormat":1,"kind":2,"label":"f(int i, const float f) const","sortText":"000035f"}
-# CHECK-SAME: ]}
+#      CHECK:  "id": 2
+# 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",
+# CHECK-NEXT:      "insertTextFormat": 1,
+# 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=",
+# CHECK-NEXT:      "insertTextFormat": 1,
+# CHECK-NEXT:      "kind": 2,
+# CHECK-NEXT:      "label": "operator=(const fake &)",
+# CHECK-NEXT:      "sortText": "000079operator="
+# CHECK-NEXT:    },
+# CHECK-NEXT:    {
+# CHECK-NEXT:      "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:  ]
 # Update the source file and check for completions again.
 Content-Length: 226
 
@@ -44,11 +155,45 @@ Content-Length: 226
 Content-Length: 148
 
 {"jsonrpc":"2.0","id":3,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":3,"character":5}}}
-# Repeat the completion request, expect the same results.
-#
-# CHECK: {"id":3,"jsonrpc":"2.0","result":[
-# CHECK-DAG: {"detail":"int (*)(int, int)","filterText":"func","insertText":"func","insertTextFormat":1,"kind":2,"label":"func()","sortText":"000034func"}
-# CHECK-SAME: ]}
+#      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:    {
+# CHECK-NEXT:      "filterText": "fancy",
+# CHECK-NEXT:      "insertText": "fancy",
+# CHECK-NEXT:      "insertTextFormat": 1,
+# CHECK-NEXT:      "kind": 7,
+# CHECK-NEXT:      "label": "fancy::",
+# CHECK-NEXT:      "sortText": "000075fancy"
+# CHECK-NEXT:    },
+# CHECK-NEXT:    {
+# CHECK-NEXT:      "detail": "fancy &",
+# CHECK-NEXT:      "filterText": "operator=",
+# CHECK-NEXT:      "insertText": "operator=",
+# CHECK-NEXT:      "insertTextFormat": 1,
+# CHECK-NEXT:      "kind": 2,
+# CHECK-NEXT:      "label": "operator=(const fancy &)",
+# CHECK-NEXT:      "sortText": "000079operator="
+# CHECK-NEXT:    },
+# CHECK-NEXT:    {
+# CHECK-NEXT:      "detail": "void",
+# CHECK-NEXT:      "filterText": "~fancy",
+# CHECK-NEXT:      "insertText": "~fancy",
+# CHECK-NEXT:      "insertTextFormat": 1,
+# CHECK-NEXT:      "kind": 4,
+# CHECK-NEXT:      "label": "~fancy()",
+# CHECK-NEXT:      "sortText": "000079~fancy"
+# CHECK-NEXT:    }
+# CHECK-NEXT:  ]
 Content-Length: 44
 
 {"jsonrpc":"2.0","id":4,"method":"shutdown"}




More information about the cfe-commits mailing list