[PATCH] D84939: [clangd] Propagate remote index errors via Expected

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 30 07:36:15 PDT 2020


kadircet added a comment.

i think you might want to have an helper for creating stringerrors and use it in all places



================
Comment at: clang-tools-extra/clangd/index/remote/Client.cpp:60
+             Response.takeError());
+        llvm::consumeError(Response.takeError());
         ++FailedToParse;
----------------
elog already consumes the error


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:131
+  if (!Message.has_info() || !Message.has_canonical_declaration())
+    return make_error<StringError>("Missing info, definition or declaration.",
+                                   inconvertibleErrorCode());
----------------
error mentions definition too but conditional only looks for info and declaration?


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:162
       Result.IncludeHeaders.push_back(*SerializedHeader);
     else
+      elog("Cannot convert HeaderWithIncludes from protobuf; skipping it: {0}. "
----------------
nit: swap branches and early exit, i.e.

```
if(!SerializedHeader) {
 elog...
 continue;
}
push_back;
```


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:163
     else
-      elog("Cannot convert HeaderWithIncludes from protobuf: {0}",
-           Header.DebugString());
+      elog("Cannot convert HeaderWithIncludes from protobuf; skipping it: {0}. "
+           "Reason: {1}",
----------------
what makes this a non-terminal error?


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:189
+    return SubjectID.takeError();
   if (!Message.has_object()) {
+    return make_error<StringError>("Missing Object.", inconvertibleErrorCode());
----------------
nit: redundant braces 


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:273
     auto Serialized = toProtobuf(Header);
     if (!Serialized) {
+      elog("Can not convert IncludeHeaderWithReferences {0} to protobuf; "
----------------
again, what makes this non-terminal?


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:277
+           Header.IncludeHeader, Serialized.takeError());
+      llvm::consumeError(Serialized.takeError());
       continue;
----------------
elog already consumes the error


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:313
                              RelativePath, llvm::sys::path::Style::posix));
-  if (RelativePath.empty()) {
-    return llvm::None;
-  }
-  if (llvm::sys::path::is_absolute(RelativePath)) {
-    return llvm::None;
-  }
+  if (RelativePath.empty())
+    return make_error<StringError>("Empty relative path.",
----------------
is `RelativePath` user provided? can't we just assert on non-emptiness and non-absoluteness and make this function return a std::string instead?


================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:330
+    return ParsedURI.takeError();
+  if (ParsedURI->scheme() != "file")
+    return make_error<StringError>("Can not use URI schemes other than file.",
----------------
again why not make this (and the following) an assertion?


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:89
     if (!Req) {
-      elog("Can not parse LookupRequest from protobuf: {0}", Req.takeError());
+      elog("Can not parse {0} from protobuf: {1}",
+           LookupRequest::descriptor()->name(), Req.takeError());
----------------
nit: I would keep `LookupRequest` instead of going through `descriptor()->name()` (maybe even change the one in tracer), makes it more explicit especially for the people not experienced with protos.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:95
     unsigned FailedToSend = 0;
     Index->lookup(*Req, [&](const auto &Item) {
       auto SerializedItem = ProtobufMarshaller->toProtobuf(Item);
----------------
this still has `auto` in it? (and other callbacks too)


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:100
+             SerializedItem.takeError());
+        llvm::consumeError(SerializedItem.takeError());
         ++FailedToSend;
----------------
again, elog consumes


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:124
+      elog("Can not parse {0} from protobuf: {1}",
+           LookupRequest::descriptor()->name(), Req.takeError());
       return grpc::Status::CANCELLED;
----------------
same for usage of `descriptor()->name()`


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:134
+             SerializedItem.takeError());
+        llvm::consumeError(SerializedItem.takeError());
         ++FailedToSend;
----------------
again, elog consumes


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D84939/new/

https://reviews.llvm.org/D84939



More information about the cfe-commits mailing list