annotate src/ast_dump.rs @ 92:7977a52c3202

Fix chained assigns.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 28 Jun 2016 01:22:35 +0100
parents 859d44f143b8
children 20c1c9d7803d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
86
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 85
diff changeset
1 use python_ast::{Module, stmt, expr, boolop, operator, unaryop, cmpop, arguments, arg, keyword, comprehension, withitem, excepthandler, slice, name_constant};
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use std::iter;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
5 trait ToStringable {
54
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
6 fn to_string(&self) -> String;
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
7 }
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
8
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
9 impl boolop {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
10 fn to_string(&self) -> &'static str {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
11 match *self {
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
12 boolop::And => " and ",
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
13 boolop::Or => " or "
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
14 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
15 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
16 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
17
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
18 impl operator {
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
19 fn to_string(&self) -> &'static str {
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
20 match *self {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
21 operator::Add => "+",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
22 operator::Sub => "-",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
23 operator::Mult => "*",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
24 operator::MatMult => "@",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
25 operator::Div => "/",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
26 operator::Mod => "%",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
27 operator::Pow => "**",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
28 operator::LShift => "<<",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
29 operator::RShift => ">>",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
30 operator::BitOr => "|",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
31 operator::BitXor => "^",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
32 operator::BitAnd => "&",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
33 operator::FloorDiv => "//",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
34 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
35 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
36 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
37
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
38 impl unaryop {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
39 fn to_string(&self) -> &'static str {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
40 match *self {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
41 unaryop::Invert => "~",
28
bc3437ecb12b Add a test for unaryop and fix ast_dump for unaryop::Not.
Bastien Orivel <eijebong@bananium.fr>
parents: 22
diff changeset
42 unaryop::Not => "not ",
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
43 unaryop::UAdd => "+",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
44 unaryop::USub => "-"
5
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
45 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
46 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
47 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
48
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
49 impl cmpop {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 fn to_string(&self) -> &'static str {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51 match *self {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
52 cmpop::Eq => "==",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
53 cmpop::NotEq => "!=",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
54 cmpop::Lt => "<",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
55 cmpop::LtE => "<=",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
56 cmpop::Gt => ">",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
57 cmpop::GtE => ">=",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
58 cmpop::Is => "is",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
59 cmpop::IsNot => "is not",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
60 cmpop::In => "in",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
61 cmpop::NotIn => "not in",
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
62 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
63 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
64 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
65
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
66 impl ToStringable for withitem {
59
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
67 fn to_string(&self) -> String {
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
68 match self.optional_vars {
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
69 None => format!("{}", self.context_expr.to_string()),
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
70 Some(ref optional_var) => format!("{} as {}", self.context_expr.to_string(), optional_var.to_string())
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
71 }
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
72 }
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
73 }
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
74
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
75 fn vec_to_strings_vec<T: ToStringable>(values: Vec<T>) -> Vec<String> {
54
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
76 let mut vector = vec!();
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
77 for value in values {
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
78 vector.push(value.to_string());
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
79 }
54
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
80 vector
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
81 }
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
82
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
83 impl ToStringable for keyword {
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
84 fn to_string(&self) -> String {
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
85 match self.arg.clone() {
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
86 Some(arg) => format!("{}={}", arg, self.value.to_string()),
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
87 None => format!("**{}", self.value.to_string())
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
88 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
89 }
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
90 }
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
91
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
92 fn statements_to_string(indent: usize, body: Vec<stmt>) -> String {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
93 let mut statements = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
94 for statement in body {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
95 statements.push(statement.to_string(indent + 1));
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
96 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
97 statements.join("\n")
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
98 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
99
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
100 fn if_else_statements_to_string(indent: usize, body: Vec<stmt>, orelse: Vec<stmt>) -> String {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
101 let body = statements_to_string(indent, body);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
102 if orelse.is_empty() {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
103 body
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
104 } else {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
105 format!("{}\n{}else:\n{}", body, make_indent(indent), statements_to_string(indent, orelse))
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
106 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
107 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
108
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
109 impl ToStringable for comprehension {
55
32c78b275d5a Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 54
diff changeset
110 fn to_string(&self) -> String {
32c78b275d5a Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 54
diff changeset
111 let mut result = vec!();
32c78b275d5a Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 54
diff changeset
112 result.push(format!("for {} in {}", self.target.to_string(), self.iter.to_string()));
32c78b275d5a Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 54
diff changeset
113 for if_ in self.ifs.clone() {
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
114 result.push(format!("if {}", if_.to_string()))
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
115 }
55
32c78b275d5a Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 54
diff changeset
116 result.join(" ")
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
117 }
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
118 }
54
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
119
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
120 impl ToStringable for slice {
82
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
121 fn to_string(&self) -> String {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
122 match *self {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
123 slice::Index(ref value) => value.to_string(),
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
124 slice::Slice(ref lower, ref upper, ref step) => {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
125 format!("{}{}{}",
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
126 match *lower {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
127 None => String::new(),
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
128 Some(ref lower) => lower.to_string()
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
129 },
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
130 match *upper {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
131 None => String::new(),
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
132 Some(ref upper) => format!(":{}", upper.to_string())
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
133 },
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
134 match *step {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
135 None => String::new(),
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
136 Some(ref step) => format!(":{}", step.to_string())
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
137 },
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
138 )
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
139 },
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
140 slice::ExtSlice(ref dims) => {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
141 let mut dims_ = vec!();
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
142 for dim in dims {
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
143 dims_.push(dim.to_string());
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
144 }
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
145 dims_.join(", ")
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
146 }
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
147 }
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
148 }
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
149 }
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
150
68
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
151 impl excepthandler {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
152 fn to_string(self, indent: usize) -> String {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
153 let current_indent = make_indent(indent);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
154 format!("{}except {}{}:\n{}",
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
155 current_indent,
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
156 match self.type_ {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
157 None => String::new(),
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
158 Some(ref type_) => type_.to_string()
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
159 },
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
160 match self.name {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
161 None => String::new(),
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
162 Some(ref name) => format!(" as {}", name)
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
163 },
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
164 statements_to_string(indent, self.body)
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
165 )
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
166 }
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
167 }
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
168
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
169 impl ToStringable for expr {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
170 fn to_string(&self) -> String {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
171 match self.clone() {
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
172 expr::BoolOp(op, values) => {
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
173 let mut data = vec!();
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
174 for value in values {
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
175 data.push(value.to_string());
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
176 }
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
177 data.join(op.to_string())
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
178 },
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
179 expr::BinOp(a, op, b) => format!("{} {} {}", a.to_string(), op.to_string(), b.to_string()),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
180 expr::UnaryOp(op, operand) => format!("{}{}", op.to_string(), operand.to_string()),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
181
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
182 expr::Compare(left, ops, comparators) => format!("{} {}", left.to_string(), {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
183 let mut arguments = vec!();
85
09f5e0d7bcf3 Fix chained Compare dumping.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 84
diff changeset
184 for (op, comparator) in ops.iter().zip(comparators.iter()) {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
185 arguments.push(format!("{} {}", op.to_string(), comparator.to_string()))
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
186 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
187 arguments.join(" ")
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
188 }),
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
189 expr::Call(func, args, keywords) => format!("{}({})", func.to_string(), {
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
190 let mut arguments = vec!();
54
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
191 let args = vec_to_strings_vec(args);
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
192 let keywords = vec_to_strings_vec(keywords);
53
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
193 arguments.extend(args);
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
194 arguments.extend(keywords);
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
195 arguments.join(", ")
1a815946c2e5 Implement keywords in expr::Call, and add some tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 52
diff changeset
196 }),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
197 expr::Num(n) => format!("{}", n),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
198 expr::Str(s) => format!("\"{}\"", s),
91
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
199 expr::Bytes(s) => format!("b\"{}\"", {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
200 let mut string = String::with_capacity(s.len());
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
201 for ascii_code in s {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
202 let c = ascii_code as char;
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
203 if c >= ' ' && c <= '~' {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
204 if c == '"' || c == '\\' {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
205 string.push('\\');
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
206 }
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
207 string.push(c);
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
208 } else if c == '\t' {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
209 string.push_str("\\t");
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
210 } else if c == '\n' {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
211 string.push_str("\\n");
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
212 } else if c == '\r' {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
213 string.push_str("\\r");
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
214 } else /* if c > '~' */ {
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
215 let value = format!("\\x{:02x}", ascii_code);
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
216 string.push_str(value.as_str());
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
217 }
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
218 }
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
219 string
859d44f143b8 Implement Bytes in the AST.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 89
diff changeset
220 }),
86
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 85
diff changeset
221 expr::NameConstant(constant) => match constant {
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 85
diff changeset
222 name_constant::True => String::from("True"),
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 85
diff changeset
223 name_constant::False => String::from("False"),
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 85
diff changeset
224 name_constant::None_ => String::from("None")
a7b1db623f41 Implement NameConstant correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 85
diff changeset
225 },
62
d255a932553f Fix a few warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 60
diff changeset
226 expr::Attribute(value, attr, _) => format!("{}.{}", value.to_string(), attr),
d255a932553f Fix a few warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 60
diff changeset
227 expr::Name(name, _) => format!("{}", name),
d255a932553f Fix a few warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 60
diff changeset
228 expr::List(elts, _) => format!("[{}]", vec_to_strings_vec(elts).join(", ")),
55
32c78b275d5a Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 54
diff changeset
229 expr::ListComp(elt, generators) => format!("[{} {}]", elt.to_string(), vec_to_strings_vec(generators).join(" ")),
32c78b275d5a Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 54
diff changeset
230 expr::DictComp(key, value, generators) => format!("{{{}: {} {}}}", key.to_string(), value.to_string(), vec_to_strings_vec(generators).join(" ")),
62
d255a932553f Fix a few warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 60
diff changeset
231 expr::Tuple(elts, _) => format!("({})", vec_to_strings_vec(elts).join(", ")),
52
d9838e8b3ec5 Add ast.Ellipsis.
Bastien Orivel <eijebong@bananium.fr>
parents: 51
diff changeset
232 expr::Ellipsis => format!("..."),
73
2a6629ea82b5 Add ast.Await.
Bastien Orivel <eijebong@bananium.fr>
parents: 72
diff changeset
233 expr::Await(value) => format!("await {}", value.to_string()),
74
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
234 expr::Yield(value) => {
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
235 match *value {
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
236 None => String::from("yield"),
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
237 Some(value) => format!("yield {}", value.to_string())
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
238 }
97537c90d92d Add ast.Yield.
Bastien Orivel <eijebong@bananium.fr>
parents: 73
diff changeset
239 },
75
1abc8ca9f30b Add ast.YieldFrom.
Bastien Orivel <eijebong@bananium.fr>
parents: 74
diff changeset
240 expr::YieldFrom(value) => format!("yield from {}", value.to_string()),
76
efd42fc280e8 Add ast.Set.
Bastien Orivel <eijebong@bananium.fr>
parents: 75
diff changeset
241 expr::Set(elts) => format!("{{{}}}", vec_to_strings_vec(elts).join(", ")),
77
7d1406181aae Add ast.SetComp.
Bastien Orivel <eijebong@bananium.fr>
parents: 76
diff changeset
242 expr::SetComp(elt, generators) => format!("{{{} {}}}", elt.to_string(), vec_to_strings_vec(generators).join(" ")),
78
f1a845e4121b Add ast.GeneratorExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 77
diff changeset
243 expr::GeneratorExp(elt, generators) => format!("({} {})", elt.to_string(), vec_to_strings_vec(generators).join(" ")),
79
6bf54bff8dbd Add ast.Lambda.
Bastien Orivel <eijebong@bananium.fr>
parents: 78
diff changeset
244 expr::Lambda(args, body) => format!("lambda {}: {}", args.to_string(), body.to_string()),
80
c6d3f0dabbba Add ast.IfExp.
Bastien Orivel <eijebong@bananium.fr>
parents: 79
diff changeset
245 expr::IfExp(test, body, orelse) => format!("{} if {} else {}", body.to_string(), test.to_string(), orelse.to_string()),
81
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
246 expr::Dict(keys, values) => {
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
247 format!("{{{}}}",
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
248 {
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
249 let mut items = vec!();
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
250 for (key, value) in keys.iter().zip(values.iter()) {
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
251 let item = match *key {
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
252 None => format!("**{}", value.to_string()),
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
253 Some(ref key) => format!("{}: {}", key.to_string(), value.to_string()),
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
254 };
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
255 items.push(item);
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
256 }
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
257 items.join(", ")
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
258 }
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
259 )
dc82a0d8f144 Add ast.Dict.
Bastien Orivel <eijebong@bananium.fr>
parents: 80
diff changeset
260 },
82
2d906d1cb940 Add ast.Subscript.
Bastien Orivel <eijebong@bananium.fr>
parents: 81
diff changeset
261 expr::Subscript(value, slice, _) => format!("{}[{}]", value.to_string(), slice.to_string()),
83
e59cd5754268 Add ast.Starred.
Bastien Orivel <eijebong@bananium.fr>
parents: 82
diff changeset
262 expr::Starred(value, _) => format!("*{}", value.to_string()),
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
263 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
264 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
265 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
266
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
267 impl ToStringable for arg {
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
268 fn to_string(&self) -> String {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
269 match self.annotation {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
270 None => self.arg.clone(),
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
271 Some(ref annotation) => format!("{}: {}", self.arg, annotation.to_string())
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
272 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
273 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
274 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
275
89
898876834564 Rename trait to respect CamelCase conventions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 86
diff changeset
276 impl ToStringable for arguments {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
277 fn to_string(&self) -> String {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
278 let mut args = vec!();
56
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
279 let num_args = self.args.len();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
280 let num_defaults = self.defaults.len();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
281
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
282 let mut normal_args = self.args.clone();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
283 let defaulted_args = normal_args.split_off(num_args - num_defaults);
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
284 for arg in normal_args {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
285 args.push(arg.to_string());
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
286 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
287 for (arg, default) in defaulted_args.iter().zip(self.defaults.iter()) {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
288 args.push(format!("{}={}", arg.to_string(), default.to_string()));
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
289 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
290
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
291 if !self.kwonlyargs.is_empty() {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
292 match self.vararg {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
293 None => args.push("*".to_string()),
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
294 Some(ref vararg) => args.push(format!("*{}", vararg.to_string())),
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
295 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
296 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
297 for (arg, default) in self.kwonlyargs.iter().zip(self.kw_defaults.iter()) {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
298 let arg = arg.to_string();
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
299 match *default {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
300 Some(ref default) => args.push(format!("{}={}", arg, default.to_string())),
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
301 None => args.push(arg)
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
302 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
303 }
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
304 match self.kwarg {
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
305 Some(ref kwarg) => args.push(format!("**{}", kwarg.to_string())),
c3cc16b933d2 Implement function arguments of all kinds.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 55
diff changeset
306 None => ()
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
307 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
308 args.join(", ")
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
309 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
310 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
311
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
312 fn make_indent(indent: usize) -> String {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
313 iter::repeat(" ").take(indent).collect()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
314 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
315
65
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
316 fn decorator_list_to_string(decorator_list: Vec<expr>, indent: usize) -> String {
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
317 let current_indent = make_indent(indent);
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
318 let decorators = vec_to_strings_vec(decorator_list);
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
319 if decorators.is_empty() {
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
320 String::new()
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
321 } else {
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
322 format!("{}@{}\n",
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
323 current_indent,
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
324 decorators.join(format!("\n{}@", current_indent).as_str())
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
325 )
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
326 }
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
327 }
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
328
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
329 impl stmt {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
330 fn to_string(&self, indent: usize) -> String {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
331 let current_indent = make_indent(indent);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
332 match self.clone() {
65
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
333 stmt::ClassDef(name, bases, keywords, body, decorator_list) => {
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
334 format!("{}{}class {}({}):\n{}",
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
335 decorator_list_to_string(decorator_list, indent),
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
336 current_indent,
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
337 name,
67
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
338 {
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
339 let mut arguments = vec!();
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
340 let bases = vec_to_strings_vec(bases);
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
341 let keywords = vec_to_strings_vec(keywords);
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
342 arguments.extend(bases);
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
343 arguments.extend(keywords);
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
344 arguments.join(", ")
8ce78e2ba48c Implement class keywords.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 66
diff changeset
345 },
65
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
346 statements_to_string(indent, body)
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
347 )
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
348 },
69
a73eaf42bea1 Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents: 68
diff changeset
349 stmt::FunctionDef(name, arguments, body, decorator_list, returns, async) => {
a73eaf42bea1 Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents: 68
diff changeset
350 format!("{}{}{}def {}({}){}:\n{}",
65
ce5e27a3f277 Add ClassDef.decorator_list support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
351 decorator_list_to_string(decorator_list, indent),
69
a73eaf42bea1 Add ast.AsyncDefFunction.
Bastien Orivel <eijebong@bananium.fr>
parents: 68
diff changeset
352 if async { "async " } else { "" },
63
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
353 current_indent,
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
354 name,
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
355 arguments.to_string(),
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
356 match returns {
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
357 None => String::new(),
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
358 Some(returns) => format!(" -> {}", returns.to_string())
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
359 },
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
360 statements_to_string(indent, body)
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
361 )
5df52b40fe54 Implement FunctionDef.returns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
362 }
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
363 stmt::Global(names) => format!("{}global {}", current_indent, names.join(", ")),
51
ded1907b7a69 Add ast.Nonlocal.
Bastien Orivel <eijebong@bananium.fr>
parents: 50
diff changeset
364 stmt::Nonlocal(names) => format!("{}nonlocal {}", current_indent, names.join(", ")),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
365 stmt::If(test, body, orelse) => format!("{}if {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
366 stmt::While(test, body, orelse) => format!("{}while {}:\n{}", current_indent, test.to_string(), if_else_statements_to_string(indent, body, orelse)),
71
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
367 stmt::For(target, iter, body, orelse, async) => {
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
368 format!("{}{}for {} in {}:\n{}",
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
369 current_indent,
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
370 if async { "async " } else { "" },
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
371 target.to_string(),
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
372 iter.to_string(),
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
373 if_else_statements_to_string(indent, body, orelse)
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
374 )
2c1e2ce41263 Add ast.AsyncFor.
Bastien Orivel <eijebong@bananium.fr>
parents: 69
diff changeset
375 },
92
7977a52c3202 Fix chained assigns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 91
diff changeset
376 stmt::Assign(targets, value) => format!("{}{} = {}", current_indent, vec_to_strings_vec(targets).join(" = "), value.to_string()),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
377 stmt::AugAssign(target, op, value) => format!("{}{} {}= {}", current_indent, target.to_string(), op.to_string(), value.to_string()),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
378 stmt::Return(expr) => format!("{}return{}", current_indent, match expr {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
379 Some(expr) => format!(" {}", expr.to_string()),
58
a0b23123901b Replace "".to_string() and format!("") by String::new().
Bastien Orivel <eijebong@bananium.fr>
parents: 57
diff changeset
380 None => String::new()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
381 }),
48
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
382 stmt::ImportFrom(module, names, level) => {
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
383 format!("{}from {}{} import {}",
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
384 current_indent,
66
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
385 match level {
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
386 None => String::new(),
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
387 Some(level) => iter::repeat(".").take(level).collect()
48
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
388 },
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
389 module.to_string(),
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
390 {
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
391 let mut names_ = vec!();
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
392 for name in names {
66
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
393 names_.push(
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
394 match name.asname {
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
395 None => name.name,
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
396 Some(asname) => format!("{} as {}", name.name, asname)
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
397 }
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
398 )
48
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
399 }
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
400 names_.join(", ")
44
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
401 }
48
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
402 )
039f85b187f2 Also handle relative imports.
Bastien Orivel <eijebong@bananium.fr>
parents: 47
diff changeset
403 },
47
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
404 stmt::Import(names) => format!("{}import {}", current_indent, {
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
405 let mut names_ = vec!();
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
406 for name in names {
66
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
407 names_.push(
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
408 match name.asname {
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
409 None => name.name,
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
410 Some(asname) => format!("{} as {}", name.name, asname)
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
411 }
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
412 )
47
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
413 }
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
414 names_.join(", ")
38f59b0efc2c Handle Import and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 44
diff changeset
415 }),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
416 stmt::Expr(expr) => format!("{}{}", current_indent, expr.to_string()),
21
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 19
diff changeset
417 stmt::Break => format!("{}break", current_indent),
54
ad2453a55820 Refactor all Vec<T> -> Vec<String> functions into a single one.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 53
diff changeset
418 stmt::Delete(targets) => format!("{}del {}", current_indent, vec_to_strings_vec(targets).join(", ")),
50
5edbc24b625f Add ast.Continue.
Bastien Orivel <eijebong@bananium.fr>
parents: 49
diff changeset
419 stmt::Pass => format!("{}pass", current_indent),
57
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
420 stmt::Continue => format!("{}continue", current_indent),
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
421 stmt::Assert(test, msg) => {
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
422 format!("{}assert {}{}",
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
423 current_indent,
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
424 test.to_string(),
66
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
425 match msg {
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
426 None => String::new(),
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
427 Some(msg) => format!(", {}", msg.to_string())
57
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
428 }
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
429 )
59
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
430 },
72
7ac23f4336b1 Add ast.AsyncWith.
Bastien Orivel <eijebong@bananium.fr>
parents: 71
diff changeset
431 stmt::With(items, body, async) => {
7ac23f4336b1 Add ast.AsyncWith.
Bastien Orivel <eijebong@bananium.fr>
parents: 71
diff changeset
432 format!("{}{}with {}:\n{}",
59
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
433 current_indent,
72
7ac23f4336b1 Add ast.AsyncWith.
Bastien Orivel <eijebong@bananium.fr>
parents: 71
diff changeset
434 if async { "async " } else { "" },
66
32550e12aedf Simplify some expressions in ast_dump.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 65
diff changeset
435 vec_to_strings_vec(items).join(", "),
59
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
436 statements_to_string(indent, body)
407b3b217928 Add ast.With.
Bastien Orivel <eijebong@bananium.fr>
parents: 58
diff changeset
437 )
60
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
438 },
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
439 stmt::Raise(exc, cause) => {
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
440 format!("{}raise{}{}",
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
441 current_indent,
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
442 match exc {
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
443 None => String::new(),
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
444 Some(ref exc) => format!(" {}", exc.to_string())
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
445 },
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
446 match cause {
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
447 None => String::new(),
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
448 Some(ref cause) => format!(" from {}", cause.to_string())
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
449 }
9f0f457a67f6 Add ast.Raise.
Bastien Orivel <eijebong@bananium.fr>
parents: 59
diff changeset
450 )
68
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
451 },
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
452 stmt::Try(body, excepthandlers, orelse, finalbody) => {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
453 format!("{}try:\n{}\n{}{}\n{}",
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
454 current_indent,
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
455 statements_to_string(indent, body),
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
456 {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
457 let mut excepthandlers_ = vec!();
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
458 for excepthandler in excepthandlers {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
459 let excepthandler = excepthandler.to_string(indent);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
460 excepthandlers_.push(excepthandler);
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
461 }
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
462 excepthandlers_.join("\n")
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
463 },
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
464 if !orelse.is_empty() {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
465 format!("{}else:\n{}", current_indent, statements_to_string(indent, orelse))
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
466 } else {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
467 String::new()
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
468 },
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
469 if !finalbody.is_empty() {
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
470 format!("{}finally:\n{}", current_indent, statements_to_string(indent, finalbody))
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
471 } else {
84
ff6b1aeb544a Fix indentation whoopsie introduced in c59ad5ccd8a6.
Bastien Orivel <eijebong@bananium.fr>
parents: 83
diff changeset
472 String::new()
68
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
473 }
c59ad5ccd8a6 Add ast.Try
Bastien Orivel <eijebong@bananium.fr>
parents: 67
diff changeset
474 )
57
e5a808ec31c0 Add ast.Assert.
Bastien Orivel <eijebong@bananium.fr>
parents: 56
diff changeset
475 }
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
476 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
477 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
478 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
479
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
480 #[allow(dead_code)]
22
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
481 pub fn dump_ast(ast: &Module) -> String {
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
482 let mut dumped_statements = vec!();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
483 for statement in &ast.statements {
22
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
484 let dumped_statement = statement.to_string(0);
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
485 dumped_statements.push(dumped_statement);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
486 }
22
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
487 dumped_statements.join("\n")
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
488 }
22
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
489