From 710368089499b40c2a822892f56268ffe3695a93 Mon Sep 17 00:00:00 2001 From: Jon Haslam Date: Wed, 7 Feb 2024 07:41:52 -0800 Subject: [PATCH] ignore fully qualified types --- .circleci/config.yml | 2 +- oi/type_graph/RemoveMembers.cpp | 7 +- oi/type_graph/RemoveMembers.h | 2 +- test/integration/ignored.toml | 216 ++++++++++++++++++++++++++++++-- 4 files changed, 211 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b91cc2c..443439f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,7 +30,7 @@ workflows: requires: - build-clang # Tests disabled due to bad DWARF generated by the old clang compiler in CI - exclude_regex: ".*inheritance_polymorphic.*|.*arrays_member_int0|.*fbstring.*|.*std_string_*|.*multi_arg_tb_.*|.*ignored_a|OilIntegration.fbstring_.*|OilIntegration.capture_keys_string|OilIntegration.capture_keys_multi_level" + exclude_regex: ".*inheritance_polymorphic.*|.*arrays_member_int0|.*fbstring.*|.*std_string_*|.*multi_arg_tb_.*|.*ignored_member|OilIntegration.fbstring_.*|OilIntegration.capture_keys_string|OilIntegration.capture_keys_multi_level" executors: nix-docker: diff --git a/oi/type_graph/RemoveMembers.cpp b/oi/type_graph/RemoveMembers.cpp index 1b14f31..eef28e8 100644 --- a/oi/type_graph/RemoveMembers.cpp +++ b/oi/type_graph/RemoveMembers.cpp @@ -61,7 +61,7 @@ void RemoveMembers::visit(Class& c) { } std::erase_if(c.members, [this, &c](Member member) { - if (ignoreMember(c.name(), member.name)) + if (ignoreMember(c.inputName(), member.name)) return true; if (dynamic_cast(&member.type())) return true; @@ -69,10 +69,11 @@ void RemoveMembers::visit(Class& c) { }); } -bool RemoveMembers::ignoreMember(const std::string& typeName, +bool RemoveMembers::ignoreMember(std::string_view typeName, const std::string& memberName) const { for (const auto& [ignoredType, ignoredMember] : membersToIgnore_) { - if (typeName == ignoredType && memberName == ignoredMember) { + if (typeName == ignoredType && + (memberName == ignoredMember || ignoredMember == "*")) { return true; } } diff --git a/oi/type_graph/RemoveMembers.h b/oi/type_graph/RemoveMembers.h index caed359..ed6aa1c 100644 --- a/oi/type_graph/RemoveMembers.h +++ b/oi/type_graph/RemoveMembers.h @@ -47,7 +47,7 @@ class RemoveMembers : public RecursiveVisitor { void visit(Class& c) override; private: - bool ignoreMember(const std::string& typeName, + bool ignoreMember(std::string_view typeName, const std::string& memberName) const; std::unordered_set visited_; diff --git a/test/integration/ignored.toml b/test/integration/ignored.toml index b880bb6..2287f48 100644 --- a/test/integration/ignored.toml +++ b/test/integration/ignored.toml @@ -6,11 +6,15 @@ definitions = ''' struct Bar { std::string a, b, c; }; + + struct FooBar { + Foo a; + Bar b; + }; ''' [cases] - [cases.a] - skip = 'v2 hides the member entirely when it should show it with static size' # todo: github issue + [cases.roottype] param_types = ["const Bar&"] setup = """ return Bar{ @@ -21,18 +25,208 @@ definitions = ''' """ config_suffix = """ [[codegen.ignore]] - type = "Foo" + type = "ns_ignored::Bar" + + """ + expect_json_v2 = '''[{ + "staticSize":96, + "exclusiveSize":96, + "members":[] + }]''' + + expect_json =''' +[ + { + "name": "a0", + "typePath": "a0", + "typeName": "ns_ignored::Bar", + "isTypedef": false, + "staticSize": 96, + "dynamicSize": 0, + "exclusiveSize": 96 + } +] +''' + + [cases.subtype] + param_types = ["const FooBar&"] + setup = """ + return FooBar{ + { 1, 2, 3}, { + "The first member of the struct Bar", + "The second member of the struct Bar", + "The 3rd member of the struct Bar" + }} ; + """ + config_suffix = """ + [[codegen.ignore]] + type = "ns_ignored::Bar" + + """ + expect_json_v2 = '''[{ + "staticSize":112, + "exclusiveSize":4, + "members":[ + { + "name": "a", + "staticSize": 12, + "exclusiveSize": 0, + "members": [ + { "name":"a", "staticSize":4, "exclusiveSize":4 }, + { "name":"b", "staticSize":4, "exclusiveSize":4 }, + { "name":"c", "staticSize":4, "exclusiveSize":4 } + ] + }, + { + "name":"b", + "staticSize":96, + "exclusiveSize":96 + } + ]}]''' + + expect_json = ''' +[ + { + "name": "a0", + "typePath": "a0", + "typeName": "ns_ignored::FooBar", + "isTypedef": false, + "staticSize": 112, + "dynamicSize": 0, + "exclusiveSize": 4, + "members": [ + { + "name": "a", + "typePath": "a", + "typeName": "ns_ignored::Foo", + "isTypedef": false, + "staticSize": 12, + "dynamicSize": 0, + "exclusiveSize": 0, + "members": [ + { + "name": "a", + "typePath": "a", + "typeName": "int32_t", + "isTypedef": false, + "staticSize": 4, + "dynamicSize": 0, + "exclusiveSize": 4 + }, + { + "name": "b", + "typePath": "b", + "typeName": "int32_t", + "isTypedef": false, + "staticSize": 4, + "dynamicSize": 0, + "exclusiveSize": 4 + }, + { + "name": "c", + "typePath": "c", + "typeName": "int32_t", + "isTypedef": false, + "staticSize": 4, + "dynamicSize": 0, + "exclusiveSize": 4 + } + ] + }, + { + "name": "b", + "typePath": "b", + "typeName": "ns_ignored::Bar", + "isTypedef": false, + "staticSize": 96, + "dynamicSize": 0, + "exclusiveSize": 96 + } + ] + } +] + ''' + + + [cases.member] + param_types = ["const Bar&"] + setup = """ + return Bar{ + "The first member of the struct Bar", + "The second member of the struct Bar", + "The 3rd member of the struct Bar" + }; + """ + config_suffix = """ + [[codegen.ignore]] + type = "ns_ignored::Bar" members = ["a"] - [[codegen.ignore]] - type = "Bar" - members = ["b"] """ - expect_json = '''[{ + expect_json_v2 = '''[{ "staticSize":96, - "dynamicSize":66, + "exclusiveSize":32, "members":[ - {"name":"a", "staticSize":32, "dynamicSize":34}, - {"name":"b", "staticSize":32, "dynamicSize":0}, - {"name":"c", "staticSize":32, "dynamicSize":32} + { "name":"b", "staticSize":32, "exclusiveSize":67 }, + { "name":"c", "staticSize":32, "exclusiveSize":64 } ]}]''' + + expect_json = ''' +[ + { + "staticSize": 96, + "dynamicSize": 67, + "exclusiveSize": 32, + "members": [ + { + "name": "b", + "typePath": "b", + "typeName": "string", + "isTypedef": true, + "staticSize": 32, + "dynamicSize": 35, + "exclusiveSize": 0, + "members": [ + { + "name": "", + "typePath": "", + "typeName": "std::__cxx11::basic_string, std::allocator>", + "isTypedef": false, + "staticSize": 32, + "dynamicSize": 35, + "exclusiveSize": 67, + "length": 35, + "capacity": 35, + "elementStaticSize": 1 + } + ] + }, + { + "name": "c", + "typePath": "c", + "typeName": "string", + "isTypedef": true, + "staticSize": 32, + "dynamicSize": 32, + "exclusiveSize": 0, + "members": [ + { + "name": "", + "typePath": "", + "typeName": "std::__cxx11::basic_string, std::allocator>", + "isTypedef": false, + "staticSize": 32, + "dynamicSize": 32, + "exclusiveSize": 64, + "length": 32, + "capacity": 32, + "elementStaticSize": 1 + } + ] + } + ] + } +] + ''' + +