diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -152,6 +152,38 @@ return true; } + bool VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { + if (canHighlightName(E->getName())) { + addToken(E->getNameLoc(), E->getNamingClass() + ? HighlightingKind::StaticMethod + : HighlightingKind::Function); + } + return true; + } + + bool VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { + if (canHighlightName(E->getMemberName())) { + addToken(E->getNameLoc(), HighlightingKind::Method); + } + return true; + } + + bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { + if (canHighlightName(E->getDeclName())) { + addToken(E->getLocation(), HighlightingKind::StaticField); + } + return true; + } + + bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) { + if (canHighlightName(E->getMember())) { + addToken(E->getMemberLoc(), E->getQualifier() + ? HighlightingKind::StaticField + : HighlightingKind::Field); + } + return true; + } + bool VisitNamedDecl(NamedDecl *ND) { if (canHighlightName(ND->getDeclName())) addToken(ND->getLocation(), ND); @@ -187,6 +219,11 @@ return true; } + bool VisitDependentNameTypeLoc(DependentNameTypeLoc L) { + addToken(L.getNameLoc(), HighlightingKind::Class); + return true; + } + bool VisitTypeLoc(TypeLoc TL) { if (auto K = kindForType(TL.getTypePtr())) addToken(TL.getBeginLoc(), *K); diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -175,7 +175,7 @@ } template struct $Class[[C]] : $Namespace[[abc]]::$Class[[A]]<$TemplateParameter[[T]]> { - typename $TemplateParameter[[T]]::A* $Field[[D]]; + typename $TemplateParameter[[T]]::$Class[[A]]* $Field[[D]]; }; $Namespace[[abc]]::$Class[[A]]<$Primitive[[int]]> $Variable[[AA]]; typedef $Namespace[[abc]]::$Class[[A]]<$Primitive[[int]]> $Class[[AAA]]; @@ -509,6 +509,55 @@ $Typedef[[Pointer]], $Typedef[[LVReference]], $Typedef[[RVReference]], $Typedef[[Array]], $Typedef[[MemberPointer]]); }; + )cpp", + R"cpp( + template + $Primitive[[void]] $Function[[foo]]($TemplateParameter[[T]] $Parameter[[P]]) { + $Function[[bar]]($Parameter[[P]]); + } + )cpp", + R"cpp( + class $Class[[A]] { + template + $Primitive[[void]] $Method[[bar]]($TemplateParameter[[T]]); + }; + + template + $Primitive[[void]] $Function[[foo]]($TemplateParameter[[U]] $Parameter[[P]]) { + $Class[[A]]().$Method[[bar]]($Parameter[[P]]); + } + )cpp", + R"cpp( + struct $Class[[A]] { + template + static $Primitive[[void]] $StaticMethod[[foo]]($TemplateParameter[[T]]); + }; + + template + struct $Class[[B]] { + $Primitive[[void]] $Method[[bar]]() { + $Class[[A]]::$StaticMethod[[foo]]($TemplateParameter[[T]]()); + } + }; + )cpp", + R"cpp( + template + $Primitive[[void]] $Function[[foo]](typename $TemplateParameter[[T]]::$Class[[Type]] + = $TemplateParameter[[T]]::$StaticField[[val]]); + )cpp", + R"cpp( + template + $Primitive[[void]] $Function[[foo]]($TemplateParameter[[T]] $Parameter[[P]]) { + $Parameter[[P]].$Field[[Field]]; + } + )cpp", + R"cpp( + template + class $Class[[A]] { + $Primitive[[int]] $Method[[foo]]() { + return $TemplateParameter[[T]]::$StaticField[[Field]]; + } + }; )cpp"}; for (const auto &TestCase : TestCases) { checkHighlightings(TestCase);