4 class RustType(object):
8 CSTYLE_VARIANT = "CStyleVariant"
9 TUPLE_VARIANT = "TupleVariant"
10 STRUCT_VARIANT = "StructVariant"
13 SINGLETON_ENUM = "SingletonEnum"
14 REGULAR_ENUM = "RegularEnum"
15 COMPRESSED_ENUM = "CompressedEnum"
16 REGULAR_UNION = "RegularUnion"
18 STD_STRING = "StdString"
19 STD_OS_STRING = "StdOsString"
21 STD_SLICE = "StdSlice"
23 STD_VEC_DEQUE = "StdVecDeque"
24 STD_BTREE_SET = "StdBTreeSet"
25 STD_BTREE_MAP = "StdBTreeMap"
26 STD_HASH_MAP = "StdHashMap"
27 STD_HASH_SET = "StdHashSet"
32 STD_REF_MUT = "StdRefMut"
33 STD_REF_CELL = "StdRefCell"
36 STD_STRING_REGEX = re.compile(r"^(alloc::(\w+::)+)String$")
37 STD_STR_REGEX = re.compile(r"^&(mut )?str$")
38 STD_SLICE_REGEX = re.compile(r"^&(mut )?\[.+\]$")
39 STD_OS_STRING_REGEX = re.compile(r"^(std::ffi::(\w+::)+)OsString$")
40 STD_VEC_REGEX = re.compile(r"^(alloc::(\w+::)+)Vec<.+>$")
41 STD_VEC_DEQUE_REGEX = re.compile(r"^(alloc::(\w+::)+)VecDeque<.+>$")
42 STD_BTREE_SET_REGEX = re.compile(r"^(alloc::(\w+::)+)BTreeSet<.+>$")
43 STD_BTREE_MAP_REGEX = re.compile(r"^(alloc::(\w+::)+)BTreeMap<.+>$")
44 STD_HASH_MAP_REGEX = re.compile(r"^(std::collections::(\w+::)+)HashMap<.+>$")
45 STD_HASH_SET_REGEX = re.compile(r"^(std::collections::(\w+::)+)HashSet<.+>$")
46 STD_RC_REGEX = re.compile(r"^(alloc::(\w+::)+)Rc<.+>$")
47 STD_ARC_REGEX = re.compile(r"^(alloc::(\w+::)+)Arc<.+>$")
48 STD_CELL_REGEX = re.compile(r"^(core::(\w+::)+)Cell<.+>$")
49 STD_REF_REGEX = re.compile(r"^(core::(\w+::)+)Ref<.+>$")
50 STD_REF_MUT_REGEX = re.compile(r"^(core::(\w+::)+)RefMut<.+>$")
51 STD_REF_CELL_REGEX = re.compile(r"^(core::(\w+::)+)RefCell<.+>$")
53 TUPLE_ITEM_REGEX = re.compile(r"__\d+$")
55 ENCODED_ENUM_PREFIX = "RUST$ENCODED$ENUM$"
56 ENUM_DISR_FIELD_NAME = "<<variant>>"
59 RustType.STD_STRING: STD_STRING_REGEX,
60 RustType.STD_OS_STRING: STD_OS_STRING_REGEX,
61 RustType.STD_STR: STD_STR_REGEX,
62 RustType.STD_SLICE: STD_SLICE_REGEX,
63 RustType.STD_VEC: STD_VEC_REGEX,
64 RustType.STD_VEC_DEQUE: STD_VEC_DEQUE_REGEX,
65 RustType.STD_HASH_MAP: STD_HASH_MAP_REGEX,
66 RustType.STD_HASH_SET: STD_HASH_SET_REGEX,
67 RustType.STD_BTREE_SET: STD_BTREE_SET_REGEX,
68 RustType.STD_BTREE_MAP: STD_BTREE_MAP_REGEX,
69 RustType.STD_RC: STD_RC_REGEX,
70 RustType.STD_ARC: STD_ARC_REGEX,
71 RustType.STD_REF: STD_REF_REGEX,
72 RustType.STD_REF_MUT: STD_REF_MUT_REGEX,
73 RustType.STD_REF_CELL: STD_REF_CELL_REGEX,
74 RustType.STD_CELL: STD_CELL_REGEX,
77 def is_tuple_fields(fields):
78 # type: (list) -> bool
79 return all(TUPLE_ITEM_REGEX.match(str(field.name)) for field in fields)
82 def classify_struct(name, fields):
86 for ty, regex in STD_TYPE_TO_REGEX.items():
90 if fields[0].name == ENUM_DISR_FIELD_NAME:
93 if is_tuple_fields(fields):
96 return RustType.STRUCT
99 def classify_union(fields):
101 return RustType.EMPTY
103 first_variant_name = fields[0].name
104 if first_variant_name is None:
106 return RustType.SINGLETON_ENUM
108 return RustType.REGULAR_ENUM
109 elif first_variant_name.startswith(ENCODED_ENUM_PREFIX):
110 assert len(fields) == 1
111 return RustType.COMPRESSED_ENUM
113 return RustType.REGULAR_UNION