Structify IR!
:D :D :D
PiperOrigin-RevId: 397043525
diff --git a/rs_bindings_from_cc/ast_visitor.cc b/rs_bindings_from_cc/ast_visitor.cc
index f68d59b..f0af1d9 100644
--- a/rs_bindings_from_cc/ast_visitor.cc
+++ b/rs_bindings_from_cc/ast_visitor.cc
@@ -32,7 +32,7 @@
mangler_.reset(translation_unit_decl->getASTContext().createMangleContext());
for (const absl::string_view header_name : public_header_names_) {
- ir_.UsedHeaders().emplace_back(HeaderName(std::string(header_name)));
+ ir_.used_headers.emplace_back(HeaderName(std::string(header_name)));
}
return Base::TraverseTranslationUnitDecl(translation_unit_decl);
@@ -44,7 +44,7 @@
params.push_back({ConvertType(param->getType()), GetTranslatedName(param)});
}
- ir_.Functions().push_back(Func{
+ ir_.functions.push_back(Func{
.identifier = GetTranslatedName(function_decl),
.mangled_name = GetMangledName(function_decl),
.return_type = ConvertType(function_decl->getReturnType()),
@@ -60,7 +60,7 @@
fields.push_back({.identifier = GetTranslatedName(field_decl),
.type = ConvertType(field_decl->getType())});
}
- ir_.Records().emplace_back(GetTranslatedName(record_decl), std::move(fields));
+ ir_.records.emplace_back(GetTranslatedName(record_decl), std::move(fields));
return true;
}
diff --git a/rs_bindings_from_cc/ast_visitor_test.cc b/rs_bindings_from_cc/ast_visitor_test.cc
index a49ae28..97fb299 100644
--- a/rs_bindings_from_cc/ast_visitor_test.cc
+++ b/rs_bindings_from_cc/ast_visitor_test.cc
@@ -60,20 +60,20 @@
TEST(AstVisitorTest, Noop) {
IR ir = ImportCode({"// nothing interesting there."}, {});
- EXPECT_THAT(ir.Functions(), IsEmpty());
- ASSERT_THAT(ir.UsedHeaders(), SizeIs(1));
- EXPECT_EQ(ir.UsedHeaders()[0].IncludePath(), "test/testing_header_0.h");
+ EXPECT_THAT(ir.functions, IsEmpty());
+ ASSERT_THAT(ir.used_headers, SizeIs(1));
+ EXPECT_EQ(ir.used_headers[0].IncludePath(), "test/testing_header_0.h");
}
TEST(AstVisitorTest, IREmptyOnInvalidInput) {
IR ir = ImportCode({"int foo(); But this is not C++"}, {});
- EXPECT_THAT(ir.Functions(), IsEmpty());
+ EXPECT_THAT(ir.functions, IsEmpty());
}
TEST(AstVisitorTest, FuncWithVoidReturnType) {
IR ir = ImportCode({"void Foo();"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(1));
- Func func = ir.Functions()[0];
+ ASSERT_THAT(ir.functions, SizeIs(1));
+ Func func = ir.functions[0];
EXPECT_EQ(func.identifier.Ident(), "Foo");
EXPECT_EQ(func.mangled_name, "_Z3Foov");
EXPECT_TRUE(func.return_type.IsVoid());
@@ -82,15 +82,15 @@
TEST(AstVisitorTest, TwoFuncs) {
IR ir = ImportCode({"void Foo(); void Bar();"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(2));
+ ASSERT_THAT(ir.functions, SizeIs(2));
- Func foo = ir.Functions()[0];
+ Func foo = ir.functions[0];
EXPECT_EQ(foo.identifier.Ident(), "Foo");
EXPECT_EQ(foo.mangled_name, "_Z3Foov");
EXPECT_TRUE(foo.return_type.IsVoid());
EXPECT_THAT(foo.params, IsEmpty());
- Func bar = ir.Functions()[1];
+ Func bar = ir.functions[1];
EXPECT_EQ(bar.identifier.Ident(), "Bar");
EXPECT_EQ(bar.mangled_name, "_Z3Barv");
EXPECT_TRUE(bar.return_type.IsVoid());
@@ -99,41 +99,41 @@
TEST(AstVisitorTest, TwoFuncsFromTwoHeaders) {
IR ir = ImportCode({"void Foo();", "void Bar();"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(2));
- Func foo = ir.Functions()[0];
+ ASSERT_THAT(ir.functions, SizeIs(2));
+ Func foo = ir.functions[0];
EXPECT_EQ(foo.identifier.Ident(), "Foo");
- Func bar = ir.Functions()[1];
+ Func bar = ir.functions[1];
EXPECT_EQ(bar.identifier.Ident(), "Bar");
}
TEST(AstVisitorTest, NonInlineFunc) {
IR ir = ImportCode({"void Foo() {}"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(1));
- Func func = ir.Functions()[0];
+ ASSERT_THAT(ir.functions, SizeIs(1));
+ Func func = ir.functions[0];
EXPECT_EQ(func.identifier.Ident(), "Foo");
EXPECT_FALSE(func.is_inline);
}
TEST(AstVisitorTest, InlineFunc) {
IR ir = ImportCode({"inline void Foo() {}"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(1));
- Func func = ir.Functions()[0];
+ ASSERT_THAT(ir.functions, SizeIs(1));
+ Func func = ir.functions[0];
EXPECT_EQ(func.identifier.Ident(), "Foo");
EXPECT_TRUE(func.is_inline);
}
TEST(AstVisitorTest, FuncJustOnce) {
IR ir = ImportCode({"void Foo(); void Foo();"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(1));
- Func func = ir.Functions()[0];
+ ASSERT_THAT(ir.functions, SizeIs(1));
+ Func func = ir.functions[0];
EXPECT_EQ(func.identifier.Ident(), "Foo");
}
TEST(AstVisitorTest, FuncParams) {
IR ir = ImportCode({"int Add(int a, int b);"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(1));
+ ASSERT_THAT(ir.functions, SizeIs(1));
- Func func = ir.Functions()[0];
+ Func func = ir.functions[0];
EXPECT_EQ(func.identifier.Ident(), "Add");
EXPECT_EQ(func.mangled_name, "_Z3Addii");
EXPECT_EQ(func.return_type.rs_name, "i32");
@@ -150,9 +150,9 @@
TEST(AstVisitorTest, TestImportPointerFunc) {
IR ir = ImportCode({"int* Foo(int* a);"}, {});
- ASSERT_THAT(ir.Functions(), SizeIs(1));
+ ASSERT_THAT(ir.functions, SizeIs(1));
- Func func = ir.Functions()[0];
+ Func func = ir.functions[0];
ASSERT_THAT(func.params, SizeIs(1));
Type return_type = func.return_type;
@@ -172,10 +172,10 @@
TEST(AstVisitorTest, Struct) {
IR ir = ImportCode(
{"struct SomeStruct { int first_field; int second_field; };"}, {});
- EXPECT_THAT(ir.Functions(), SizeIs(0));
+ EXPECT_THAT(ir.functions, SizeIs(0));
- ASSERT_THAT(ir.Records(), SizeIs(1));
- Record some_struct = ir.Records()[0];
+ EXPECT_THAT(ir.records, SizeIs(1));
+ Record some_struct = ir.records[0];
EXPECT_EQ(some_struct.Ident().Ident(), "SomeStruct");
diff --git a/rs_bindings_from_cc/ir.cc b/rs_bindings_from_cc/ir.cc
index e5be83b..a1d5942 100644
--- a/rs_bindings_from_cc/ir.cc
+++ b/rs_bindings_from_cc/ir.cc
@@ -81,28 +81,28 @@
}
nlohmann::json IR::ToJson() const {
- std::vector<nlohmann::json> used_headers;
- used_headers.reserve(used_headers_.size());
- for (const HeaderName& header : used_headers_) {
- used_headers.push_back(header.ToJson());
+ std::vector<nlohmann::json> json_used_headers;
+ json_used_headers.reserve(used_headers.size());
+ for (const HeaderName& header : used_headers) {
+ json_used_headers.push_back(header.ToJson());
}
- std::vector<nlohmann::json> functions;
- functions.reserve(functions_.size());
- for (const Func& func : functions_) {
- functions.push_back(func.ToJson());
+ std::vector<nlohmann::json> json_functions;
+ json_functions.reserve(functions.size());
+ for (const Func& func : functions) {
+ json_functions.push_back(func.ToJson());
}
- std::vector<nlohmann::json> records;
- records.reserve(records_.size());
- for (const Record& record : records_) {
- records.push_back(record.ToJson());
+ std::vector<nlohmann::json> json_records;
+ json_records.reserve(records.size());
+ for (const Record& record : records) {
+ json_records.push_back(record.ToJson());
}
nlohmann::json result;
- result["used_headers"] = std::move(used_headers);
- result["functions"] = std::move(functions);
- result["records"] = std::move(records);
+ result["used_headers"] = std::move(json_used_headers);
+ result["functions"] = std::move(json_functions);
+ result["records"] = std::move(json_records);
return result;
}
diff --git a/rs_bindings_from_cc/ir.h b/rs_bindings_from_cc/ir.h
index c2189ff..1606e1b 100644
--- a/rs_bindings_from_cc/ir.h
+++ b/rs_bindings_from_cc/ir.h
@@ -143,32 +143,14 @@
// A complete intermediate representation of bindings for publicly accessible
// declarations of a single C++ library.
-class IR {
- public:
- IR() {}
- IR(std::vector<HeaderName> used_headers, std::vector<Func> functions,
- std::vector<Record> records)
- : used_headers_(std::move(used_headers)),
- functions_(std::move(functions)),
- records_(std::move(records)) {}
-
+struct IR {
nlohmann::json ToJson() const;
- const std::vector<HeaderName>& UsedHeaders() const { return used_headers_; }
- std::vector<HeaderName>& UsedHeaders() { return used_headers_; }
-
- const std::vector<Func>& Functions() const { return functions_; }
- std::vector<Func>& Functions() { return functions_; }
-
- const std::vector<Record>& Records() const { return records_; }
- std::vector<Record>& Records() { return records_; }
-
- private:
// Collection of public headers that were used to construct the AST this `IR`
// is generated from.
- std::vector<HeaderName> used_headers_;
- std::vector<Func> functions_;
- std::vector<Record> records_;
+ std::vector<HeaderName> used_headers;
+ std::vector<Func> functions;
+ std::vector<Record> records;
};
} // namespace rs_bindings_from_cc
diff --git a/rs_bindings_from_cc/ir_test.cc b/rs_bindings_from_cc/ir_test.cc
index 7682e61..bbaf6e3 100644
--- a/rs_bindings_from_cc/ir_test.cc
+++ b/rs_bindings_from_cc/ir_test.cc
@@ -59,24 +59,23 @@
}
]
})j");
- EXPECT_EQ(
- IR({HeaderName(std::string("foo/bar.h"))},
- {Func{
- .identifier = Identifier(std::string("hello_world")),
- .mangled_name = std::string("#$mangled_name$#"),
- .return_type = Type{std::string("i32"), std::string("int")},
- .params = {FuncParam{Type{std::string("i32"), std::string("int")},
- Identifier(std::string("arg"))}},
- .is_inline = false}},
- {Record(Identifier(std::string("SomeStruct")),
- {
- Field{.identifier = Identifier("first_field"),
- .type = Type{"i32", "int"}},
- Field{.identifier = Identifier("second_field"),
- .type = Type{"i32", "int"}},
- })})
- .ToJson(),
- expected);
+ IR ir = {
+ .used_headers = {HeaderName(std::string("foo/bar.h"))},
+ .functions = {Func{
+ .identifier = Identifier(std::string("hello_world")),
+ .mangled_name = std::string("#$mangled_name$#"),
+ .return_type = Type{std::string("i32"), std::string("int")},
+ .params = {FuncParam{Type{std::string("i32"), std::string("int")},
+ Identifier(std::string("arg"))}},
+ .is_inline = false}},
+ .records = {Record(Identifier(std::string("SomeStruct")),
+ {
+ Field{.identifier = Identifier("first_field"),
+ .type = Type{"i32", "int"}},
+ Field{.identifier = Identifier("second_field"),
+ .type = Type{"i32", "int"}},
+ })}};
+ EXPECT_EQ(ir.ToJson(), expected);
}
} // namespace
diff --git a/rs_bindings_from_cc/src_code_gen_test.cc b/rs_bindings_from_cc/src_code_gen_test.cc
index ad30c77..2985e95 100644
--- a/rs_bindings_from_cc/src_code_gen_test.cc
+++ b/rs_bindings_from_cc/src_code_gen_test.cc
@@ -17,14 +17,16 @@
using ::testing::StrEq;
TEST(SrcGenTest, FFIIntegration) {
- IR ir({HeaderName(std::string("foo/bar.h"))},
- {Func{.identifier = Identifier(std::string("hello_world")),
- .mangled_name = std::string("$$mangled_name$$"),
- .return_type = Type{std::string("i32"), std::string("int")},
- .params = {FuncParam{Type{std::string("i32"), std::string("int")},
- Identifier(std::string("arg"))}},
- .is_inline = true}},
- /* records= */ {});
+ IR ir = {
+ .used_headers = {HeaderName(std::string("foo/bar.h"))},
+ .functions = {Func{
+ .identifier = Identifier(std::string("hello_world")),
+ .mangled_name = std::string("$$mangled_name$$"),
+ .return_type = Type{std::string("i32"), std::string("int")},
+ .params = {FuncParam{Type{std::string("i32"), std::string("int")},
+ Identifier(std::string("arg"))}},
+ .is_inline = true}},
+ .records = {}};
Bindings bindings = GenerateBindings(ir);
EXPECT_THAT(
bindings.rs_api,