This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGd941863de2be: [clangd] Use HeuristicResolver to produce a better semantic token for nameā¦ (authored by nridge).
Changed prior to commit: https://reviews.llvm.org/D99056?vs=340382&id=340385#toc 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; // returned from addToken(InvalidLoc) HighlightingToken InvalidHighlightingToken; }; @@ -457,7 +467,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())) @@ -470,7 +480,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())) @@ -611,7 +622,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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits