[PATCH] D64613: [clangd] Type hierarchy: don't resolve parents if the client only asked for children
Nathan Ridge via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 12 21:08:49 PDT 2019
nridge updated this revision to Diff 209677.
nridge added a comment.
Address review comment
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D64613/new/
https://reviews.llvm.org/D64613
Files:
clang-tools-extra/clangd/XRefs.cpp
clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp
Index: clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp
+++ clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp
@@ -630,7 +630,8 @@
ASSERT_TRUE(bool(Result));
EXPECT_THAT(
*Result,
- AllOf(WithName("Parent"), WithKind(SymbolKind::Struct), Parents(),
+ AllOf(WithName("Parent"), WithKind(SymbolKind::Struct),
+ ParentsNotResolved(),
Children(AllOf(WithName("Child1"), WithKind(SymbolKind::Struct),
ParentsNotResolved(), ChildrenNotResolved()))));
Index: clang-tools-extra/clangd/XRefs.cpp
===================================================================
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -1132,15 +1132,9 @@
using RecursionProtectionSet = llvm::SmallSet<const CXXRecordDecl *, 4>;
-static Optional<TypeHierarchyItem>
-getTypeAncestors(const CXXRecordDecl &CXXRD, ASTContext &ASTCtx,
- RecursionProtectionSet &RPSet) {
- Optional<TypeHierarchyItem> Result = declToTypeHierarchyItem(ASTCtx, CXXRD);
- if (!Result)
- return Result;
-
- Result->parents.emplace();
-
+static void fillSuperTypes(const CXXRecordDecl &CXXRD, ASTContext &ASTCtx,
+ std::vector<TypeHierarchyItem> &SuperTypes,
+ RecursionProtectionSet &RPSet) {
// typeParents() will replace dependent template specializations
// with their class template, so to avoid infinite recursion for
// certain types of hierarchies, keep the templates encountered
@@ -1149,22 +1143,22 @@
auto *Pattern = CXXRD.getDescribedTemplate() ? &CXXRD : nullptr;
if (Pattern) {
if (!RPSet.insert(Pattern).second) {
- return Result;
+ return;
}
}
for (const CXXRecordDecl *ParentDecl : typeParents(&CXXRD)) {
if (Optional<TypeHierarchyItem> ParentSym =
- getTypeAncestors(*ParentDecl, ASTCtx, RPSet)) {
- Result->parents->emplace_back(std::move(*ParentSym));
+ declToTypeHierarchyItem(ASTCtx, *ParentDecl)) {
+ ParentSym->parents.emplace();
+ fillSuperTypes(*ParentDecl, ASTCtx, *ParentSym->parents, RPSet);
+ SuperTypes.emplace_back(std::move(*ParentSym));
}
}
if (Pattern) {
RPSet.erase(Pattern);
}
-
- return Result;
}
const CXXRecordDecl *findRecordTypeAt(ParsedAST &AST, Position Pos) {
@@ -1231,12 +1225,19 @@
if (!CXXRD)
return llvm::None;
- RecursionProtectionSet RPSet;
Optional<TypeHierarchyItem> Result =
- getTypeAncestors(*CXXRD, AST.getASTContext(), RPSet);
+ declToTypeHierarchyItem(AST.getASTContext(), *CXXRD);
if (!Result)
return Result;
+ if (Direction == TypeHierarchyDirection::Parents ||
+ Direction == TypeHierarchyDirection::Both) {
+ Result->parents.emplace();
+
+ RecursionProtectionSet RPSet;
+ fillSuperTypes(*CXXRD, AST.getASTContext(), *Result->parents, RPSet);
+ }
+
if ((Direction == TypeHierarchyDirection::Children ||
Direction == TypeHierarchyDirection::Both) &&
ResolveLevels > 0) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D64613.209677.patch
Type: text/x-patch
Size: 3191 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190713/e0eedeff/attachment.bin>
More information about the cfe-commits
mailing list