sammccall accepted this revision.
sammccall added a comment.
This revision is now accepted and ready to land.

I think the code could be a bit clearer, but up to you. The tests are good so 
feel free to submit any version you're happy with.



================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:242
+            });
+        NonConflicting.push_back(
+            {HighlightingKind::InactiveCode,
----------------
Hmm, the role of `NonConflicting` is pretty confusing here: it has an invariant 
preserved as we construct it, then we violate it by dumping a bunch of ranges 
into it, then try to restore it.
And the correctness of the restoring seems to rely on some pretty subtle facts 
(that the inactive region always fully contains and is sorted *before* the 
regions it overlaps).

What about:
```
// Merge token stream with "inactive line" markers.
vector WithInactiveLines;
auto It = NonConflicting.begin();
for (Range &R : Ranges) {
  for (int Line : R) {
    // Copy tokens before the inactive line
    for (; It != NonConflicting.end() && It->position.begin.line < Line)
      WithInactiveLines.push_back(std::move(*It));
    // Add a token for the inactive line itself.
    WithInactiveLines.push_back(createInactiveLineToken(MainCode, Line));
    // Skip any other tokens on the inactive line
    while (It != NonConflicting.end() && It->position.begin.line == Line)
      ++It;
  }
}
// Copy tokens after the last inactive line
for (; It != NonOverlapping.end(); ++It)
  WithInactiveLines.push_back(std::move(*It));
```

The only real assumption here is "a token is associated with a line", which is 
pretty fundamental anyway.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85635

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to