summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/ClangdServer.cpp
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2019-04-18 11:35:22 +0000
committerHaojian Wu <hokein@google.com>2019-04-18 11:35:22 +0000
commit0842daf5ba750291c9ee0936926c1adce4c8e1f9 (patch)
treef8a55d30016346ad0f0bf4a59ea9195516720a23 /clang-tools-extra/clangd/ClangdServer.cpp
parent403d3187a79bd3feb8b54ea4717567c047fea608 (diff)
downloadbcm5719-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
Diffstat (limited to 'clang-tools-extra/clangd/ClangdServer.cpp')
-rw-r--r--clang-tools-extra/clangd/ClangdServer.cpp22
1 files changed, 17 insertions, 5 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()) {
OpenPOWER on IntegriCloud