Mercurial > python-compiler.rs
annotate src/ast_dump.rs @ 93:c06d12a81637
Better test failure. Use assert_diff! instead of assert_eq! so we can actually see what the differences are.
author | Bastien Orivel <eijebong@bananium.fr> |
---|---|
date | Tue, 14 Jun 2016 02:53:29 +0200 |
parents | 7977a52c3202 |
children | 20c1c9d7803d |
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 | 2 |
3 use std::iter; | |
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 | 50 fn to_string(&self) -> &'static str { |
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 | 62 } |
63 } | |
64 } | |
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 | 67 fn to_string(&self) -> String { |
68 match self.optional_vars { | |
69 None => format!("{}", self.context_expr.to_string()), | |
70 Some(ref optional_var) => format!("{} as {}", self.context_expr.to_string(), optional_var.to_string()) | |
71 } | |
72 } | |
73 } | |
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 | 114 result.push(format!("if {}", if_.to_string())) |
115 } | |
55
32c78b275d5a
Implement comprehension’s to_string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
54
diff
changeset
|
116 result.join(" ") |
14 | 117 } |
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 | 121 fn to_string(&self) -> String { |
122 match *self { | |
123 slice::Index(ref value) => value.to_string(), | |
124 slice::Slice(ref lower, ref upper, ref step) => { | |
125 format!("{}{}{}", | |
126 match *lower { | |
127 None => String::new(), | |
128 Some(ref lower) => lower.to_string() | |
129 }, | |
130 match *upper { | |
131 None => String::new(), | |
132 Some(ref upper) => format!(":{}", upper.to_string()) | |
133 }, | |
134 match *step { | |
135 None => String::new(), | |
136 Some(ref step) => format!(":{}", step.to_string()) | |
137 }, | |
138 ) | |
139 }, | |
140 slice::ExtSlice(ref dims) => { | |
141 let mut dims_ = vec!(); | |
142 for dim in dims { | |
143 dims_.push(dim.to_string()); | |
144 } | |
145 dims_.join(", ") | |
146 } | |
147 } | |
148 } | |
149 } | |
150 | |
68 | 151 impl excepthandler { |
152 fn to_string(self, indent: usize) -> String { | |
153 let current_indent = make_indent(indent); | |
154 format!("{}except {}{}:\n{}", | |
155 current_indent, | |
156 match self.type_ { | |
157 None => String::new(), | |
158 Some(ref type_) => type_.to_string() | |
159 }, | |
160 match self.name { | |
161 None => String::new(), | |
162 Some(ref name) => format!(" as {}", name) | |
163 }, | |
164 statements_to_string(indent, self.body) | |
165 ) | |
166 } | |
167 } | |
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 | 170 fn to_string(&self) -> String { |
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 | 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 | 185 arguments.push(format!("{} {}", op.to_string(), comparator.to_string())) |
186 } | |
187 arguments.join(" ") | |
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 | 232 expr::Ellipsis => format!("..."), |
73 | 233 expr::Await(value) => format!("await {}", value.to_string()), |
74 | 234 expr::Yield(value) => { |
235 match *value { | |
236 None => String::from("yield"), | |
237 Some(value) => format!("yield {}", value.to_string()) | |
238 } | |
239 }, | |
75 | 240 expr::YieldFrom(value) => format!("yield from {}", value.to_string()), |
76 | 241 expr::Set(elts) => format!("{{{}}}", vec_to_strings_vec(elts).join(", ")), |
77 | 242 expr::SetComp(elt, generators) => format!("{{{} {}}}", elt.to_string(), vec_to_strings_vec(generators).join(" ")), |
78 | 243 expr::GeneratorExp(elt, generators) => format!("({} {})", elt.to_string(), vec_to_strings_vec(generators).join(" ")), |
79 | 244 expr::Lambda(args, body) => format!("lambda {}: {}", args.to_string(), body.to_string()), |
80 | 245 expr::IfExp(test, body, orelse) => format!("{} if {} else {}", body.to_string(), test.to_string(), orelse.to_string()), |
81 | 246 expr::Dict(keys, values) => { |
247 format!("{{{}}}", | |
248 { | |
249 let mut items = vec!(); | |
250 for (key, value) in keys.iter().zip(values.iter()) { | |
251 let item = match *key { | |
252 None => format!("**{}", value.to_string()), | |
253 Some(ref key) => format!("{}: {}", key.to_string(), value.to_string()), | |
254 }; | |
255 items.push(item); | |
256 } | |
257 items.join(", ") | |
258 } | |
259 ) | |
260 }, | |
82 | 261 expr::Subscript(value, slice, _) => format!("{}[{}]", value.to_string(), slice.to_string()), |
83 | 262 expr::Starred(value, _) => format!("*{}", value.to_string()), |
0 | 263 } |
264 } | |
265 } | |
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 | 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 | 314 } |
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 | 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 | 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 | 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 | 367 stmt::For(target, iter, body, orelse, async) => { |
368 format!("{}{}for {} in {}:\n{}", | |
369 current_indent, | |
370 if async { "async " } else { "" }, | |
371 target.to_string(), | |
372 iter.to_string(), | |
373 if_else_statements_to_string(indent, body, orelse) | |
374 ) | |
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 | 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 | 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 | 419 stmt::Pass => format!("{}pass", current_indent), |
57 | 420 stmt::Continue => format!("{}continue", current_indent), |
421 stmt::Assert(test, msg) => { | |
422 format!("{}assert {}{}", | |
423 current_indent, | |
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 | 428 } |
429 ) | |
59 | 430 }, |
72 | 431 stmt::With(items, body, async) => { |
432 format!("{}{}with {}:\n{}", | |
59 | 433 current_indent, |
72 | 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 | 436 statements_to_string(indent, body) |
437 ) | |
60 | 438 }, |
439 stmt::Raise(exc, cause) => { | |
440 format!("{}raise{}{}", | |
441 current_indent, | |
442 match exc { | |
443 None => String::new(), | |
444 Some(ref exc) => format!(" {}", exc.to_string()) | |
445 }, | |
446 match cause { | |
447 None => String::new(), | |
448 Some(ref cause) => format!(" from {}", cause.to_string()) | |
449 } | |
450 ) | |
68 | 451 }, |
452 stmt::Try(body, excepthandlers, orelse, finalbody) => { | |
453 format!("{}try:\n{}\n{}{}\n{}", | |
454 current_indent, | |
455 statements_to_string(indent, body), | |
456 { | |
457 let mut excepthandlers_ = vec!(); | |
458 for excepthandler in excepthandlers { | |
459 let excepthandler = excepthandler.to_string(indent); | |
460 excepthandlers_.push(excepthandler); | |
461 } | |
462 excepthandlers_.join("\n") | |
463 }, | |
464 if !orelse.is_empty() { | |
465 format!("{}else:\n{}", current_indent, statements_to_string(indent, orelse)) | |
466 } else { | |
467 String::new() | |
468 }, | |
469 if !finalbody.is_empty() { | |
470 format!("{}finally:\n{}", current_indent, statements_to_string(indent, finalbody)) | |
471 } else { | |
84
ff6b1aeb544a
Fix indentation whoopsie introduced in c59ad5ccd8a6.
Bastien Orivel <eijebong@bananium.fr>
parents:
83
diff
changeset
|
472 String::new() |
68 | 473 } |
474 ) | |
57 | 475 } |
0 | 476 } |
477 } | |
478 } | |
479 | |
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 | 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 | 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 | 488 } |
22
25b202005d1d
Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents:
21
diff
changeset
|
489 |