diff options
| author | Haojian Wu <hokein@google.com> | 2019-04-18 11:35:22 +0000 |
|---|---|---|
| committer | Haojian Wu <hokein@google.com> | 2019-04-18 11:35:22 +0000 |
| commit | 0842daf5ba750291c9ee0936926c1adce4c8e1f9 (patch) | |
| tree | f8a55d30016346ad0f0bf4a59ea9195516720a23 | |
| parent | 403d3187a79bd3feb8b54ea4717567c047fea608 (diff) | |
| download | bcm5719-llvm-0842daf5ba750291c9ee0936926c1adce4c8e1f9.tar.gz bcm5719-llvm-0842daf5ba750291c9ee0936926c1adce4c8e1f9.zip | |
[clangd] Emit better error messages when rename fails.
Summary:
Currently we emit an unfriendly "clang diagnostic" message when rename fails. This
patch makes clangd to emit a detailed diagnostic message.
Reviewers: sammccall
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D60821
llvm-svn: 358658
| -rw-r--r-- | clang-tools-extra/clangd/ClangdServer.cpp | 22 | ||||
| -rw-r--r-- | clang-tools-extra/test/clangd/rename.test | 2 |
2 files changed, 18 insertions, 6 deletions
diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp index e14c1d29c3b..de6083f132f 100644 --- a/clang-tools-extra/clangd/ClangdServer.cpp +++ b/clang-tools-extra/clangd/ClangdServer.cpp @@ -44,14 +44,24 @@ namespace clang { namespace clangd { namespace { +// Expand a DiagnosticError to make it print-friendly (print the detailed +// message, rather than "clang diagnostic"). +llvm::Error expandDiagnostics(llvm::Error Err, DiagnosticsEngine &DE) { + if (auto Diag = DiagnosticError::take(Err)) { + llvm::cantFail(std::move(Err)); + SmallVector<char, 128> DiagMessage; + Diag->second.EmitToString(DE, DiagMessage); + return llvm::make_error<llvm::StringError>(DiagMessage, + llvm::inconvertibleErrorCode()); + } + return Err; +} + class RefactoringResultCollector final : public tooling::RefactoringResultConsumer { public: void handleError(llvm::Error Err) override { assert(!Result.hasValue()); - // FIXME: figure out a way to return better message for DiagnosticError. - // clangd uses llvm::toString to convert the Err to string, however, for - // DiagnosticError, only "clang diagnostic" will be generated. Result = std::move(Err); } @@ -301,13 +311,15 @@ void ClangdServer::rename(PathRef File, Position Pos, llvm::StringRef NewName, auto Rename = clang::tooling::RenameOccurrences::initiate( Context, SourceRange(SourceLocationBeg), NewName); if (!Rename) - return CB(Rename.takeError()); + return CB(expandDiagnostics(Rename.takeError(), + AST.getASTContext().getDiagnostics())); Rename->invoke(ResultCollector, Context); assert(ResultCollector.Result.hasValue()); if (!ResultCollector.Result.getValue()) - return CB(ResultCollector.Result->takeError()); + return CB(expandDiagnostics(ResultCollector.Result->takeError(), + AST.getASTContext().getDiagnostics())); std::vector<TextEdit> Replacements; for (const tooling::AtomicChange &Change : ResultCollector.Result->get()) { diff --git a/clang-tools-extra/test/clangd/rename.test b/clang-tools-extra/test/clangd/rename.test index caf8b2007ec..7c504bd1a87 100644 --- a/clang-tools-extra/test/clangd/rename.test +++ b/clang-tools-extra/test/clangd/rename.test @@ -29,7 +29,7 @@ {"jsonrpc":"2.0","id":2,"method":"textDocument/rename","params":{"textDocument":{"uri":"test:///foo.cpp"},"position":{"line":0,"character":2},"newName":"bar"}} # CHECK: "error": { # CHECK-NEXT: "code": -32001, -# CHECK-NEXT: "message": "clang diagnostic" +# CHECK-NEXT: "message": "there is no symbol at the given location" # CHECK-NEXT: }, # CHECK-NEXT: "id": 2, # CHECK-NEXT: "jsonrpc": "2.0" |

