[clangd] Append "(fix available)" to diagnostic message when fixes are present.
Summary: This would make diagnostic fixits more discoverable, especially for plugins like YCM. Reviewers: sammccall Reviewed By: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D57509 llvm-svn: 352764
This commit is contained in:
parent
992b53fd16
commit
00eaf6732e
|
|
@ -165,6 +165,8 @@ std::string mainMessage(const Diag &D) {
|
|||
std::string Result;
|
||||
llvm::raw_string_ostream OS(Result);
|
||||
OS << D.Message;
|
||||
if (!D.Fixes.empty())
|
||||
OS << " (" << (D.Fixes.size() > 1 ? "fixes" : "fix") << " available)";
|
||||
for (auto &Note : D.Notes) {
|
||||
OS << "\n\n";
|
||||
printDiag(OS, Note);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "category": "Semantic Issue",
|
||||
# CHECK-NEXT: "message": "Use of 'Point' with tag type that does not match previous declaration\n\nfoo.c:1:8: note: previous use is here",
|
||||
# CHECK-NEXT: "message": "Use of 'Point' with tag type that does not match previous declaration (fix available)\n\nfoo.c:1:8: note: previous use is here",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 22,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
# CHECK-NEXT: "params": {
|
||||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "message": "Return type of 'main' is not 'int'",
|
||||
# CHECK-NEXT: "message": "Return type of 'main' is not 'int' (fix available)",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 4,
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
# CHECK-NEXT: "params": {
|
||||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "message": "Variable 'i' is uninitialized when used here",
|
||||
# CHECK-NEXT: "message": "Variable 'i' is uninitialized when used here (fix available)",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 28,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
# CHECK-NEXT: "params": {
|
||||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses",
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses (fixes available)",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 37,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
# CHECK-NEXT: "params": {
|
||||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses",
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses (fixes available)",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 37,
|
||||
|
|
@ -23,14 +23,14 @@
|
|||
# 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":0,"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"}]}}}
|
||||
{"jsonrpc":"2.0","id":2,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///foo.c"},"range":{"start":{"line":0,"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 (fixes available)"}]}}}
|
||||
# CHECK: "id": 2,
|
||||
# CHECK-NEXT: "jsonrpc": "2.0",
|
||||
# CHECK-NEXT: "result": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses",
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses (fixes available)",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 37,
|
||||
|
|
@ -82,7 +82,7 @@
|
|||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses",
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses (fixes available)",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 37,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
# CHECK-NEXT: "params": {
|
||||
# CHECK-NEXT: "diagnostics": [
|
||||
# CHECK-NEXT: {
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses",
|
||||
# CHECK-NEXT: "message": "Using the result of an assignment as a condition without parentheses (fixes available)",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 37,
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
# 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":0,"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"}]}}}
|
||||
{"jsonrpc":"2.0","id":2,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///foo.c"},"range":{"start":{"line":0,"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 (fixes available)"}]}}}
|
||||
# CHECK: "id": 2,
|
||||
# CHECK-NEXT: "jsonrpc": "2.0",
|
||||
# CHECK-NEXT: "result": [
|
||||
|
|
@ -92,7 +92,7 @@
|
|||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
---
|
||||
{"jsonrpc":"2.0","id":3,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///foo.c"},"range":{"start":{"line":0,"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"}]}}}
|
||||
{"jsonrpc":"2.0","id":3,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///foo.c"},"range":{"start":{"line":0,"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 (fixes available)"}]}}}
|
||||
# Make sure unused "code" and "source" fields ignored gracefully
|
||||
# CHECK: "id": 3,
|
||||
# CHECK-NEXT: "jsonrpc": "2.0",
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
# CHECK-NEXT: "title": "change 'union' to 'struct'"
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ],
|
||||
# CHECK-NEXT: "message": "Use of 'Point' with tag type that does not match previous declaration\n\nfoo.c:1:8: note: previous use is here",
|
||||
# CHECK-NEXT: "message": "Use of 'Point' with tag type that does not match previous declaration (fix available)\n\nfoo.c:1:8: note: previous use is here",
|
||||
# CHECK-NEXT: "range": {
|
||||
# CHECK-NEXT: "end": {
|
||||
# CHECK-NEXT: "character": 22,
|
||||
|
|
|
|||
|
|
@ -246,7 +246,8 @@ TEST(DiagnosticsTest, ToLSP) {
|
|||
};
|
||||
|
||||
// Diagnostics should turn into these:
|
||||
clangd::Diagnostic MainLSP = MatchingLSP(D, R"(Something terrible happened
|
||||
clangd::Diagnostic MainLSP =
|
||||
MatchingLSP(D, R"(Something terrible happened (fix available)
|
||||
|
||||
main.cpp:6:7: remark: declared somewhere in the main file
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue