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,