Skip to content

Commit 0257b96

Browse files
author
Paolo Tranquilli
committed
Rust: make property_name work on post-processed class names
1 parent 24f5470 commit 0257b96

File tree

1 file changed

+30
-27
lines changed

1 file changed

+30
-27
lines changed

rust/ast-generator/src/main.rs

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ fn class_name(type_name: &str) -> String {
3232
}
3333

3434
fn property_name(type_name: &str, field_name: &str) -> String {
35-
// N.B.: type names here are before any manipulation done by class_name
3635
let name = match (type_name, field_name) {
3736
("CallExpr", "expr") => "function",
3837
("LetExpr", "expr") => "scrutinee",
@@ -42,9 +41,9 @@ fn property_name(type_name: &str, field_name: &str) -> String {
4241
(_, "name_ref") => "identifier",
4342
(_, "then_branch") => "then",
4443
(_, "else_branch") => "else_",
45-
("ArrayType", "ty") => "element_type_repr",
44+
("ArrayTypeRepr", "ty") => "element_type_repr",
4645
("SelfParam", "is_amp") => "is_ref",
47-
("RecordField", "expr") => "default",
46+
("StructField", "expr") => "default",
4847
("UseTree", "is_star") => "is_glob",
4948
(_, "ty") => "type_repr",
5049
_ if field_name.contains("record") => &field_name.replacen("record", "struct", 1),
@@ -108,25 +107,27 @@ fn node_src_to_schema_class(
108107
node: &AstNodeSrc,
109108
super_types: &BTreeMap<String, BTreeSet<String>>,
110109
) -> SchemaClass {
110+
let name = class_name(&node.name);
111+
let fields = get_fields(node)
112+
.iter()
113+
.map(|f| {
114+
let (ty, child) = match &f.ty {
115+
FieldType::String => ("optional[string]".to_string(), false),
116+
FieldType::Predicate => ("predicate".to_string(), false),
117+
FieldType::Optional(ty) => (format!("optional[\"{}\"]", class_name(ty)), true),
118+
FieldType::List(ty) => (format!("list[\"{}\"]", class_name(ty)), true),
119+
};
120+
SchemaField {
121+
name: property_name(&name, &f.name),
122+
ty,
123+
child,
124+
}
125+
})
126+
.collect();
111127
SchemaClass {
112-
name: class_name(&node.name),
128+
name,
129+
fields,
113130
bases: get_bases(&node.name, super_types),
114-
fields: get_fields(node)
115-
.iter()
116-
.map(|f| {
117-
let (ty, child) = match &f.ty {
118-
FieldType::String => ("optional[string]".to_string(), false),
119-
FieldType::Predicate => ("predicate".to_string(), false),
120-
FieldType::Optional(ty) => (format!("optional[\"{}\"]", class_name(ty)), true),
121-
FieldType::List(ty) => (format!("list[\"{}\"]", class_name(ty)), true),
122-
};
123-
SchemaField {
124-
name: property_name(&node.name, &f.name),
125-
ty,
126-
child,
127-
}
128-
})
129-
.collect(),
130131
}
131132
}
132133

@@ -489,8 +490,8 @@ fn enum_to_extractor_info(node: &AstEnumSrc) -> Option<ExtractorEnumInfo> {
489490
})
490491
}
491492

492-
fn field_info_to_extractor_info(node: &AstNodeSrc, field: &FieldInfo) -> ExtractorNodeFieldInfo {
493-
let name = property_name(&node.name, &field.name);
493+
fn field_info_to_extractor_info(name: &str, field: &FieldInfo) -> ExtractorNodeFieldInfo {
494+
let name = property_name(name, &field.name);
494495
match &field.ty {
495496
FieldType::String => ExtractorNodeFieldInfo {
496497
name,
@@ -522,14 +523,16 @@ fn field_info_to_extractor_info(node: &AstNodeSrc, field: &FieldInfo) -> Extract
522523
fn node_to_extractor_info(node: &AstNodeSrc) -> ExtractorNodeInfo {
523524
let fields = get_fields(node);
524525
let has_attrs = fields.iter().any(|f| f.name == "attrs");
526+
let name = class_name(&node.name);
527+
let fields = fields
528+
.iter()
529+
.map(|f| field_info_to_extractor_info(&name, f))
530+
.collect();
525531
ExtractorNodeInfo {
526-
name: class_name(&node.name),
532+
name,
527533
snake_case_name: to_lower_snake_case(&node.name),
528534
ast_name: node.name.clone(),
529-
fields: fields
530-
.iter()
531-
.map(|f| field_info_to_extractor_info(node, f))
532-
.collect(),
535+
fields,
533536
has_attrs,
534537
}
535538
}

0 commit comments

Comments
 (0)