nridge updated this revision to Diff 340382.
nridge added a comment.
Rebase
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99056/new/
https://reviews.llvm.org/D99056
Files:
clang-tools-extra/clangd/SemanticHighlighting.cpp
clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -695,10 +695,10 @@
};
template <typename $TemplateParameter_decl[[T]]>
struct $Class_decl[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> {
- using $Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+ using $Class[[Base]]<$TemplateParameter[[T]]>::$Field_dependentName[[member]];
void $Method_decl[[method]]() {
- (void)$Unknown_dependentName[[member]];
+ (void)$Field_dependentName[[member]];
}
};
)cpp",
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===================================================================
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -64,8 +64,10 @@
llvm_unreachable("invalid name kind");
}
-llvm::Optional<HighlightingKind> kindForType(const Type *TP);
-llvm::Optional<HighlightingKind> kindForDecl(const NamedDecl *D) {
+llvm::Optional<HighlightingKind> kindForType(const Type *TP,
+ const HeuristicResolver *Resolver);
+llvm::Optional<HighlightingKind>
+kindForDecl(const NamedDecl *D, const HeuristicResolver *Resolver) {
if (auto *USD = dyn_cast<UsingShadowDecl>(D)) {
if (auto *Target = USD->getTargetDecl())
D = Target;
@@ -76,7 +78,8 @@
}
if (auto *TD = dyn_cast<TypedefNameDecl>(D)) {
// We try to highlight typedefs as their underlying type.
- if (auto K = kindForType(TD->getUnderlyingType().getTypePtrOrNull()))
+ if (auto K =
+ kindForType(TD->getUnderlyingType().getTypePtrOrNull(), Resolver))
return K;
// And fallback to a generic kind if this fails.
return HighlightingKind::Typedef;
@@ -133,23 +136,27 @@
return HighlightingKind::TemplateParameter;
if (isa<ConceptDecl>(D))
return HighlightingKind::Concept;
- if (isa<UnresolvedUsingValueDecl>(D)) {
- // FIXME: We may be able to do better using HeuristicResolver.
+ if (const auto *UUVD = dyn_cast<UnresolvedUsingValueDecl>(D)) {
+ auto Targets = Resolver->resolveUsingValueDecl(UUVD);
+ if (!Targets.empty()) {
+ return kindForDecl(Targets[0], Resolver);
+ }
return HighlightingKind::Unknown;
}
return llvm::None;
}
-llvm::Optional<HighlightingKind> kindForType(const Type *TP) {
+llvm::Optional<HighlightingKind>
+kindForType(const Type *TP, const HeuristicResolver *Resolver) {
if (!TP)
return llvm::None;
if (TP->isBuiltinType()) // Builtins are special, they do not have decls.
return HighlightingKind::Primitive;
if (auto *TD = dyn_cast<TemplateTypeParmType>(TP))
- return kindForDecl(TD->getDecl());
+ return kindForDecl(TD->getDecl(), Resolver);
if (isa<ObjCObjectPointerType>(TP))
return HighlightingKind::Class;
if (auto *TD = TP->getAsTagDecl())
- return kindForDecl(TD);
+ return kindForDecl(TD, Resolver);
return llvm::None;
}
@@ -400,11 +407,14 @@
return WithInactiveLines;
}
+ const HeuristicResolver *getResolver() const { return Resolver; }
+
private:
const syntax::TokenBuffer &TB;
const SourceManager &SourceMgr;
const LangOptions &LangOpts;
std::vector<HighlightingToken> Tokens;
+ const HeuristicResolver *Resolver;
HighlightingToken Dummy; // returned from addToken(InvalidLoc)
};
@@ -456,7 +466,7 @@
CollectExtraHighlightings(HighlightingsBuilder &H) : H(H) {}
bool VisitDecltypeTypeLoc(DecltypeTypeLoc L) {
- if (auto K = kindForType(L.getTypePtr())) {
+ if (auto K = kindForType(L.getTypePtr(), H.getResolver())) {
auto &Tok = H.addToken(L.getBeginLoc(), *K)
.addModifier(HighlightingModifier::Deduced);
if (auto Mod = scopeModifier(L.getTypePtr()))
@@ -469,7 +479,8 @@
auto *AT = D->getType()->getContainedAutoType();
if (!AT)
return true;
- if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull())) {
+ if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull(),
+ H.getResolver())) {
auto &Tok = H.addToken(D->getTypeSpecStartLoc(), *K)
.addModifier(HighlightingModifier::Deduced);
if (auto Mod = scopeModifier(AT->getDeducedType().getTypePtrOrNull()))
@@ -610,7 +621,7 @@
for (const NamedDecl *Decl : R.Targets) {
if (!canHighlightName(Decl->getDeclName()))
continue;
- auto Kind = kindForDecl(Decl);
+ auto Kind = kindForDecl(Decl, AST.getHeuristicResolver());
if (!Kind)
continue;
auto &Tok = Builder.addToken(R.NameLoc, *Kind);
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits