[PATCH] D139926: [clangd] Add semantic token for angle brackets

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 31 05:55:49 PST 2023


kadircet added inline comments.


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:382
+
+    // For the inner element of a nested template instantiation with no space
+    // between the '>' characters, TemplateSpecializationLocInfo::RAngleLoc has
----------------
i am actually having a hard time following the logic here. it feels like what you really want is map `>` back to its file location, possibly to a `>>` token, and deal with second case specially.
so maybe something like:
```
// RLoc might be pointing at a virtual buffer when it's part of a `>>` token.
RLoc = SM.getFileLoc(RLoc);
// Make sure token is part of the main file.
RLoc = getHighlightableSpellingToken(RLoc);
if(!RLoc.isValid())
  return;

const auto *RTok = TB.spelledTokenAt(RLoc);
// Handle `>>`. RLoc is always pointing at the right location, just change
// the end to be offset by 1.
// We'll either point at the beginning of `>>`, hence get a proper spelled
// or point in the middle of `>>` hence get no spelled tok.
if (!RTok || RTok->kind() == tok::greatergreater) {
  Position Begin = sourceLocToPosition(SourceMgr, RLoc);
  Position End = sourceLocToPosition(SourceMgr, RLoc.getLocWithOffset(1));
  addToken(*LRange, HighlightingKind::Bracket);
  addToken({Begin, End}, HighlightingKind::Bracket);
  return;
}

// Easy case, we have the `>` token directly available.
if (RTok->kind() == tok::greater) {
  if (auto RRange = getRangeForSourceLocation(RLoc)) {
    addToken(*LRange, HighlightingKind::Bracket);
    addToken(*RRange, HighlightingKind::Bracket);
  }
  return;
}
```

This should also make sure you're handling line continuations properly.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D139926



More information about the cfe-commits mailing list