[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