diff --git a/oi/OIGenerator.cpp b/oi/OIGenerator.cpp index ba06069..758bc85 100644 --- a/oi/OIGenerator.cpp +++ b/oi/OIGenerator.cpp @@ -31,7 +31,9 @@ #include #include #include +#include #include +#include #include #include @@ -85,6 +87,7 @@ class ConsumerContext { std::unordered_map nameToTypeMap; std::optional pic; const std::vector>& containerInfos; + std::set typesToStub; private: clang::Sema* sema = nullptr; @@ -133,6 +136,12 @@ int OIGenerator::generate(clang::tooling::CompilationDatabase& db, } ConsumerContext ctx{containerInfos}; + + for (const auto& [stubType, stubMember] : generatorConfig.membersToStub) { + if (stubMember == "*") + ctx.typesToStub.insert(stubType); + } + CreateTypeGraphActionFactory factory{ctx}; clang::tooling::ClangTool tool{db, sourcePaths}; @@ -239,6 +248,8 @@ class CreateTypeGraphConsumer : public clang::ASTConsumer { return; type_graph::ClangTypeParserOptions opts; + opts.typesToStub = ctx.typesToStub; + type_graph::ClangTypeParser parser{ctx.typeGraph, ctx.containerInfos, opts}; auto& Sema = *ctx.sema; diff --git a/oi/type_graph/ClangTypeParser.cpp b/oi/type_graph/ClangTypeParser.cpp index 9dc9ef4..db486e6 100644 --- a/oi/type_graph/ClangTypeParser.cpp +++ b/oi/type_graph/ClangTypeParser.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,7 @@ Type& ClangTypeParser::enumerateType(const clang::Type& ty) { if (!requireCompleteType(*sema, ty)) { std::string fqName = clang::TypeName::getFullyQualifiedName( clang::QualType(&ty, 0), *ast, {ast->getLangOpts()}); + VLOG(3) << "Returning incomplete type for " << fqName; return makeType(ty, std::move(fqName)); } @@ -194,12 +196,23 @@ Type& ClangTypeParser::enumerateClass(const clang::RecordType& ty) { int virtuality = 0; + std::string fqnWithoutTemplateParams = decl->getQualifiedNameAsString(); + + if (options_.typesToStub.contains(fqnWithoutTemplateParams)) { + uint64_t alignment = decl->getASTContext() + .getASTRecordLayout(decl) + .getAlignment() + .getQuantity(); + auto& c = makeType(ty, size, alignment, fqName); + return c; + } + auto& c = makeType( ty, kind, std::move(name), std::move(fqName), size, virtuality); c.setAlign(ast->getTypeAlign(clang::QualType(&ty, 0)) / 8); enumerateClassTemplateParams(ty, c.templateParams); - // enumerateClassParents(type, c.parents); + // enumerateClassParents(ty, c.parents); enumerateClassMembers(ty, c.members); // enumerateClassFunctions(type, c.functions); diff --git a/oi/type_graph/ClangTypeParser.h b/oi/type_graph/ClangTypeParser.h index 9b27d64..53cf8ac 100644 --- a/oi/type_graph/ClangTypeParser.h +++ b/oi/type_graph/ClangTypeParser.h @@ -60,6 +60,7 @@ struct TemplateParam; struct ClangTypeParserOptions { bool chaseRawPointers = false; bool readEnumValues = false; + std::set typesToStub; }; /*