|  | # RUN: clangd -lit-test < %s | FileCheck -strict-whitespace %s | 
|  | {"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} | 
|  | --- | 
|  | {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///foo.c","languageId":"c","version":1,"text":"int main(int i, char **a) { if (i = 2) {}}"}}} | 
|  | #      CHECK:    "method": "textDocument/publishDiagnostics", | 
|  | # CHECK-NEXT:  "params": { | 
|  | # CHECK-NEXT:    "diagnostics": [ | 
|  | # CHECK-NEXT:      { | 
|  | # CHECK-NEXT:        "message": "using the result of an assignment as a condition without parentheses", | 
|  | # CHECK-NEXT:        "range": { | 
|  | # CHECK-NEXT:          "end": { | 
|  | # CHECK-NEXT:            "character": 37, | 
|  | # CHECK-NEXT:            "line": 0 | 
|  | # CHECK-NEXT:          }, | 
|  | # CHECK-NEXT:          "start": { | 
|  | # CHECK-NEXT:            "character": 32, | 
|  | # CHECK-NEXT:            "line": 0 | 
|  | # CHECK-NEXT:          } | 
|  | # CHECK-NEXT:        }, | 
|  | # CHECK-NEXT:        "severity": 2 | 
|  | # CHECK-NEXT:      } | 
|  | # CHECK-NEXT:    ], | 
|  | # CHECK-NEXT:    "uri": "file://{{.*}}/foo.c" | 
|  | # CHECK-NEXT:  } | 
|  | --- | 
|  | {"jsonrpc":"2.0","id":2,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///foo.c"},"range":{"start":{"line":104,"character":13},"end":{"line":0,"character":35}},"context":{"diagnostics":[{"range":{"start": {"line": 0, "character": 32}, "end": {"line": 0, "character": 37}},"severity":2,"message":"using the result of an assignment as a condition without parentheses"}]}}} | 
|  | #      CHECK:  "id": 2, | 
|  | # CHECK-NEXT:  "jsonrpc": "2.0", | 
|  | # CHECK-NEXT:  "result": [ | 
|  | # CHECK-NEXT:    { | 
|  | # CHECK-NEXT:      "arguments": [ | 
|  | # CHECK-NEXT:        { | 
|  | # CHECK-NEXT:          "changes": { | 
|  | # CHECK-NEXT:            "file://{{.*}}/foo.c": [ | 
|  | # CHECK-NEXT:              { | 
|  | # CHECK-NEXT:                "newText": "(", | 
|  | # CHECK-NEXT:                "range": { | 
|  | # CHECK-NEXT:                  "end": { | 
|  | # CHECK-NEXT:                    "character": 32, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  }, | 
|  | # CHECK-NEXT:                  "start": { | 
|  | # CHECK-NEXT:                    "character": 32, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  } | 
|  | # CHECK-NEXT:                } | 
|  | # CHECK-NEXT:              }, | 
|  | # CHECK-NEXT:              { | 
|  | # CHECK-NEXT:                "newText": ")", | 
|  | # CHECK-NEXT:                "range": { | 
|  | # CHECK-NEXT:                  "end": { | 
|  | # CHECK-NEXT:                    "character": 37, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  }, | 
|  | # CHECK-NEXT:                  "start": { | 
|  | # CHECK-NEXT:                    "character": 37, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  } | 
|  | # CHECK-NEXT:                } | 
|  | # CHECK-NEXT:              } | 
|  | # CHECK-NEXT:            ] | 
|  | # CHECK-NEXT:          } | 
|  | # CHECK-NEXT:        } | 
|  | # CHECK-NEXT:      ], | 
|  | # CHECK-NEXT:      "command": "clangd.applyFix", | 
|  | # CHECK-NEXT:      "title": "Apply fix: place parentheses around the assignment to silence this warning" | 
|  | # CHECK-NEXT:    }, | 
|  | # CHECK-NEXT:    { | 
|  | # CHECK-NEXT:      "arguments": [ | 
|  | # CHECK-NEXT:        { | 
|  | # CHECK-NEXT:          "changes": { | 
|  | # CHECK-NEXT:            "file://{{.*}}/foo.c": [ | 
|  | # CHECK-NEXT:              { | 
|  | # CHECK-NEXT:                "newText": "==", | 
|  | # CHECK-NEXT:                "range": { | 
|  | # CHECK-NEXT:                  "end": { | 
|  | # CHECK-NEXT:                    "character": 35, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  }, | 
|  | # CHECK-NEXT:                  "start": { | 
|  | # CHECK-NEXT:                    "character": 34, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  } | 
|  | # CHECK-NEXT:                } | 
|  | # CHECK-NEXT:              } | 
|  | # CHECK-NEXT:            ] | 
|  | # CHECK-NEXT:          } | 
|  | # CHECK-NEXT:        } | 
|  | # CHECK-NEXT:      ], | 
|  | # CHECK-NEXT:      "command": "clangd.applyFix", | 
|  | # CHECK-NEXT:      "title": "Apply fix: use '==' to turn this assignment into an equality comparison" | 
|  | # CHECK-NEXT:    } | 
|  | # CHECK-NEXT:  ] | 
|  | --- | 
|  | {"jsonrpc":"2.0","id":3,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///foo.c"},"range":{"start":{"line":104,"character":13},"end":{"line":0,"character":35}},"context":{"diagnostics":[{"range":{"start": {"line": 0, "character": 32}, "end": {"line": 0, "character": 37}},"severity":2,"message":"using the result of an assignment as a condition without parentheses"}]}}} | 
|  | # Make sure unused "code" and "source" fields ignored gracefully | 
|  | #      CHECK:  "id": 3, | 
|  | # CHECK-NEXT:  "jsonrpc": "2.0", | 
|  | # CHECK-NEXT:  "result": [ | 
|  | # CHECK-NEXT:    { | 
|  | # CHECK-NEXT:      "arguments": [ | 
|  | # CHECK-NEXT:        { | 
|  | # CHECK-NEXT:          "changes": { | 
|  | # CHECK-NEXT:            "file://{{.*}}/foo.c": [ | 
|  | # CHECK-NEXT:              { | 
|  | # CHECK-NEXT:                "newText": "(", | 
|  | # CHECK-NEXT:                "range": { | 
|  | # CHECK-NEXT:                  "end": { | 
|  | # CHECK-NEXT:                    "character": 32, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  }, | 
|  | # CHECK-NEXT:                  "start": { | 
|  | # CHECK-NEXT:                    "character": 32, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  } | 
|  | # CHECK-NEXT:                } | 
|  | # CHECK-NEXT:              }, | 
|  | # CHECK-NEXT:              { | 
|  | # CHECK-NEXT:                "newText": ")", | 
|  | # CHECK-NEXT:                "range": { | 
|  | # CHECK-NEXT:                  "end": { | 
|  | # CHECK-NEXT:                    "character": 37, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  }, | 
|  | # CHECK-NEXT:                  "start": { | 
|  | # CHECK-NEXT:                    "character": 37, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  } | 
|  | # CHECK-NEXT:                } | 
|  | # CHECK-NEXT:              } | 
|  | # CHECK-NEXT:            ] | 
|  | # CHECK-NEXT:          } | 
|  | # CHECK-NEXT:        } | 
|  | # CHECK-NEXT:      ], | 
|  | # CHECK-NEXT:      "command": "clangd.applyFix", | 
|  | # CHECK-NEXT:      "title": "Apply fix: place parentheses around the assignment to silence this warning" | 
|  | # CHECK-NEXT:    }, | 
|  | # CHECK-NEXT:    { | 
|  | # CHECK-NEXT:      "arguments": [ | 
|  | # CHECK-NEXT:        { | 
|  | # CHECK-NEXT:          "changes": { | 
|  | # CHECK-NEXT:            "file://{{.*}}/foo.c": [ | 
|  | # CHECK-NEXT:              { | 
|  | # CHECK-NEXT:                "newText": "==", | 
|  | # CHECK-NEXT:                "range": { | 
|  | # CHECK-NEXT:                  "end": { | 
|  | # CHECK-NEXT:                    "character": 35, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  }, | 
|  | # CHECK-NEXT:                  "start": { | 
|  | # CHECK-NEXT:                    "character": 34, | 
|  | # CHECK-NEXT:                    "line": 0 | 
|  | # CHECK-NEXT:                  } | 
|  | # CHECK-NEXT:                } | 
|  | # CHECK-NEXT:              } | 
|  | # CHECK-NEXT:            ] | 
|  | # CHECK-NEXT:          } | 
|  | # CHECK-NEXT:        } | 
|  | # CHECK-NEXT:      ], | 
|  | # CHECK-NEXT:      "command": "clangd.applyFix", | 
|  | # CHECK-NEXT:      "title": "Apply fix: use '==' to turn this assignment into an equality comparison" | 
|  | # CHECK-NEXT:    } | 
|  | # CHECK-NEXT:  ] | 
|  | --- | 
|  | {"jsonrpc":"2.0","id":4,"method":"workspace/executeCommand","params":{"command":"clangd.applyFix","arguments":[{"changes":{"test:///foo.c":[{"range":{"start":{"line":0,"character":32},"end":{"line":0,"character":32}},"newText":"("},{"range":{"start":{"line":0,"character":37},"end":{"line":0,"character":37}},"newText":")"}]}}]}} | 
|  | #      CHECK:  "id": 4, | 
|  | # CHECK-NEXT:  "jsonrpc": "2.0", | 
|  | # CHECK-NEXT:  "result": "Fix applied." | 
|  | # | 
|  | #      CHECK:  "id": 1, | 
|  | # CHECK-NEXT:  "jsonrpc": "2.0", | 
|  | # CHECK-NEXT:  "method": "workspace/applyEdit", | 
|  | # CHECK-NEXT:  "params": { | 
|  | # CHECK-NEXT:    "edit": { | 
|  | # CHECK-NEXT:      "changes": { | 
|  | # CHECK-NEXT:        "{{.*}}/foo.c": [ | 
|  | # CHECK-NEXT:          { | 
|  | # CHECK-NEXT:            "newText": "(", | 
|  | # CHECK-NEXT:            "range": { | 
|  | # CHECK-NEXT:              "end": { | 
|  | # CHECK-NEXT:                "character": 32, | 
|  | # CHECK-NEXT:                "line": 0 | 
|  | # CHECK-NEXT:              }, | 
|  | # CHECK-NEXT:              "start": { | 
|  | # CHECK-NEXT:                "character": 32, | 
|  | # CHECK-NEXT:                "line": 0 | 
|  | # CHECK-NEXT:              } | 
|  | # CHECK-NEXT:            } | 
|  | # CHECK-NEXT:          }, | 
|  | # CHECK-NEXT:          { | 
|  | # CHECK-NEXT:            "newText": ")", | 
|  | # CHECK-NEXT:            "range": { | 
|  | # CHECK-NEXT:              "end": { | 
|  | # CHECK-NEXT:                "character": 37, | 
|  | # CHECK-NEXT:                "line": 0 | 
|  | # CHECK-NEXT:              }, | 
|  | # CHECK-NEXT:              "start": { | 
|  | # CHECK-NEXT:                "character": 37, | 
|  | # CHECK-NEXT:                "line": 0 | 
|  | # CHECK-NEXT:              } | 
|  | # CHECK-NEXT:            } | 
|  | # CHECK-NEXT:          } | 
|  | # CHECK-NEXT:        ] | 
|  | # CHECK-NEXT:      } | 
|  | # CHECK-NEXT:    } | 
|  | # CHECK-NEXT:  } | 
|  | --- | 
|  | {"jsonrpc":"2.0","id":4,"method":"shutdown"} | 
|  | --- | 
|  | {"jsonrpc":"2.0","method":"exit"} |