Serialize and deserialize access specifiers.
PiperOrigin-RevId: 397258078
diff --git a/rs_bindings_from_cc/ir.cc b/rs_bindings_from_cc/ir.cc
index 469a2c5..44f0e76 100644
--- a/rs_bindings_from_cc/ir.cc
+++ b/rs_bindings_from_cc/ir.cc
@@ -60,10 +60,22 @@
return result;
}
+static std::string AccessToString(AccessSpecifier access) {
+ switch (access) {
+ case kPublic:
+ return "Public";
+ case kProtected:
+ return "Protected";
+ case kPrivate:
+ return "Private";
+ }
+}
+
nlohmann::json Field::ToJson() const {
nlohmann::json result;
result["type"] = type.ToJson();
result["identifier"] = identifier.ToJson();
+ result["access"] = AccessToString(access);
return result;
}
diff --git a/rs_bindings_from_cc/ir.rs b/rs_bindings_from_cc/ir.rs
index da12c4c..4cff1a7 100644
--- a/rs_bindings_from_cc/ir.rs
+++ b/rs_bindings_from_cc/ir.rs
@@ -45,11 +45,19 @@
pub is_inline: bool,
}
+#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone, Deserialize)]
+pub enum AccessSpecifier {
+ Public,
+ Protected,
+ Private,
+}
+
#[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)]
pub struct Field {
pub identifier: Identifier,
#[serde(rename(deserialize = "type"))]
pub type_: IRType,
+ pub access: AccessSpecifier,
}
#[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)]
@@ -90,17 +98,29 @@
],
"records": [
{
- "identifier": {"identifier": "Cons" },
+ "identifier": {"identifier": "SomeStruct" },
"fields": [
{
- "identifier": {"identifier": "car" },
- "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] }
+ "identifier": {"identifier": "public_int" },
+ "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+ "access": "Public"
},
{
- "identifier": {"identifier": "cdr" },
+ "identifier": {"identifier": "protected_int" },
+ "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+ "access": "Protected"
+ },
+ {
+ "identifier": {"identifier": "private_int" },
+ "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+ "access": "Private"
+ },
+ {
+ "identifier": {"identifier": "ptr" },
"type": {"rs_name": "*mut", "cc_name": "*", "type_params": [
- {"rs_name": "Cons", "cc_name": "Cons", "type_params": []}
- ] }
+ {"rs_name": "SomeStruct", "cc_name": "SomeStruct", "type_params": []}
+ ] },
+ "access": "Public"
}
]
}
@@ -129,27 +149,47 @@
is_inline: false,
}],
records: vec![Record {
- identifier: Identifier { identifier: "Cons".to_string() },
+ identifier: Identifier { identifier: "SomeStruct".to_string() },
fields: vec![
Field {
- identifier: Identifier { identifier: "car".to_string() },
+ identifier: Identifier { identifier: "public_int".to_string() },
type_: IRType {
rs_name: "i32".to_string(),
cc_name: "int".to_string(),
type_params: vec![],
},
+ access: AccessSpecifier::Public,
},
Field {
- identifier: Identifier { identifier: "cdr".to_string() },
+ identifier: Identifier { identifier: "protected_int".to_string() },
+ type_: IRType {
+ rs_name: "i32".to_string(),
+ cc_name: "int".to_string(),
+ type_params: vec![],
+ },
+ access: AccessSpecifier::Protected,
+ },
+ Field {
+ identifier: Identifier { identifier: "private_int".to_string() },
+ type_: IRType {
+ rs_name: "i32".to_string(),
+ cc_name: "int".to_string(),
+ type_params: vec![],
+ },
+ access: AccessSpecifier::Private,
+ },
+ Field {
+ identifier: Identifier { identifier: "ptr".to_string() },
type_: IRType {
rs_name: "*mut".to_string(),
cc_name: "*".to_string(),
type_params: vec![IRType {
- rs_name: "Cons".to_string(),
- cc_name: "Cons".to_string(),
+ rs_name: "SomeStruct".to_string(),
+ cc_name: "SomeStruct".to_string(),
type_params: vec![],
}],
},
+ access: AccessSpecifier::Public,
},
],
}],
diff --git a/rs_bindings_from_cc/ir_test.cc b/rs_bindings_from_cc/ir_test.cc
index 175daf6..c54789d 100644
--- a/rs_bindings_from_cc/ir_test.cc
+++ b/rs_bindings_from_cc/ir_test.cc
@@ -48,12 +48,19 @@
"identifier": {"identifier": "SomeStruct" },
"fields": [
{
- "identifier": {"identifier": "first_field" },
- "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] }
+ "identifier": {"identifier": "public_int" },
+ "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+ "access": "Public"
},
{
- "identifier": {"identifier": "second_field" },
- "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] }
+ "identifier": {"identifier": "protected_int" },
+ "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+ "access": "Protected"
+ },
+ {
+ "identifier": {"identifier": "private_int" },
+ "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+ "access": "Private"
}
]
}
@@ -69,10 +76,15 @@
.is_inline = false}},
.records = {Record(Identifier("SomeStruct"),
{
- Field{.identifier = Identifier("first_field"),
- .type = Type{"i32", "int"}},
- Field{.identifier = Identifier("second_field"),
- .type = Type{"i32", "int"}},
+ Field{.identifier = Identifier("public_int"),
+ .type = Type{"i32", "int"},
+ .access = kPublic},
+ Field{.identifier = Identifier("protected_int"),
+ .type = Type{"i32", "int"},
+ .access = kProtected},
+ Field{.identifier = Identifier("private_int"),
+ .type = Type{"i32", "int"},
+ .access = kPrivate},
})}};
EXPECT_EQ(ir.ToJson(), expected);
}
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 2b95612..bd089fc 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -392,6 +392,7 @@
cc_name: "int".to_string(),
type_params: vec![],
},
+ access: AccessSpecifier::Public,
},
Field {
identifier: Identifier { identifier: "second_field".to_string() },
@@ -400,6 +401,7 @@
cc_name: "int".to_string(),
type_params: vec![],
},
+ access: AccessSpecifier::Public,
},
],
}],