Mercurial > python-compiler.rs
diff 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 |
line wrap: on
line diff
--- a/src/ast_dump.rs +++ b/src/ast_dump.rs @@ -163,11 +163,46 @@ impl to_string_able for expr { } } +impl to_string_able for arg { + fn to_string(&self) -> String { + match self.annotation { + None => self.arg.clone(), + Some(ref annotation) => format!("{}: {}", self.arg, annotation.to_string()) + } + } +} + impl to_string_able for arguments { fn to_string(&self) -> String { let mut args = vec!(); - for arg in self.args.clone() { - args.push(arg.arg); + let num_args = self.args.len(); + let num_defaults = self.defaults.len(); + + let mut normal_args = self.args.clone(); + let defaulted_args = normal_args.split_off(num_args - num_defaults); + for arg in normal_args { + args.push(arg.to_string()); + } + for (arg, default) in defaulted_args.iter().zip(self.defaults.iter()) { + args.push(format!("{}={}", arg.to_string(), default.to_string())); + } + + if !self.kwonlyargs.is_empty() { + match self.vararg { + None => args.push("*".to_string()), + Some(ref vararg) => args.push(format!("*{}", vararg.to_string())), + } + } + for (arg, default) in self.kwonlyargs.iter().zip(self.kw_defaults.iter()) { + let arg = arg.to_string(); + match *default { + Some(ref default) => args.push(format!("{}={}", arg, default.to_string())), + None => args.push(arg) + } + } + match self.kwarg { + Some(ref kwarg) => args.push(format!("**{}", kwarg.to_string())), + None => () } args.join(", ") }