comparison src/ast_dump.rs @ 56:c3cc16b933d2

Implement function arguments of all kinds.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 12 Jun 2016 03:48:24 +0100
parents 32c78b275d5a
children e5a808ec31c0
comparison
equal deleted inserted replaced
55:32c78b275d5a 56:c3cc16b933d2
161 expr::Ellipsis => format!("..."), 161 expr::Ellipsis => format!("..."),
162 } 162 }
163 } 163 }
164 } 164 }
165 165
166 impl to_string_able for arg {
167 fn to_string(&self) -> String {
168 match self.annotation {
169 None => self.arg.clone(),
170 Some(ref annotation) => format!("{}: {}", self.arg, annotation.to_string())
171 }
172 }
173 }
174
166 impl to_string_able for arguments { 175 impl to_string_able for arguments {
167 fn to_string(&self) -> String { 176 fn to_string(&self) -> String {
168 let mut args = vec!(); 177 let mut args = vec!();
169 for arg in self.args.clone() { 178 let num_args = self.args.len();
170 args.push(arg.arg); 179 let num_defaults = self.defaults.len();
180
181 let mut normal_args = self.args.clone();
182 let defaulted_args = normal_args.split_off(num_args - num_defaults);
183 for arg in normal_args {
184 args.push(arg.to_string());
185 }
186 for (arg, default) in defaulted_args.iter().zip(self.defaults.iter()) {
187 args.push(format!("{}={}", arg.to_string(), default.to_string()));
188 }
189
190 if !self.kwonlyargs.is_empty() {
191 match self.vararg {
192 None => args.push("*".to_string()),
193 Some(ref vararg) => args.push(format!("*{}", vararg.to_string())),
194 }
195 }
196 for (arg, default) in self.kwonlyargs.iter().zip(self.kw_defaults.iter()) {
197 let arg = arg.to_string();
198 match *default {
199 Some(ref default) => args.push(format!("{}={}", arg, default.to_string())),
200 None => args.push(arg)
201 }
202 }
203 match self.kwarg {
204 Some(ref kwarg) => args.push(format!("**{}", kwarg.to_string())),
205 None => ()
171 } 206 }
172 args.join(", ") 207 args.join(", ")
173 } 208 }
174 } 209 }
175 210