[PATCH] D64475: [clangd] Duplicate lines of semantic highlightings sent removed.

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 18 07:54:04 PDT 2019


ilya-biryukov added inline comments.


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:274
+std::vector<LineHighlightings>
+diffHighlightings(ArrayRef<HighlightingToken> NewHighlightings,
+                  ArrayRef<HighlightingToken> OldHighlightings) {
----------------
NIT: maybe rename to `New` and `Old`, the suffix of the name could be easily inferred from the variable type (clangd has hover/go-to-definition to find the type quickly, the code is rather small so its should always be visible on the screen too).


================
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
----------------
ilya-biryukov wrote:
> 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)
NIT: add assertions that highlightings are sorted.


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:286
+  // incorrectly removed.
+  std::vector<LineHighlightings> LineTokens;
+  // ArrayRefs to the current line in the highlights.
----------------
NIT: maybe mention `diff` in the name somehow. I was confused at first, as I thought it's all highlightings grouped by line, not the diff.


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:292
+                                      /*length*/0UL);
+  auto NewEnd = NewHighlightings.end();
+  auto OldEnd = OldHighlightings.end();
----------------
NIT: maybe just inline `NewEnd` and `OldEnd` to save a few lines?


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:294
+  auto OldEnd = OldHighlightings.end();
+  for (int Line = 0; NewLine.end() < NewEnd || OldLine.end() < OldEnd; ++Line) {
+    NewLine = takeLine(NewHighlightings, NewLine.end(), Line);
----------------
Could we skip directly to the next interesting line?
The simplest way to do this I could come up with is this:
```
auto NextLine = [&]() {
  int NextNew = NewLine.end() != NewHighlightings.end() ? NewLine.end()->start.line : numeric_limits<int>::max();
  int NextOld = ...;
  return std::min(NextNew, NextOld);
}

for (int Line = 0; ...; Line = NextLine()) {
}
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D64475





More information about the cfe-commits mailing list