@@ -29,6 +29,7 @@ pub fn build_v2_ir_model(language: &Language) -> ModelWithBuilder {
2929 simplify_parameters ( & mut mutator) ;
3030 simplify_mapping_type_parameters ( & mut mutator) ;
3131 rename_operator_fields ( & mut mutator) ;
32+ rename_operator_choice_types ( & mut mutator) ;
3233 remove_unused_types ( & mut mutator) ;
3334 remove_unreferenced_terminals ( & mut mutator) ;
3435
@@ -384,6 +385,28 @@ fn rename_operator_fields(mutator: &mut IrModelMutator) {
384385 }
385386}
386387
388+ // Rename auto-generated operator choice types from `Expression_<X>_Operator`
389+ // down to the more idiomatic `<X>Operator`. The long names come from
390+ // `add_precedence_expression`'s multi-operator branch (see ir/model.rs), which
391+ // formats `<base>_<expression>_Operator`.
392+ fn rename_operator_choice_types ( mutator : & mut IrModelMutator ) {
393+ let renames: Vec < ( String , String ) > = mutator
394+ . choices
395+ . keys ( )
396+ . filter_map ( |name| {
397+ let middle = name
398+ . as_str ( )
399+ . strip_prefix ( "Expression_" ) ?
400+ . strip_suffix ( "_Operator" ) ?;
401+ Some ( ( name. as_str ( ) . to_owned ( ) , format ! ( "{middle}Operator" ) ) )
402+ } )
403+ . collect ( ) ;
404+
405+ for ( old_name, new_name) in renames {
406+ mutator. rename_choice_type ( & old_name, & new_name) ;
407+ }
408+ }
409+
387410// Removes terminals that are no longer referenced by any sequence field,
388411// choice variant, or collection item. Useful as a final cleanup after
389412// mutations like `remove_redundant_terminal_nodes` strip otherwise-unique
0 commit comments