Mercurial > python-compiler.rs
annotate src/ast_dump.rs @ 3:326d7f2a94d4
Remove useless abstraction of function name as Expr.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Tue, 31 May 2016 02:36:24 +0100 |
parents | 5fc7c2790d8c |
children | f27a4aee9dfa |
rev | line source |
---|---|
0 | 1 use python_ast::{Module, Statement, Expr, BinOp}; |
2 | |
3 use std::iter; | |
4 | |
5 impl BinOp { | |
6 fn to_string(&self) -> &'static str { | |
7 match *self { | |
8 BinOp::BinAdd => "+", | |
9 BinOp::BinMult => "*", | |
10 BinOp::BinEq => "==", | |
11 BinOp::BinLt => "<", | |
12 BinOp::Error => "BinOp::Error" | |
13 } | |
14 } | |
15 } | |
16 | |
17 impl Expr { | |
18 fn to_string(&self) -> String { | |
19 match self.clone() { | |
20 Expr::BinOp(a, op, b) => format!("{} {} {}", a.to_string(), op.to_string(), b.to_string()), | |
21 Expr::Compare(left, ops, comparators) => format!("{} {}", left.to_string(), { | |
22 let mut arguments = vec!(); | |
23 | |
24 // XXX: wrong order! | |
25 for op in ops { | |
26 arguments.push(op.to_string().to_string()) | |
27 } | |
28 for comparator in comparators { | |
29 arguments.push(comparator.to_string()) | |
30 } | |
31 /* | |
32 for (op, comparator) in ops.zip(comparators) { | |
33 let op = op.unwrap(); | |
34 let comparator = comparator.unwrap(); | |
35 arguments.push(format!("{} {}", op.to_string(), comparator.to_string())) | |
36 } | |
37 */ | |
38 | |
39 arguments.join(" ") | |
40 }), | |
41 Expr::Call(func, args) => format!("{}({})", func.to_string(), { | |
42 let mut arguments = vec!(); | |
43 for arg in args { | |
44 arguments.push(arg.to_string()); | |
45 } | |
46 arguments.join(", ") | |
47 }), | |
48 Expr::Alias(name, asname) => { | |
1
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
49 match asname { |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
50 None => format!("{}", name), |
b90e49ab734b
Factorise conversion of Python str into Rust String.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
51 Some(asname) => format!("{} as {}", name, asname) |
0 | 52 } |
53 } | |
54 Expr::Name(name) => format!("{}", name), | |
55 Expr::NameConstant(name) => format!("{}", name), | |
56 Expr::Str(s) => format!("\"{}\"", s), | |
57 Expr::Num(n) => format!("{}", n), | |
58 Expr::Error => "Expr::Error".to_string() | |
59 } | |
60 } | |
61 } | |
62 | |
63 fn make_indent(indent: usize) -> String { | |
64 let indent: String = iter::repeat(" ").take(indent).collect(); | |
65 indent | |
66 } | |
67 | |
68 impl Statement { | |
69 fn to_string(&self, indent: usize) -> String { | |
70 match self.clone() { | |
2
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
71 Statement::ClassDef(name, classes, body) => format!("{}def {}({}):\n{}", make_indent(indent), name, { |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
72 let mut bases = vec!(); |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
73 for class in classes { |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
74 bases.push(class.to_string()); |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
75 } |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
76 bases.join(", ") |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
77 }, { |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
78 let mut statements = vec!(); |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
79 for statement in body { |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
80 statements.push(statement.to_string(indent + 1)); |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
81 } |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
82 statements.join("\n") |
5fc7c2790d8c
Add class support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
83 }), |
3
326d7f2a94d4
Remove useless abstraction of function name as Expr.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
84 Statement::FunctionDef(name, arguments, body) => format!("{}def {}({}):\n{}", make_indent(indent), name, { |
0 | 85 let mut args = vec!(); |
86 for arg in arguments { | |
87 args.push(arg.to_string()); | |
88 } | |
89 args.join(", ") | |
90 }, { | |
91 let mut statements = vec!(); | |
92 for statement in body { | |
93 statements.push(statement.to_string(indent + 1)); | |
94 } | |
95 statements.join("\n") | |
96 }), | |
97 Statement::Global(names) => format!("{}global {}", make_indent(indent), names.join(", ")), | |
98 Statement::If(test, body, orelse) => format!("{}if {}:\n{}", make_indent(indent), test.to_string(), { | |
99 let mut statements = vec!(); | |
100 for arg in body { | |
101 statements.push(arg.to_string(indent + 1)); | |
102 } | |
103 | |
104 let mut orelse_ = vec!(); | |
105 for arg in orelse { | |
106 orelse_.push(arg.to_string(indent + 1)); | |
107 } | |
108 | |
109 if orelse_.is_empty() { | |
110 statements.join("\n") | |
111 } else { | |
112 format!("{}\n{}else:\n{}", statements.join("\n"), make_indent(indent), orelse_.join("\n")) | |
113 } | |
114 }), | |
115 Statement::Assign(targets, value) => format!("{}{} = {}", make_indent(indent), { | |
116 let mut exprs = vec!(); | |
117 for target in targets { | |
118 exprs.push(target.to_string()); | |
119 } | |
120 exprs.join(", ") | |
121 }, value.to_string()), | |
122 Statement::Return(expr) => format!("{}return {}", make_indent(indent), expr.to_string()), | |
123 Statement::ImportFrom(module, names) => format!("{}from {} import {}", make_indent(indent), module.to_string(), { | |
124 let mut exprs = vec!(); | |
125 for alias in names.iter() { | |
126 let alias = alias.to_string(); | |
127 exprs.push(alias); | |
128 } | |
129 exprs.join(", ") | |
130 }), | |
131 Statement::Expr(expr) => format!("{}{}", make_indent(indent), expr.to_string()), | |
132 Statement::Error => format!("{}Statement::Error", make_indent(indent)) | |
133 } | |
134 } | |
135 } | |
136 | |
137 #[allow(dead_code)] | |
138 pub fn dump_ast(ast: &Module) { | |
139 for statement in &ast.statements { | |
140 println!("{}", statement.to_string(0)); | |
141 } | |
142 } |