annotate src/ast_dump.rs @ 44:5f1d285471af

Finish ImportFrom conversion and add a test for it.
author Bastien Orivel <eijebong@bananium.fr>
date Tue, 07 Jun 2016 12:19:10 +0200
parents e244c492ff07
children 38f59b0efc2c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
1 use python_ast::{Module, stmt, expr, boolop, operator, unaryop, cmpop, arguments, arg, keyword, comprehension};
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
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
5 impl boolop {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
6 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
7 match *self {
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
8 boolop::And => " and ",
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
9 boolop::Or => " or "
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
10 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
11 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
12 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
14 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
15 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
16 match *self {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
17 operator::Add => "+",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
18 operator::Sub => "-",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
19 operator::Mult => "*",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
20 operator::MatMult => "@",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
21 operator::Div => "/",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
22 operator::Mod => "%",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
23 operator::Pow => "**",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
24 operator::LShift => "<<",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
25 operator::RShift => ">>",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
26 operator::BitOr => "|",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
27 operator::BitXor => "^",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
28 operator::BitAnd => "&",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
29 operator::FloorDiv => "//",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
30 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
31 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
32 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
33
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
34 impl unaryop {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
35 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
36 match *self {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
37 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
38 unaryop::Not => "not ",
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
39 unaryop::UAdd => "+",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
40 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
41 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
42 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
43 }
ddf372373a77 Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 4
diff changeset
44
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
45 impl cmpop {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 fn to_string(&self) -> &'static str {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 match *self {
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
48 cmpop::Eq => "==",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
49 cmpop::NotEq => "!=",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
50 cmpop::Lt => "<",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
51 cmpop::LtE => "<=",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
52 cmpop::Gt => ">",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
53 cmpop::GtE => ">=",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
54 cmpop::Is => "is",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
55 cmpop::IsNot => "is not",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
56 cmpop::In => "in",
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
57 cmpop::NotIn => "not in",
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
58 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
59 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
60 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
61
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
62 fn args_to_string(args: Vec<expr>) -> String {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
63 let mut arguments = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
64 for arg in args {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
65 arguments.push(arg.to_string());
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
66 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
67 arguments.join(", ")
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
68 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
69
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
70 fn kwargs_to_string(kwargs: Vec<keyword>) -> String {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
71 let mut arguments = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
72 for arg in kwargs {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
73 match arg.arg {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
74 Some(arg) => arguments.push(arg),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
75 None => arguments.push("**kwarg".to_string())
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
76 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
77 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
78 arguments.join(", ")
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
79 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
80
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
81 fn arguments_to_string(args: arguments) -> String {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
82 let mut arguments = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
83 for arg in args.args {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
84 arguments.push(arg.arg);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
85 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
86 arguments.join(", ")
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
87 }
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 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
90 let mut statements = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
91 for statement in body {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
92 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
93 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
94 statements.join("\n")
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
95 }
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 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
98 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
99 if orelse.is_empty() {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
100 body
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
101 } else {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
102 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
103 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
104 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
105
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
106 fn generators_to_string(generators: Vec<comprehension>) -> String {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
107 let mut result = vec!();
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
108 for generator in generators {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
109 result.push(format!("for {} in {}", generator.target.to_string(), generator.iter.to_string()));
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
110 for if_ in generator.ifs {
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
111 result.push(format!("if {}", if_.to_string()))
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
112 }
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
113 }
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
114 result.join(" ")
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
115 }
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
116 impl expr {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
117 fn to_string(&self) -> String {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
118 match self.clone() {
19
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
119 expr::BoolOp(op, values) => {
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
120 let mut data = vec!();
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
121 for value in values {
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
122 data.push(value.to_string());
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
123 }
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
124 data.join(op.to_string())
0cb53a31ac12 Implement ast.BoolOp, and improve its display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 17
diff changeset
125 },
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
126 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
127 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
128
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
129 expr::Compare(left, ops, comparators) => format!("{} {}", left.to_string(), {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
130 let mut arguments = vec!();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
131
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
132 // XXX: wrong order!
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
133 for op in ops {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
134 arguments.push(op.to_string().to_string())
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
135 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
136 for comparator in comparators {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
137 arguments.push(comparator.to_string())
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
138 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
139 /*
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
140 for (op, comparator) in ops.zip(comparators) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
141 let op = op.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
142 let comparator = comparator.unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
143 arguments.push(format!("{} {}", op.to_string(), comparator.to_string()))
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
144 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
145 */
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
146
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
147 arguments.join(" ")
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
148 }),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
149 expr::Call(func, args, keywords) => format!("{}({}{})", func.to_string(), args_to_string(args), kwargs_to_string(keywords)),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
150 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
151 expr::Str(s) => format!("\"{}\"", s),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
152 expr::NameConstant(name) => format!("{}", name),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
153 expr::Attribute(value, attr, ctx) => format!("{}.{}", value.to_string(), attr),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
154 expr::Name(name, ctx) => format!("{}", name),
14
719a27f1c1c7 Add ast.ListComp
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
155 expr::List(elts, ctx) => format!("[{}]", args_to_string(elts)),
16
b21a246349f3 Add ast.DictComp
Bastien Orivel <eijebong@bananium.fr>
parents: 14
diff changeset
156 expr::ListComp(elt, generators) => format!("[{} {}]", elt.to_string(), generators_to_string(generators)),
17
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
157 expr::DictComp(key, value, generators) => format!("{{{}: {} {}}}", key.to_string(), value.to_string(), generators_to_string(generators)),
f1c77634a2eb Add ast.Tuple
Bastien Orivel <eijebong@bananium.fr>
parents: 16
diff changeset
158 expr::Tuple(elts, ctx) => format!("({})", args_to_string(elts))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
159 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
160 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
161 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
162
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
163 impl arguments {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
164 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
165 let mut args = vec!();
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
166 for arg in self.args.clone() {
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
167 args.push(arg.arg);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
168 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
169 args.join(", ")
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
170 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
171 }
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
172
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
173 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
174 iter::repeat(" ").take(indent).collect()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
175 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
176
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
177 impl stmt {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
178 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
179 let current_indent = make_indent(indent);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
180 match self.clone() {
38
e244c492ff07 Add a test for ClassDef and fix ast_dump for smt::ClassDef.
Bastien Orivel <eijebong@bananium.fr>
parents: 28
diff changeset
181 stmt::ClassDef(name, bases, keywords, body, decorator_list) => format!("{}class {}({}):\n{}", current_indent, name, args_to_string(bases), statements_to_string(indent, body)),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
182 stmt::FunctionDef(name, arguments, body, decorator_list, returns) => format!("{}def {}({}):\n{}", current_indent, name, arguments_to_string(arguments), 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
183 stmt::Global(names) => format!("{}global {}", current_indent, names.join(", ")),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
184 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
185 stmt::While(test, body, orelse) => format!("{}while {}:\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
186 stmt::For(target, iter, body, orelse) => format!("{}for {} in {}:\n{}", current_indent, target.to_string(), iter.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
187 stmt::Assign(targets, value) => format!("{}{} = {}", current_indent, args_to_string(targets), value.to_string()),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
188 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
189 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
190 Some(expr) => format!(" {}", expr.to_string()),
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
191 None => "".to_string()
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
192 }),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
193 stmt::ImportFrom(module, names, level) => format!("{}from {} import {}", current_indent, module.to_string(), {
44
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
194 let mut names_ = vec!();
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
195 for name in names {
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
196 match name.asname {
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
197 None => names_.push(name.name),
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
198 Some(asname) => names_.push(format!("{} as {}", name.name, asname))
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
199 }
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
200 }
44
5f1d285471af Finish ImportFrom conversion and add a test for it.
Bastien Orivel <eijebong@bananium.fr>
parents: 38
diff changeset
201 names_.join(", ")
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
202 }),
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
203 stmt::Expr(expr) => format!("{}{}", current_indent, expr.to_string()),
21
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 19
diff changeset
204 stmt::Break => format!("{}break", current_indent),
7af637f444d1 Add ast.Delete
Bastien Orivel <eijebong@bananium.fr>
parents: 19
diff changeset
205 stmt::Delete(targets) => format!("{}del {}", current_indent, args_to_string(targets))
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
206 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
207 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
208 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
209
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
210 #[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
211 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
212 let mut dumped_statements = vec!();
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
213 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
214 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
215 dumped_statements.push(dumped_statement);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
216 }
22
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
217 dumped_statements.join("\n")
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
218 }
22
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 21
diff changeset
219