from datetime import datetime from ast import * from util import * @linewise def do_ast_names_impl(d): if not isinstance(d, (Struct, Enum)): return yield '#[allow(unused, non_shorthand_field_patterns)]' yield 'impl AstName for %s {' % d.name yield ' fn ast_name(&self) -> String {' yield ' match self {' for v, path in variants_paths(d): yield ' &%s => {' % struct_pattern(v, path) yield ' "%s".to_string()' % v.name if isinstance(d, (Struct)): kind_field = find_kind_field(d) if kind_field: yield ' + ":" + &self.%s.ast_name()' % kind_field yield ' }' yield ' }' yield ' }' yield '}' @linewise def generate(decls): yield '// AUTOMATICALLY GENERATED - DO NOT EDIT' yield '// Produced %s by process_ast.py' % (datetime.now(),) yield '' for d in decls: yield do_ast_names_impl(d)