1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
use convert_case::Case;
use crate::mir::{Device, Enum, FieldConversion};
use super::recurse_objects_mut;
/// Changes all names of all objects, enums and enum variants to either Pascal case or snake case
///
/// - PascalCase: Object names, enum names, enum variant names
/// - snake_case: Field names
pub fn run_pass(device: &mut Device) -> anyhow::Result<()> {
let boundaries = device.global_config.name_word_boundaries.clone();
let pascal_converter = convert_case::Converter::new()
.set_boundaries(&boundaries)
.to_case(Case::Pascal);
let snake_converter = convert_case::Converter::new()
.set_boundaries(&boundaries)
.to_case(Case::Snake);
recurse_objects_mut(&mut device.objects, &mut |object| {
*object.name_mut() = pascal_converter.convert(object.name_mut());
for field in object.field_sets_mut().flatten() {
field.name = snake_converter.convert(&field.name);
if let Some(FieldConversion::Enum {
enum_value: Enum { name, variants, .. },
..
}) = field.field_conversion.as_mut()
{
*name = pascal_converter.convert(&*name);
for v in variants.iter_mut() {
v.name = pascal_converter.convert(&v.name)
}
}
}
if let Some(ref_object) = object.as_ref_object_mut() {
*ref_object.object_override.name_mut() =
pascal_converter.convert(ref_object.object_override.name_mut());
}
Ok(())
})
}
#[cfg(test)]
mod tests {
use convert_case::Boundary;
use crate::mir::{Buffer, EnumVariant, Field, GlobalConfig, Object, Register};
use super::*;
#[test]
fn names_normalized() {
let global_config = GlobalConfig {
name_word_boundaries: Boundary::list_from("-"),
..Default::default()
};
let mut start_mir = Device {
name: None,
global_config: global_config.clone(),
objects: vec![
Object::Register(Register {
name: "my-reGister".into(),
fields: vec![
Field {
name: "my-fielD".into(),
..Default::default()
},
Field {
name: "my-fielD2".into(),
field_conversion: Some(FieldConversion::Enum {
enum_value: Enum {
name: "mY-enum".into(),
variants: vec![EnumVariant {
name: "eNum-Variant".into(),
..Default::default()
}],
..Default::default()
},
use_try: false,
}),
..Default::default()
},
],
..Default::default()
}),
Object::Buffer(Buffer {
name: "my-buffer".into(),
..Default::default()
}),
],
};
let end_mir = Device {
name: None,
global_config,
objects: vec![
Object::Register(Register {
name: "MyRegister".into(),
fields: vec![
Field {
name: "my_field".into(),
..Default::default()
},
Field {
name: "my_field2".into(),
field_conversion: Some(FieldConversion::Enum {
enum_value: Enum {
name: "MyEnum".into(),
variants: vec![EnumVariant {
name: "EnumVariant".into(),
..Default::default()
}],
..Default::default()
},
use_try: false,
}),
..Default::default()
},
],
..Default::default()
}),
Object::Buffer(Buffer {
name: "MyBuffer".into(),
..Default::default()
}),
],
};
run_pass(&mut start_mir).unwrap();
assert_eq!(start_mir, end_mir);
}
}