Mercurial > python-compiler.rs
changeset 54:ad2453a55820
Refactor all Vec<T> -> Vec<String> functions into a single one.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 12 Jun 2016 02:17:23 +0100 |
parents | 1a815946c2e5 |
children | 32c78b275d5a |
files | src/ast_dump.rs |
diffstat | 1 files changed, 21 insertions(+), 40 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ast_dump.rs +++ b/src/ast_dump.rs @@ -2,6 +2,10 @@ use python_ast::{Module, stmt, expr, boo use std::iter; +trait to_string_able { + fn to_string(&self) -> String; +} + impl boolop { fn to_string(&self) -> &'static str { match *self { @@ -59,23 +63,15 @@ impl cmpop { } } -fn args_to_strings(args: Vec<expr>) -> Vec<String> { - let mut arguments = vec!(); - for arg in args { - arguments.push(arg.to_string()); +fn vec_to_strings_vec<T: to_string_able>(values: Vec<T>) -> Vec<String> { + let mut vector = vec!(); + for value in values { + vector.push(value.to_string()); } - arguments + vector } -fn args_to_string(args: Vec<expr>) -> String { - let mut arguments = vec!(); - for arg in args { - arguments.push(arg.to_string()); - } - arguments.join(", ") -} - -impl keyword { +impl to_string_able for keyword { fn to_string(&self) -> String { match self.arg.clone() { Some(arg) => format!("{}={}", arg, self.value.to_string()), @@ -84,22 +80,6 @@ impl keyword { } } -fn kwargs_to_strings(kwargs: Vec<keyword>) -> Vec<String> { - let mut arguments = vec!(); - for kwarg in kwargs { - arguments.push(kwarg.to_string()); - } - arguments -} - -fn arguments_to_string(args: arguments) -> String { - let mut arguments = vec!(); - for arg in args.args { - arguments.push(arg.arg); - } - arguments.join(", ") -} - fn statements_to_string(indent: usize, body: Vec<stmt>) -> String { let mut statements = vec!(); for statement in body { @@ -127,7 +107,8 @@ fn generators_to_string(generators: Vec< } result.join(" ") } -impl expr { + +impl to_string_able for expr { fn to_string(&self) -> String { match self.clone() { expr::BoolOp(op, values) => { @@ -162,8 +143,8 @@ impl expr { }), expr::Call(func, args, keywords) => format!("{}({})", func.to_string(), { let mut arguments = vec!(); - let args = args_to_strings(args); - let keywords = kwargs_to_strings(keywords); + let args = vec_to_strings_vec(args); + let keywords = vec_to_strings_vec(keywords); arguments.extend(args); arguments.extend(keywords); arguments.join(", ") @@ -173,16 +154,16 @@ impl expr { expr::NameConstant(name) => format!("{}", name), expr::Attribute(value, attr, ctx) => format!("{}.{}", value.to_string(), attr), expr::Name(name, ctx) => format!("{}", name), - expr::List(elts, ctx) => format!("[{}]", args_to_string(elts)), + expr::List(elts, ctx) => format!("[{}]", vec_to_strings_vec(elts).join(", ")), expr::ListComp(elt, generators) => format!("[{} {}]", elt.to_string(), generators_to_string(generators)), expr::DictComp(key, value, generators) => format!("{{{}: {} {}}}", key.to_string(), value.to_string(), generators_to_string(generators)), - expr::Tuple(elts, ctx) => format!("({})", args_to_string(elts)), + expr::Tuple(elts, ctx) => format!("({})", vec_to_strings_vec(elts).join(", ")), expr::Ellipsis => format!("..."), } } } -impl arguments { +impl to_string_able for arguments { fn to_string(&self) -> String { let mut args = vec!(); for arg in self.args.clone() { @@ -200,14 +181,14 @@ impl stmt { fn to_string(&self, indent: usize) -> String { let current_indent = make_indent(indent); match self.clone() { - stmt::ClassDef(name, bases, keywords, body, decorator_list) => format!("{}class {}({}):\n{}", current_indent, name, args_to_string(bases), statements_to_string(indent, body)), - stmt::FunctionDef(name, arguments, body, decorator_list, returns) => format!("{}def {}({}):\n{}", current_indent, name, arguments_to_string(arguments), statements_to_string(indent, body)), + stmt::ClassDef(name, bases, keywords, body, decorator_list) => format!("{}class {}({}):\n{}", current_indent, name, vec_to_strings_vec(bases).join(", "), statements_to_string(indent, body)), + stmt::FunctionDef(name, arguments, body, decorator_list, returns) => format!("{}def {}({}):\n{}", current_indent, name, arguments.to_string(), statements_to_string(indent, body)), stmt::Global(names) => format!("{}global {}", current_indent, names.join(", ")), stmt::Nonlocal(names) => format!("{}nonlocal {}", current_indent, names.join(", ")), stmt::If(test, body, orelse) => format!("{}if {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)), stmt::While(test, body, orelse) => format!("{}while {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)), stmt::For(target, iter, body, orelse) => format!("{}for {} in {}:\n{}", current_indent, target.to_string(), iter.to_string(), if_else_statements_to_string(indent, body, orelse)), - stmt::Assign(targets, value) => format!("{}{} = {}", current_indent, args_to_string(targets), value.to_string()), + stmt::Assign(targets, value) => format!("{}{} = {}", current_indent, vec_to_strings_vec(targets).join(", "), value.to_string()), stmt::AugAssign(target, op, value) => format!("{}{} {}= {}", current_indent, target.to_string(), op.to_string(), value.to_string()), stmt::Return(expr) => format!("{}return{}", current_indent, match expr { Some(expr) => format!(" {}", expr.to_string()), @@ -247,7 +228,7 @@ impl stmt { }), stmt::Expr(expr) => format!("{}{}", current_indent, expr.to_string()), stmt::Break => format!("{}break", current_indent), - stmt::Delete(targets) => format!("{}del {}", current_indent, args_to_string(targets)), + stmt::Delete(targets) => format!("{}del {}", current_indent, vec_to_strings_vec(targets).join(", ")), stmt::Pass => format!("{}pass", current_indent), stmt::Continue => format!("{}continue", current_indent) }