Skip to content

Commit c367e7f

Browse files
tyrogurufacebook-github-bot
authored andcommitted
clangparser: add support for parents
Summary: Add support in ClangTypeParser for parents. Reviewed By: JakeHillion Differential Revision: D53708619
1 parent 1ba742b commit c367e7f

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

oi/type_graph/ClangTypeParser.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <clang/AST/ASTContext.h>
1919
#include <clang/AST/Decl.h>
20+
#include <clang/AST/DeclCXX.h>
2021
#include <clang/AST/DeclTemplate.h>
2122
#include <clang/AST/QualTypeNames.h>
2223
#include <clang/AST/RecordLayout.h>
@@ -214,7 +215,7 @@ Type& ClangTypeParser::enumerateClass(const clang::RecordType& ty) {
214215
if (options_.mustProcessTemplateParams.contains(fqnWithoutTemplateParams))
215216
enumerateClassTemplateParams(ty, c.templateParams);
216217

217-
// enumerateClassParents(ty, c.parents);
218+
enumerateClassParents(ty, c.parents);
218219
enumerateClassMembers(ty, c.members);
219220

220221
return c;
@@ -312,6 +313,31 @@ std::optional<TemplateParam> ClangTypeParser::enumerateTemplateTemplateParam(
312313
}
313314
}
314315

316+
void ClangTypeParser::enumerateClassParents(const clang::RecordType& ty,
317+
std::vector<Parent>& parents) {
318+
assert(parents.empty());
319+
320+
auto* decl = ty.getDecl();
321+
auto* cxxDecl = llvm::dyn_cast<clang::CXXRecordDecl>(decl);
322+
if (cxxDecl == nullptr)
323+
return;
324+
325+
const auto& layout = decl->getASTContext().getASTRecordLayout(cxxDecl);
326+
for (const auto& base : cxxDecl->bases()) {
327+
auto baseType = base.getType();
328+
if (baseType.isNull())
329+
continue;
330+
331+
auto* baseCxxDecl = baseType->getAsCXXRecordDecl();
332+
if (baseCxxDecl == nullptr)
333+
continue;
334+
335+
auto offset = layout.getBaseClassOffset(baseCxxDecl).getQuantity();
336+
auto& ptype = enumerateType(*baseType);
337+
parents.emplace_back(Parent{ptype, static_cast<uint64_t>(offset)});
338+
}
339+
}
340+
315341
void ClangTypeParser::enumerateClassMembers(const clang::RecordType& ty,
316342
std::vector<Member>& members) {
317343
assert(members.empty());

oi/type_graph/ClangTypeParser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class Array;
5050
class Class;
5151
class Enum;
5252
class Member;
53+
struct Parent;
5354
class Primitive;
5455
class Reference;
5556
class Type;
@@ -116,6 +117,7 @@ class ClangTypeParser {
116117
std::optional<TemplateParam> enumerateTemplateTemplateParam(
117118
const clang::TemplateName&);
118119

120+
void enumerateClassParents(const clang::RecordType&, std::vector<Parent>&);
119121
void enumerateClassMembers(const clang::RecordType&, std::vector<Member>&);
120122

121123
ContainerInfo* getContainerInfo(const std::string& fqName) const;

0 commit comments

Comments
 (0)