[PATCH] D83826: [clangd] Don't send invalid messages from remote index
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 15 04:18:11 PDT 2020
sammccall added a comment.
> Also add more error messages and logs.
I'm not sure about the error-handling strategy here:
- it's very verbose in the marshalling code. Are we sure it pays for itself? For comparison, the marshalling code for LSP itself silently returns `false` on error, which is handled at the top level. It's been fine so far.
- some errors are being logged that are not errors. e.g. it's not an error to drop a symbol because its declaration is in a file outside the index root, that's just expected behavior
- it's not clear which levels are responsible for logging errors, leaving the possibility that some errors will be logged twice or not at all
- it's not easy to change if we want a slightly different strategy
I'd suggest leaving out detailed error reporting for now, and reporting at the top level. You may need some mechanism to distinguish invalid vs filtered-out data.
It could be something like a "filtered out" flag that causes the error reporting to be suppressed. There are more design options here if marshalling is a class I think.
================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:151
!Message.has_canonical_declaration()) {
- elog("Cannot convert Symbol from Protobuf: {0}",
+ elog("Cannot convert Symbol from Protobuf (missing info, definition or "
+ "declaration): {1}",
----------------
aren't all these placeholders incorrect? first is {0}
================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:167
Result.Scope = Message.scope();
auto Definition = fromProtobuf(Message.definition(), Strings, IndexRoot);
+ if (!Definition) {
----------------
missing definition is perfectly valid, so both the old and new code look wrong here
================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:310
+ if (!Location) {
+ elog("Can not convet Reference to Potobuf (invalid location) {1}: {2}",
+ From, From.Location);
----------------
convert, protobuf
================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:333
}
if (llvm::sys::path::is_relative(IndexRoot)) {
+ elog("Remote index client got a relative path as index root: {1}",
----------------
we shouldn't be checking this every time, IndexRoot is fixed for the lifetime of the index so it should be checked once and asserted here.
(Wrapping the marshalling in a class is a nice clean way to do this)
================
Comment at: clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp:349
assert(!IndexRoot.empty());
if (llvm::sys::path::is_relative(IndexRoot)) {
+ elog("Index root {1} is not absolute path", IndexRoot);
----------------
and here... IndexRoot shouldn't be checked every time
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D83826/new/
https://reviews.llvm.org/D83826
More information about the cfe-commits
mailing list