# 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 {"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} Content-Length: 246 {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///main.cpp","languageId":"cpp","version":1,"text":"struct fake { int a, bb, ccc; int f(int i, const float f) const; };\nint main() {\n fake f;\n f.\n}\n"}}} Content-Length: 148 {"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{"textDocument":{"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: }, # 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: ] # Update the source file and check for completions again. Content-Length: 226 {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file:///main.cpp","version":2},"contentChanges":[{"text":"struct fancy { int (*func())(int, int); };\nint main() {\n fancy f;\n f.\n}\n"}]}} 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, # 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"} Content-Length: 33 {"jsonrpc":"2.0":"method":"exit"}