Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 1 | // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| 2 | // Exceptions. See /LICENSE for license information. |
| 3 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 4 | |
Marcel Hlopko | f1123c8 | 2021-08-19 11:38:52 +0000 | [diff] [blame] | 5 | /// Types and deserialization logic for IR. See docs in |
| 6 | // `rs_bindings_from_cc/ir.h` for more information. |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 7 | use anyhow::Result; |
| 8 | use serde::Deserialize; |
| 9 | use std::io::Read; |
| 10 | |
| 11 | pub fn deserialize_ir<R: Read>(reader: R) -> Result<IR> { |
| 12 | Ok(serde_json::from_reader(reader)?) |
| 13 | } |
| 14 | |
| 15 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Marcel Hlopko | f1123c8 | 2021-08-19 11:38:52 +0000 | [diff] [blame] | 16 | pub struct HeaderName { |
| 17 | pub name: String, |
| 18 | } |
| 19 | |
| 20 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 21 | pub struct RsType { |
| 22 | pub name: String, |
| 23 | pub type_params: Vec<RsType>, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 24 | pub decl_id: Option<DeclId>, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 25 | } |
| 26 | |
| 27 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
| 28 | pub struct CcType { |
| 29 | pub name: String, |
| 30 | pub is_const: bool, |
| 31 | pub type_params: Vec<CcType>, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 32 | pub decl_id: Option<DeclId>, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 33 | } |
| 34 | |
| 35 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
| 36 | pub struct MappedType { |
| 37 | pub rs_type: RsType, |
| 38 | pub cc_type: CcType, |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 39 | } |
| 40 | |
| 41 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
| 42 | pub struct Identifier { |
| 43 | pub identifier: String, |
| 44 | } |
| 45 | |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 46 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, Deserialize)] |
| 47 | #[serde(transparent)] |
| 48 | pub struct DeclId(pub usize); |
| 49 | |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 50 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Devin Jeanpierre | f2ec871 | 2021-10-13 20:47:16 +0000 | [diff] [blame] | 51 | pub enum UnqualifiedIdentifier { |
| 52 | Identifier(Identifier), |
| 53 | Constructor, |
| 54 | Destructor, |
| 55 | } |
| 56 | |
| 57 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Devin Jeanpierre | c6877bb | 2021-10-13 20:47:54 +0000 | [diff] [blame] | 58 | pub enum ReferenceQualification { |
| 59 | LValue, |
| 60 | RValue, |
| 61 | Unqualified, |
| 62 | } |
| 63 | |
| 64 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
| 65 | pub struct InstanceMethodMetadata { |
| 66 | pub reference: ReferenceQualification, |
| 67 | pub is_const: bool, |
| 68 | pub is_virtual: bool, |
| 69 | } |
| 70 | |
| 71 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
| 72 | pub struct MemberFuncMetadata { |
| 73 | pub for_type: Identifier, |
| 74 | pub instance_method_metadata: Option<InstanceMethodMetadata>, |
| 75 | } |
| 76 | |
| 77 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 78 | pub struct FuncParam { |
| 79 | #[serde(rename(deserialize = "type"))] |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 80 | pub type_: MappedType, |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 81 | pub identifier: Identifier, |
| 82 | } |
| 83 | |
| 84 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
| 85 | pub struct Func { |
Devin Jeanpierre | f2ec871 | 2021-10-13 20:47:16 +0000 | [diff] [blame] | 86 | pub name: UnqualifiedIdentifier, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 87 | pub decl_id: DeclId, |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 88 | pub mangled_name: String, |
Michael Forster | 409d941 | 2021-10-07 08:35:29 +0000 | [diff] [blame] | 89 | pub doc_comment: Option<String>, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 90 | pub return_type: MappedType, |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 91 | pub params: Vec<FuncParam>, |
Marcel Hlopko | 3164eee | 2021-08-24 20:09:22 +0000 | [diff] [blame] | 92 | pub is_inline: bool, |
Devin Jeanpierre | c6877bb | 2021-10-13 20:47:54 +0000 | [diff] [blame] | 93 | pub member_func_metadata: Option<MemberFuncMetadata>, |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 94 | } |
| 95 | |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 96 | #[derive(Debug, PartialEq, Eq, Hash, Copy, Clone, Deserialize)] |
| 97 | pub enum AccessSpecifier { |
| 98 | Public, |
| 99 | Protected, |
| 100 | Private, |
| 101 | } |
| 102 | |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 103 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 104 | pub struct Field { |
| 105 | pub identifier: Identifier, |
Michael Forster | cc5941a | 2021-10-07 07:12:24 +0000 | [diff] [blame] | 106 | pub doc_comment: Option<String>, |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 107 | #[serde(rename(deserialize = "type"))] |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 108 | pub type_: MappedType, |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 109 | pub access: AccessSpecifier, |
Googler | 5ea8864 | 2021-09-29 08:05:59 +0000 | [diff] [blame] | 110 | pub offset: usize, |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 114 | pub enum SpecialMemberDefinition { |
| 115 | Trivial, |
Devin Jeanpierre | be2f33b | 2021-10-21 12:54:19 +0000 | [diff] [blame] | 116 | NontrivialMembers, |
| 117 | NontrivialSelf, |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 118 | Deleted, |
| 119 | } |
| 120 | |
| 121 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
| 122 | pub struct SpecialMemberFunc { |
| 123 | pub definition: SpecialMemberDefinition, |
| 124 | pub access: AccessSpecifier, |
| 125 | } |
| 126 | |
| 127 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 128 | pub struct Record { |
| 129 | pub identifier: Identifier, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 130 | pub decl_id: DeclId, |
Michael Forster | 028800b | 2021-10-05 12:39:59 +0000 | [diff] [blame] | 131 | pub doc_comment: Option<String>, |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 132 | pub fields: Vec<Field>, |
Googler | ec648ff | 2021-09-23 07:19:53 +0000 | [diff] [blame] | 133 | pub size: usize, |
| 134 | pub alignment: usize, |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 135 | pub copy_constructor: SpecialMemberFunc, |
| 136 | pub move_constructor: SpecialMemberFunc, |
| 137 | pub destructor: SpecialMemberFunc, |
Devin Jeanpierre | b2cd021 | 2021-10-01 07:16:23 +0000 | [diff] [blame] | 138 | pub is_trivial_abi: bool, |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 139 | } |
| 140 | |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 141 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Michael Forster | 6a184ad | 2021-10-12 13:04:05 +0000 | [diff] [blame] | 142 | pub struct SourceLoc { |
| 143 | pub filename: String, |
| 144 | pub line: u64, |
| 145 | pub column: u64, |
| 146 | } |
| 147 | |
| 148 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Michael Forster | 523dbd4 | 2021-10-12 11:05:44 +0000 | [diff] [blame] | 149 | pub struct UnsupportedItem { |
| 150 | pub name: String, |
| 151 | pub message: String, |
Michael Forster | 6a184ad | 2021-10-12 13:04:05 +0000 | [diff] [blame] | 152 | pub source_loc: SourceLoc, |
Michael Forster | 523dbd4 | 2021-10-12 11:05:44 +0000 | [diff] [blame] | 153 | } |
| 154 | |
| 155 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Michael Forster | f1dce42 | 2021-10-13 09:50:16 +0000 | [diff] [blame] | 156 | pub struct Comment { |
| 157 | pub text: String, |
| 158 | } |
| 159 | |
| 160 | #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)] |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 161 | pub enum Item { |
| 162 | Func(Func), |
| 163 | Record(Record), |
Michael Forster | 523dbd4 | 2021-10-12 11:05:44 +0000 | [diff] [blame] | 164 | UnsupportedItem(UnsupportedItem), |
Michael Forster | f1dce42 | 2021-10-13 09:50:16 +0000 | [diff] [blame] | 165 | Comment(Comment), |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 166 | } |
| 167 | |
Devin Jeanpierre | ccfefc8 | 2021-10-27 10:54:00 +0000 | [diff] [blame] | 168 | impl From<Func> for Item { |
| 169 | fn from(func: Func) -> Item { |
| 170 | Item::Func(func) |
| 171 | } |
| 172 | } |
| 173 | |
| 174 | impl From<Record> for Item { |
| 175 | fn from(record: Record) -> Item { |
| 176 | Item::Record(record) |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | impl From<UnsupportedItem> for Item { |
| 181 | fn from(unsupported: UnsupportedItem) -> Item { |
| 182 | Item::UnsupportedItem(unsupported) |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | impl From<Comment> for Item { |
| 187 | fn from(comment: Comment) -> Item { |
| 188 | Item::Comment(comment) |
| 189 | } |
| 190 | } |
| 191 | |
Googler | 25a1a30 | 2021-09-17 08:16:45 +0000 | [diff] [blame] | 192 | #[derive(Debug, Default, PartialEq, Eq, Hash, Clone, Deserialize)] |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 193 | pub struct IR { |
Googler | 25a1a30 | 2021-09-17 08:16:45 +0000 | [diff] [blame] | 194 | #[serde(default)] |
Marcel Hlopko | f1123c8 | 2021-08-19 11:38:52 +0000 | [diff] [blame] | 195 | pub used_headers: Vec<HeaderName>, |
Googler | 25a1a30 | 2021-09-17 08:16:45 +0000 | [diff] [blame] | 196 | #[serde(default)] |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 197 | pub items: Vec<Item>, |
| 198 | } |
| 199 | |
| 200 | impl IR { |
| 201 | pub fn functions(&self) -> impl Iterator<Item = &Func> { |
| 202 | self.items.iter().filter_map(|item| match item { |
| 203 | Item::Func(func) => Some(func), |
| 204 | _ => None, |
| 205 | }) |
| 206 | } |
| 207 | |
| 208 | pub fn records(&self) -> impl Iterator<Item = &Record> { |
| 209 | self.items.iter().filter_map(|item| match item { |
| 210 | Item::Record(func) => Some(func), |
| 211 | _ => None, |
| 212 | }) |
| 213 | } |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 214 | } |
| 215 | |
| 216 | #[cfg(test)] |
| 217 | mod tests { |
| 218 | use super::*; |
| 219 | |
| 220 | #[test] |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 221 | fn test_used_headers() { |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 222 | let input = r#" |
| 223 | { |
Googler | 25a1a30 | 2021-09-17 08:16:45 +0000 | [diff] [blame] | 224 | "used_headers": [{ "name": "foo/bar.h" }] |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 225 | } |
| 226 | "#; |
| 227 | let ir = deserialize_ir(input.as_bytes()).unwrap(); |
| 228 | let expected = IR { |
| 229 | used_headers: vec![HeaderName { name: "foo/bar.h".to_string() }], |
Googler | 25a1a30 | 2021-09-17 08:16:45 +0000 | [diff] [blame] | 230 | ..Default::default() |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 231 | }; |
| 232 | assert_eq!(ir, expected); |
| 233 | } |
| 234 | |
| 235 | #[test] |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 236 | fn test_member_access_specifiers() { |
| 237 | let input = r#" |
| 238 | { |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 239 | "items": [ |
| 240 | { "Record" : { |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 241 | "identifier": {"identifier": "SomeStruct" }, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 242 | "decl_id": 42, |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 243 | "fields": [ |
| 244 | { |
| 245 | "identifier": {"identifier": "public_int" }, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 246 | "type": { |
| 247 | "rs_type": {"name": "i32", "type_params": []}, |
| 248 | "cc_type": {"name": "int", "is_const": false, "type_params": []} |
| 249 | }, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 250 | "access": "Public", |
| 251 | "offset": 0 |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 252 | }, |
| 253 | { |
| 254 | "identifier": {"identifier": "protected_int" }, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 255 | "type": { |
| 256 | "rs_type": {"name": "i32", "type_params": []}, |
| 257 | "cc_type": {"name": "int", "is_const": false, "type_params": []} |
| 258 | }, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 259 | "access": "Protected", |
| 260 | "offset": 32 |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 261 | }, |
| 262 | { |
| 263 | "identifier": {"identifier": "private_int" }, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 264 | "type": { |
| 265 | "rs_type": {"name": "i32", "type_params": []}, |
| 266 | "cc_type": {"name": "int", "is_const": false, "type_params": []} |
| 267 | }, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 268 | "access": "Private", |
| 269 | "offset": 64 |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 270 | } |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 271 | ], |
| 272 | "size": 12, |
Devin Jeanpierre | b2cd021 | 2021-10-01 07:16:23 +0000 | [diff] [blame] | 273 | "alignment": 4, |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 274 | "copy_constructor": { |
Devin Jeanpierre | be2f33b | 2021-10-21 12:54:19 +0000 | [diff] [blame] | 275 | "definition": "NontrivialSelf", |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 276 | "access": "Private" |
| 277 | }, |
| 278 | "move_constructor": { |
| 279 | "definition": "Deleted", |
| 280 | "access": "Protected" |
| 281 | }, |
| 282 | "destructor": { |
| 283 | "definition": "Trivial", |
| 284 | "access": "Public" |
| 285 | }, |
Devin Jeanpierre | b2cd021 | 2021-10-01 07:16:23 +0000 | [diff] [blame] | 286 | "is_trivial_abi": true |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 287 | }} |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 288 | ] |
| 289 | } |
| 290 | "#; |
| 291 | let ir = deserialize_ir(input.as_bytes()).unwrap(); |
| 292 | let expected = IR { |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 293 | items: vec![Item::Record(Record { |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 294 | identifier: Identifier { identifier: "SomeStruct".to_string() }, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 295 | decl_id: DeclId(42), |
Michael Forster | 028800b | 2021-10-05 12:39:59 +0000 | [diff] [blame] | 296 | doc_comment: None, |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 297 | fields: vec![ |
| 298 | Field { |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 299 | identifier: Identifier { identifier: "public_int".to_string() }, |
Michael Forster | cc5941a | 2021-10-07 07:12:24 +0000 | [diff] [blame] | 300 | doc_comment: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 301 | type_: MappedType { |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 302 | rs_type: RsType { |
| 303 | name: "i32".to_string(), |
| 304 | type_params: vec![], |
| 305 | decl_id: None, |
| 306 | }, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 307 | cc_type: CcType { |
| 308 | name: "int".to_string(), |
| 309 | is_const: false, |
| 310 | type_params: vec![], |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 311 | decl_id: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 312 | }, |
Devin Jeanpierre | 7a7328e | 2021-09-17 07:10:08 +0000 | [diff] [blame] | 313 | }, |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 314 | access: AccessSpecifier::Public, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 315 | offset: 0, |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 316 | }, |
| 317 | Field { |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 318 | identifier: Identifier { identifier: "protected_int".to_string() }, |
Michael Forster | cc5941a | 2021-10-07 07:12:24 +0000 | [diff] [blame] | 319 | doc_comment: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 320 | type_: MappedType { |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 321 | rs_type: RsType { |
| 322 | name: "i32".to_string(), |
| 323 | type_params: vec![], |
| 324 | decl_id: None, |
| 325 | }, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 326 | cc_type: CcType { |
| 327 | name: "int".to_string(), |
| 328 | is_const: false, |
| 329 | type_params: vec![], |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 330 | decl_id: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 331 | }, |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 332 | }, |
| 333 | access: AccessSpecifier::Protected, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 334 | offset: 32, |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 335 | }, |
| 336 | Field { |
| 337 | identifier: Identifier { identifier: "private_int".to_string() }, |
Michael Forster | cc5941a | 2021-10-07 07:12:24 +0000 | [diff] [blame] | 338 | doc_comment: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 339 | type_: MappedType { |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 340 | rs_type: RsType { |
| 341 | name: "i32".to_string(), |
| 342 | type_params: vec![], |
| 343 | decl_id: None, |
| 344 | }, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 345 | cc_type: CcType { |
| 346 | name: "int".to_string(), |
| 347 | is_const: false, |
| 348 | type_params: vec![], |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 349 | decl_id: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 350 | }, |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 351 | }, |
| 352 | access: AccessSpecifier::Private, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 353 | offset: 64, |
Googler | 2294c70 | 2021-09-17 07:32:07 +0000 | [diff] [blame] | 354 | }, |
Marcel Hlopko | b4b2874 | 2021-09-15 12:45:20 +0000 | [diff] [blame] | 355 | ], |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 356 | size: 12, |
| 357 | alignment: 4, |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 358 | copy_constructor: SpecialMemberFunc { |
Devin Jeanpierre | be2f33b | 2021-10-21 12:54:19 +0000 | [diff] [blame] | 359 | definition: SpecialMemberDefinition::NontrivialSelf, |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 360 | access: AccessSpecifier::Private, |
| 361 | }, |
| 362 | move_constructor: SpecialMemberFunc { |
| 363 | definition: SpecialMemberDefinition::Deleted, |
| 364 | access: AccessSpecifier::Protected, |
| 365 | }, |
| 366 | destructor: SpecialMemberFunc { |
| 367 | definition: SpecialMemberDefinition::Trivial, |
| 368 | access: AccessSpecifier::Public, |
| 369 | }, |
Devin Jeanpierre | b2cd021 | 2021-10-01 07:16:23 +0000 | [diff] [blame] | 370 | is_trivial_abi: true, |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 371 | })], |
Googler | 25a1a30 | 2021-09-17 08:16:45 +0000 | [diff] [blame] | 372 | ..Default::default() |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 373 | }; |
| 374 | assert_eq!(ir, expected); |
| 375 | } |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 376 | |
| 377 | #[test] |
| 378 | fn test_pointer_member_variable() { |
| 379 | let input = r#" |
| 380 | { |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 381 | "items": [ |
| 382 | { "Record": { |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 383 | "identifier": {"identifier": "SomeStruct" }, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 384 | "decl_id": 42, |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 385 | "fields": [ |
| 386 | { |
| 387 | "identifier": {"identifier": "ptr" }, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 388 | "type": { |
| 389 | "rs_type": {"name": "*mut", "type_params": [ |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 390 | {"name": "SomeStruct", "type_params": [], "decl_id": 42} |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 391 | ]}, |
| 392 | "cc_type": { "name": "*", "is_const": false, "type_params": [ |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 393 | { |
| 394 | "name": "SomeStruct", |
| 395 | "is_const": false, |
| 396 | "type_params": [], |
| 397 | "decl_id": 42 |
| 398 | } |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 399 | ]} |
| 400 | }, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 401 | "access": "Public", |
| 402 | "offset": 0 |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 403 | } |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 404 | ], |
| 405 | "size": 8, |
Devin Jeanpierre | b2cd021 | 2021-10-01 07:16:23 +0000 | [diff] [blame] | 406 | "alignment": 8, |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 407 | "copy_constructor": { |
| 408 | "definition": "Trivial", |
| 409 | "access": "Public" |
| 410 | }, |
| 411 | "move_constructor": { |
| 412 | "definition": "Trivial", |
| 413 | "access": "Public" |
| 414 | }, |
| 415 | "destructor": { |
| 416 | "definition": "Trivial", |
| 417 | "access": "Public" |
| 418 | }, |
Devin Jeanpierre | b2cd021 | 2021-10-01 07:16:23 +0000 | [diff] [blame] | 419 | "is_trivial_abi": true |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 420 | }} |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 421 | ] |
| 422 | } |
| 423 | "#; |
| 424 | let ir = deserialize_ir(input.as_bytes()).unwrap(); |
| 425 | let expected = IR { |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 426 | items: vec![Item::Record(Record { |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 427 | identifier: Identifier { identifier: "SomeStruct".to_string() }, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 428 | decl_id: DeclId(42), |
Michael Forster | 028800b | 2021-10-05 12:39:59 +0000 | [diff] [blame] | 429 | doc_comment: None, |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 430 | fields: vec![Field { |
| 431 | identifier: Identifier { identifier: "ptr".to_string() }, |
Michael Forster | cc5941a | 2021-10-07 07:12:24 +0000 | [diff] [blame] | 432 | doc_comment: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 433 | type_: MappedType { |
| 434 | rs_type: RsType { |
| 435 | name: "*mut".to_string(), |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 436 | decl_id: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 437 | type_params: vec![RsType { |
| 438 | name: "SomeStruct".to_string(), |
| 439 | type_params: vec![], |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 440 | decl_id: Some(DeclId(42)), |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 441 | }], |
| 442 | }, |
| 443 | cc_type: CcType { |
| 444 | name: "*".to_string(), |
| 445 | is_const: false, |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 446 | decl_id: None, |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 447 | type_params: vec![CcType { |
| 448 | name: "SomeStruct".to_string(), |
| 449 | is_const: false, |
| 450 | type_params: vec![], |
Marcel Hlopko | 9c150da | 2021-11-12 10:30:03 +0000 | [diff] [blame^] | 451 | decl_id: Some(DeclId(42)), |
Devin Jeanpierre | 09c6f45 | 2021-09-29 07:34:24 +0000 | [diff] [blame] | 452 | }], |
| 453 | }, |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 454 | }, |
| 455 | access: AccessSpecifier::Public, |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 456 | offset: 0, |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 457 | }], |
Googler | e6e5f30 | 2021-09-17 13:56:40 +0000 | [diff] [blame] | 458 | size: 8, |
| 459 | alignment: 8, |
Devin Jeanpierre | 8fc6b43 | 2021-10-05 11:41:53 +0000 | [diff] [blame] | 460 | move_constructor: SpecialMemberFunc { |
| 461 | definition: SpecialMemberDefinition::Trivial, |
| 462 | access: AccessSpecifier::Public, |
| 463 | }, |
| 464 | copy_constructor: SpecialMemberFunc { |
| 465 | definition: SpecialMemberDefinition::Trivial, |
| 466 | access: AccessSpecifier::Public, |
| 467 | }, |
| 468 | destructor: SpecialMemberFunc { |
| 469 | definition: SpecialMemberDefinition::Trivial, |
| 470 | access: AccessSpecifier::Public, |
| 471 | }, |
Devin Jeanpierre | b2cd021 | 2021-10-01 07:16:23 +0000 | [diff] [blame] | 472 | is_trivial_abi: true, |
Michael Forster | 7ef8073 | 2021-10-01 18:12:19 +0000 | [diff] [blame] | 473 | })], |
Googler | 25a1a30 | 2021-09-17 08:16:45 +0000 | [diff] [blame] | 474 | ..Default::default() |
Googler | a921463 | 2021-09-17 08:16:29 +0000 | [diff] [blame] | 475 | }; |
| 476 | assert_eq!(ir, expected); |
| 477 | } |
Marcel Hlopko | 42abfc8 | 2021-08-09 07:03:17 +0000 | [diff] [blame] | 478 | } |