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(", ")
     }