[clangd] Add missing highlights for using decls.

Reviewers: ilya-biryukov

Subscribers: MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D69506
This commit is contained in:
Haojian Wu 2019-10-28 13:42:20 +01:00
parent 3fe7f1dcf4
commit 94cd2f0303
2 changed files with 19 additions and 5 deletions

View File

@ -37,6 +37,10 @@ bool canHighlightName(DeclarationName Name) {
llvm::Optional<HighlightingKind> kindForType(const Type *TP);
llvm::Optional<HighlightingKind> kindForDecl(const NamedDecl *D) {
if (auto *USD = dyn_cast<UsingShadowDecl>(D)) {
if (auto *Target = USD->getTargetDecl())
D = Target;
}
if (auto *TD = dyn_cast<TemplateDecl>(D)) {
if (auto *Templated = TD->getTemplatedDecl())
D = Templated;
@ -99,11 +103,10 @@ llvm::Optional<HighlightingKind> kindForType(const Type *TP) {
return kindForDecl(TD);
return llvm::None;
}
// Given a set of candidate declarations for an unresolved name,
// if the declarations all have the same highlighting kind, return
// that highlighting kind, otherwise return None.
llvm::Optional<HighlightingKind>
kindForCandidateDecls(llvm::iterator_range<UnresolvedSetIterator> Decls) {
// Given a set of candidate declarations, if the declarations all have the same
// highlighting kind, return that highlighting kind, otherwise return None.
template <typename IteratorRange>
llvm::Optional<HighlightingKind> kindForCandidateDecls(IteratorRange Decls) {
llvm::Optional<HighlightingKind> Result;
for (NamedDecl *Decl : Decls) {
auto Kind = kindForDecl(Decl);
@ -196,6 +199,12 @@ public:
return true;
}
bool VisitUsingDecl(UsingDecl *UD) {
if (auto K = kindForCandidateDecls(UD->shadows()))
addToken(UD->getLocation(), *K);
return true;
}
bool VisitDeclRefExpr(DeclRefExpr *Ref) {
if (canHighlightName(Ref->getNameInfo().getName()))
addToken(Ref->getLocation(), Ref->getDecl());

View File

@ -584,6 +584,11 @@ TEST(SemanticHighlighting, GetsCorrectTokens) {
return $TemplateParameter[[T]]::$DependentName[[Field]];
}
};
)cpp",
// Highlighting the using decl as the underlying using shadow decl.
R"cpp(
void $Function[[foo]]();
using ::$Function[[foo]];
)cpp"};
for (const auto &TestCase : TestCases) {
checkHighlightings(TestCase);