comparison src/ast_dump.rs @ 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
comparison
equal deleted inserted replaced
53:1a815946c2e5 54:ad2453a55820
1 use python_ast::{Module, stmt, expr, boolop, operator, unaryop, cmpop, arguments, arg, keyword, comprehension}; 1 use python_ast::{Module, stmt, expr, boolop, operator, unaryop, cmpop, arguments, arg, keyword, comprehension};
2 2
3 use std::iter; 3 use std::iter;
4
5 trait to_string_able {
6 fn to_string(&self) -> String;
7 }
4 8
5 impl boolop { 9 impl boolop {
6 fn to_string(&self) -> &'static str { 10 fn to_string(&self) -> &'static str {
7 match *self { 11 match *self {
8 boolop::And => " and ", 12 boolop::And => " and ",
57 cmpop::NotIn => "not in", 61 cmpop::NotIn => "not in",
58 } 62 }
59 } 63 }
60 } 64 }
61 65
62 fn args_to_strings(args: Vec<expr>) -> Vec<String> { 66 fn vec_to_strings_vec<T: to_string_able>(values: Vec<T>) -> Vec<String> {
63 let mut arguments = vec!(); 67 let mut vector = vec!();
64 for arg in args { 68 for value in values {
65 arguments.push(arg.to_string()); 69 vector.push(value.to_string());
66 } 70 }
67 arguments 71 vector
68 } 72 }
69 73
70 fn args_to_string(args: Vec<expr>) -> String { 74 impl to_string_able for keyword {
71 let mut arguments = vec!();
72 for arg in args {
73 arguments.push(arg.to_string());
74 }
75 arguments.join(", ")
76 }
77
78 impl keyword {
79 fn to_string(&self) -> String { 75 fn to_string(&self) -> String {
80 match self.arg.clone() { 76 match self.arg.clone() {
81 Some(arg) => format!("{}={}", arg, self.value.to_string()), 77 Some(arg) => format!("{}={}", arg, self.value.to_string()),
82 None => format!("**{}", self.value.to_string()) 78 None => format!("**{}", self.value.to_string())
83 } 79 }
84 } 80 }
85 }
86
87 fn kwargs_to_strings(kwargs: Vec<keyword>) -> Vec<String> {
88 let mut arguments = vec!();
89 for kwarg in kwargs {
90 arguments.push(kwarg.to_string());
91 }
92 arguments
93 }
94
95 fn arguments_to_string(args: arguments) -> String {
96 let mut arguments = vec!();
97 for arg in args.args {
98 arguments.push(arg.arg);
99 }
100 arguments.join(", ")
101 } 81 }
102 82
103 fn statements_to_string(indent: usize, body: Vec<stmt>) -> String { 83 fn statements_to_string(indent: usize, body: Vec<stmt>) -> String {
104 let mut statements = vec!(); 84 let mut statements = vec!();
105 for statement in body { 85 for statement in body {
125 result.push(format!("if {}", if_.to_string())) 105 result.push(format!("if {}", if_.to_string()))
126 } 106 }
127 } 107 }
128 result.join(" ") 108 result.join(" ")
129 } 109 }
130 impl expr { 110
111 impl to_string_able for expr {
131 fn to_string(&self) -> String { 112 fn to_string(&self) -> String {
132 match self.clone() { 113 match self.clone() {
133 expr::BoolOp(op, values) => { 114 expr::BoolOp(op, values) => {
134 let mut data = vec!(); 115 let mut data = vec!();
135 for value in values { 116 for value in values {
160 141
161 arguments.join(" ") 142 arguments.join(" ")
162 }), 143 }),
163 expr::Call(func, args, keywords) => format!("{}({})", func.to_string(), { 144 expr::Call(func, args, keywords) => format!("{}({})", func.to_string(), {
164 let mut arguments = vec!(); 145 let mut arguments = vec!();
165 let args = args_to_strings(args); 146 let args = vec_to_strings_vec(args);
166 let keywords = kwargs_to_strings(keywords); 147 let keywords = vec_to_strings_vec(keywords);
167 arguments.extend(args); 148 arguments.extend(args);
168 arguments.extend(keywords); 149 arguments.extend(keywords);
169 arguments.join(", ") 150 arguments.join(", ")
170 }), 151 }),
171 expr::Num(n) => format!("{}", n), 152 expr::Num(n) => format!("{}", n),
172 expr::Str(s) => format!("\"{}\"", s), 153 expr::Str(s) => format!("\"{}\"", s),
173 expr::NameConstant(name) => format!("{}", name), 154 expr::NameConstant(name) => format!("{}", name),
174 expr::Attribute(value, attr, ctx) => format!("{}.{}", value.to_string(), attr), 155 expr::Attribute(value, attr, ctx) => format!("{}.{}", value.to_string(), attr),
175 expr::Name(name, ctx) => format!("{}", name), 156 expr::Name(name, ctx) => format!("{}", name),
176 expr::List(elts, ctx) => format!("[{}]", args_to_string(elts)), 157 expr::List(elts, ctx) => format!("[{}]", vec_to_strings_vec(elts).join(", ")),
177 expr::ListComp(elt, generators) => format!("[{} {}]", elt.to_string(), generators_to_string(generators)), 158 expr::ListComp(elt, generators) => format!("[{} {}]", elt.to_string(), generators_to_string(generators)),
178 expr::DictComp(key, value, generators) => format!("{{{}: {} {}}}", key.to_string(), value.to_string(), generators_to_string(generators)), 159 expr::DictComp(key, value, generators) => format!("{{{}: {} {}}}", key.to_string(), value.to_string(), generators_to_string(generators)),
179 expr::Tuple(elts, ctx) => format!("({})", args_to_string(elts)), 160 expr::Tuple(elts, ctx) => format!("({})", vec_to_strings_vec(elts).join(", ")),
180 expr::Ellipsis => format!("..."), 161 expr::Ellipsis => format!("..."),
181 } 162 }
182 } 163 }
183 } 164 }
184 165
185 impl arguments { 166 impl to_string_able for arguments {
186 fn to_string(&self) -> String { 167 fn to_string(&self) -> String {
187 let mut args = vec!(); 168 let mut args = vec!();
188 for arg in self.args.clone() { 169 for arg in self.args.clone() {
189 args.push(arg.arg); 170 args.push(arg.arg);
190 } 171 }
198 179
199 impl stmt { 180 impl stmt {
200 fn to_string(&self, indent: usize) -> String { 181 fn to_string(&self, indent: usize) -> String {
201 let current_indent = make_indent(indent); 182 let current_indent = make_indent(indent);
202 match self.clone() { 183 match self.clone() {
203 stmt::ClassDef(name, bases, keywords, body, decorator_list) => format!("{}class {}({}):\n{}", current_indent, name, args_to_string(bases), statements_to_string(indent, body)), 184 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)),
204 stmt::FunctionDef(name, arguments, body, decorator_list, returns) => format!("{}def {}({}):\n{}", current_indent, name, arguments_to_string(arguments), statements_to_string(indent, body)), 185 stmt::FunctionDef(name, arguments, body, decorator_list, returns) => format!("{}def {}({}):\n{}", current_indent, name, arguments.to_string(), statements_to_string(indent, body)),
205 stmt::Global(names) => format!("{}global {}", current_indent, names.join(", ")), 186 stmt::Global(names) => format!("{}global {}", current_indent, names.join(", ")),
206 stmt::Nonlocal(names) => format!("{}nonlocal {}", current_indent, names.join(", ")), 187 stmt::Nonlocal(names) => format!("{}nonlocal {}", current_indent, names.join(", ")),
207 stmt::If(test, body, orelse) => format!("{}if {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)), 188 stmt::If(test, body, orelse) => format!("{}if {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)),
208 stmt::While(test, body, orelse) => format!("{}while {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)), 189 stmt::While(test, body, orelse) => format!("{}while {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)),
209 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)), 190 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)),
210 stmt::Assign(targets, value) => format!("{}{} = {}", current_indent, args_to_string(targets), value.to_string()), 191 stmt::Assign(targets, value) => format!("{}{} = {}", current_indent, vec_to_strings_vec(targets).join(", "), value.to_string()),
211 stmt::AugAssign(target, op, value) => format!("{}{} {}= {}", current_indent, target.to_string(), op.to_string(), value.to_string()), 192 stmt::AugAssign(target, op, value) => format!("{}{} {}= {}", current_indent, target.to_string(), op.to_string(), value.to_string()),
212 stmt::Return(expr) => format!("{}return{}", current_indent, match expr { 193 stmt::Return(expr) => format!("{}return{}", current_indent, match expr {
213 Some(expr) => format!(" {}", expr.to_string()), 194 Some(expr) => format!(" {}", expr.to_string()),
214 None => "".to_string() 195 None => "".to_string()
215 }), 196 }),
245 } 226 }
246 names_.join(", ") 227 names_.join(", ")
247 }), 228 }),
248 stmt::Expr(expr) => format!("{}{}", current_indent, expr.to_string()), 229 stmt::Expr(expr) => format!("{}{}", current_indent, expr.to_string()),
249 stmt::Break => format!("{}break", current_indent), 230 stmt::Break => format!("{}break", current_indent),
250 stmt::Delete(targets) => format!("{}del {}", current_indent, args_to_string(targets)), 231 stmt::Delete(targets) => format!("{}del {}", current_indent, vec_to_strings_vec(targets).join(", ")),
251 stmt::Pass => format!("{}pass", current_indent), 232 stmt::Pass => format!("{}pass", current_indent),
252 stmt::Continue => format!("{}continue", current_indent) 233 stmt::Continue => format!("{}continue", current_indent)
253 } 234 }
254 } 235 }
255 } 236 }