Skip to content

Commit

Permalink
[clangd] Ensure lambda init-capture gets semantic token
Browse files Browse the repository at this point in the history
Prior to this patch, CollectExtraHighlightings would incorrectly produce
a token for the init-capture's type which overlapped the name and
resulted in both being dropped.

Fixes clangd/clangd#868

Differential Revision: https://reviews.llvm.org/D110130
  • Loading branch information
HighCommander4 committed Sep 23, 2021
1 parent 1f3f144 commit 4223195
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 11 deletions.
28 changes: 18 additions & 10 deletions clang-tools-extra/clangd/SemanticHighlighting.cpp
Expand Up @@ -601,16 +601,24 @@ class CollectExtraHighlightings
auto *AT = D->getType()->getContainedAutoType();
if (!AT)
return true;
if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull(),
H.getResolver())) {
auto &Tok = H.addToken(D->getTypeSpecStartLoc(), *K)
.addModifier(HighlightingModifier::Deduced);
const Type *Deduced = AT->getDeducedType().getTypePtrOrNull();
if (auto Mod = scopeModifier(Deduced))
Tok.addModifier(*Mod);
if (isDefaultLibrary(Deduced))
Tok.addModifier(HighlightingModifier::DefaultLibrary);
}
auto K =
kindForType(AT->getDeducedType().getTypePtrOrNull(), H.getResolver());
if (!K)
return true;
SourceLocation StartLoc = D->getTypeSpecStartLoc();
// The AutoType may not have a corresponding token, e.g. in the case of
// init-captures. In this case, StartLoc overlaps with the location
// of the decl itself, and producing a token for the type here would result
// in both it and the token for the decl being dropped due to conflict.
if (StartLoc == D->getLocation())
return true;
auto &Tok =
H.addToken(StartLoc, *K).addModifier(HighlightingModifier::Deduced);
const Type *Deduced = AT->getDeducedType().getTypePtrOrNull();
if (auto Mod = scopeModifier(Deduced))
Tok.addModifier(*Mod);
if (isDefaultLibrary(Deduced))
Tok.addModifier(HighlightingModifier::DefaultLibrary);
return true;
}

Expand Down
Expand Up @@ -772,6 +772,14 @@ sizeof...($TemplateParameter[[Elements]]);
$Function[[foo]]($Parameter[[x]]);
}
)cpp",
// init-captures
R"cpp(
void $Function_decl[[foo]]() {
int $LocalVariable_decl[[a]], $LocalVariable_decl[[b]];
[ $LocalVariable_decl[[c]] = $LocalVariable[[a]],
$LocalVariable_decl[[d]]($LocalVariable[[b]]) ]() {}();
}
)cpp",
};
for (const auto &TestCase : TestCases)
// Mask off scope modifiers to keep the tests manageable.
Expand Down Expand Up @@ -840,7 +848,7 @@ TEST(SemanticHighlighting, ScopeModifiers) {
)cpp",
R"cpp(
// Lambdas are considered functions, not classes.
auto $Variable_fileScope[[x]] = [m(42)] { // FIXME: annotate capture
auto $Variable_fileScope[[x]] = [$LocalVariable_functionScope[[m]](42)] {
return $LocalVariable_functionScope[[m]];
};
)cpp",
Expand Down

0 comments on commit 4223195

Please sign in to comment.