ilya-biryukov added a comment.
A few suggestions from me, I haven't looked into the diffing algorithm and the
tests yet.
================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:458
+ // edit there are stale previous highlightings.
+ std::lock_guard<std::mutex> Lock(HighlightingsMutex);
+ FileToHighlightings.erase(File);
----------------
Should can't we handle this on `didClose` instead?
================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:1115
+ std::lock_guard<std::mutex> Lock(HighlightingsMutex);
+ Old = FileToHighlightings[File];
+ }
----------------
hokein wrote:
> use std::move() to save a copy here. we'd drop the old highlighting anyway
> (replace it with new highlightings).
NIT: maybe std::move() into Old?
If we had exceptions, that would be complicated, but we don't have them
================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:1124
+ {
+ std::lock_guard<std::mutex> Lock(HighlightingsMutex);
+ FileToHighlightings[File] = std::move(Highlightings);
----------------
To follow the same pattern as diagnostics, could we store before calling
`publish...`?
================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:276
+ ArrayRef<HighlightingToken> OldHighlightings) {
+ // FIXME: There's an edge case when tokens span multiple lines. If the first
+ // token on the line started on a line above the current one and the rest of
----------------
Do you have any ideas on how we can fix this?
I would simply split those tokens into multiple tokens of the same kind at
newlines boundaries, but maybe there are other ways to handle this.
In any case, could you put a suggested way to fix this (in case someone will
want to pick it up, they'll have a starting point)
================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.h:79
+std::vector<LineHighlightings>
+diffHighlightings(ArrayRef<HighlightingToken> NewHighlightings,
+ ArrayRef<HighlightingToken> OldHighlightings);
----------------
Are we locked into the line-based diff implementation?
It works nicely while editing inside the same line, but seem to do a bad job on
a common case of inserting/removing lines.
Does the protocol have a way to communicate this cleanly?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D64475/new/
https://reviews.llvm.org/D64475
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits