mirror of
https://github.com/JakeHillion/object-introspection.git
synced 2024-09-19 02:59:05 +01:00
stub types in OIL via config (#484)
This commit is contained in:
parent
7103680894
commit
bfafe2eeae
@ -31,7 +31,9 @@
|
||||
#include <range/v3/view/for_each.hpp>
|
||||
#include <range/v3/view/take.hpp>
|
||||
#include <range/v3/view/transform.hpp>
|
||||
#include <set>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <variant>
|
||||
|
||||
@ -85,6 +87,7 @@ class ConsumerContext {
|
||||
std::unordered_map<std::string, type_graph::Type*> nameToTypeMap;
|
||||
std::optional<bool> pic;
|
||||
const std::vector<std::unique_ptr<ContainerInfo>>& containerInfos;
|
||||
std::set<std::string_view> 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;
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <clang/AST/Decl.h>
|
||||
#include <clang/AST/DeclTemplate.h>
|
||||
#include <clang/AST/QualTypeNames.h>
|
||||
#include <clang/AST/RecordLayout.h>
|
||||
#include <clang/AST/Type.h>
|
||||
#include <clang/Basic/DiagnosticSema.h>
|
||||
#include <clang/Sema/Sema.h>
|
||||
@ -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<Incomplete>(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<Dummy>(ty, size, alignment, fqName);
|
||||
return c;
|
||||
}
|
||||
|
||||
auto& c = makeType<Class>(
|
||||
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);
|
||||
|
||||
|
@ -60,6 +60,7 @@ struct TemplateParam;
|
||||
struct ClangTypeParserOptions {
|
||||
bool chaseRawPointers = false;
|
||||
bool readEnumValues = false;
|
||||
std::set<std::string_view> typesToStub;
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user