[clang-tools-extra] ddfe13e - [clangd] Produce semantic token for name referring to UnresolvedUsingValueDecl
Nathan Ridge via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 25 13:45:26 PDT 2021
Author: Nathan Ridge
Date: 2021-04-25T16:43:58-04:00
New Revision: ddfe13e757cb72c056cba8d889d6cb8ee69f1afa
URL: https://github.com/llvm/llvm-project/commit/ddfe13e757cb72c056cba8d889d6cb8ee69f1afa
DIFF: https://github.com/llvm/llvm-project/commit/ddfe13e757cb72c056cba8d889d6cb8ee69f1afa.diff
LOG: [clangd] Produce semantic token for name referring to UnresolvedUsingValueDecl
For now, use the token kind Unknown. We may be able to improve on this
using HeuristicResolver.
Differential Revision: https://reviews.llvm.org/D99052
Added:
Modified:
clang-tools-extra/clangd/SemanticHighlighting.cpp
clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index cf06eac01a34..c4cb57e3f32b 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -133,6 +133,10 @@ llvm::Optional<HighlightingKind> kindForDecl(const NamedDecl *D) {
return HighlightingKind::TemplateParameter;
if (isa<ConceptDecl>(D))
return HighlightingKind::Concept;
+ if (isa<UnresolvedUsingValueDecl>(D)) {
+ // FIXME: We may be able to do better using HeuristicResolver.
+ return HighlightingKind::Unknown;
+ }
return llvm::None;
}
llvm::Optional<HighlightingKind> kindForType(const Type *TP) {
@@ -228,6 +232,12 @@ bool isAbstract(const Decl *D) {
return false;
}
+bool isDependent(const Decl *D) {
+ if (isa<UnresolvedUsingValueDecl>(D))
+ return true;
+ return false;
+}
+
// For a macro usage `DUMP(foo)`, we want:
// - DUMP --> "macro"
// - foo --> "variable".
@@ -619,9 +629,14 @@ std::vector<HighlightingToken> getSemanticHighlightings(ParsedAST &AST) {
Tok.addModifier(HighlightingModifier::Static);
if (isAbstract(Decl))
Tok.addModifier(HighlightingModifier::Abstract);
+ if (isDependent(Decl))
+ Tok.addModifier(HighlightingModifier::DependentName);
if (Decl->isDeprecated())
Tok.addModifier(HighlightingModifier::Deprecated);
- if (R.IsDecl)
+ // Do not treat an UnresolvedUsingValueDecl as a declaration.
+ // It's more common to think of it as a reference to the
+ // underlying declaration.
+ if (R.IsDecl && !isa<UnresolvedUsingValueDecl>(Decl))
Tok.addModifier(HighlightingModifier::Declaration);
}
},
diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index d8dc3b061df5..7e979ee4e75d 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -688,6 +688,20 @@ sizeof...($TemplateParameter[[Elements]]);
@implementation $Class[[Foo]]($Namespace_decl[[Bar]])
@end
)cpp",
+ // Member imported from dependent base
+ R"cpp(
+ template <typename> struct $Class_decl[[Base]] {
+ int $Field_decl[[member]];
+ };
+ template <typename $TemplateParameter_decl[[T]]>
+ struct $Class_decl[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> {
+ using $Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+
+ void $Method_decl[[method]]() {
+ (void)$Unknown_dependentName[[member]];
+ }
+ };
+ )cpp",
};
for (const auto &TestCase : TestCases)
// Mask off scope modifiers to keep the tests manageable.
More information about the cfe-commits
mailing list