diff src/ast_dump.rs @ 53:1a815946c2e5

Implement keywords in expr::Call, and add some tests.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 12 Jun 2016 02:37:28 +0100
parents d9838e8b3ec5
children ad2453a55820
line wrap: on
line diff
--- a/src/ast_dump.rs
+++ b/src/ast_dump.rs
@@ -59,6 +59,14 @@ impl cmpop {
     }
 }
 
+fn args_to_strings(args: Vec<expr>) -> Vec<String> {
+    let mut arguments = vec!();
+    for arg in args {
+        arguments.push(arg.to_string());
+    }
+    arguments
+}
+
 fn args_to_string(args: Vec<expr>) -> String {
     let mut arguments = vec!();
     for arg in args {
@@ -67,15 +75,21 @@ fn args_to_string(args: Vec<expr>) -> St
     arguments.join(", ")
 }
 
-fn kwargs_to_string(kwargs: Vec<keyword>) -> String {
-    let mut arguments = vec!();
-    for arg in kwargs {
-        match arg.arg {
-            Some(arg) => arguments.push(arg),
-            None => arguments.push("**kwarg".to_string())
+impl keyword {
+    fn to_string(&self) -> String {
+        match self.arg.clone() {
+            Some(arg) => format!("{}={}", arg, self.value.to_string()),
+            None => format!("**{}", self.value.to_string())
         }
     }
-    arguments.join(", ")
+}
+
+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 {
@@ -146,7 +160,14 @@ impl expr {
 
                 arguments.join(" ")
             }),
-            expr::Call(func, args, keywords) => format!("{}({}{})", func.to_string(), args_to_string(args), kwargs_to_string(keywords)),
+            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);
+                arguments.extend(args);
+                arguments.extend(keywords);
+                arguments.join(", ")
+            }),
             expr::Num(n) => format!("{}", n),
             expr::Str(s) => format!("\"{}\"", s),
             expr::NameConstant(name) => format!("{}", name),