1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
2pub struct Span {
3 pub line: u32,
4 pub col: u32,
5 pub end_line: u32,
6 pub end_col: u32,
7}
8
9#[derive(Debug, Clone, PartialEq)]
10pub struct Module {
11 pub span: Span,
12 pub body: Vec<Stmt>,
13}
14
15#[derive(Debug, Clone, PartialEq)]
16pub enum Stmt {
17 Assign {
18 span: Span,
19 target: Expr,
20 value: Expr,
21 },
22 ExprStmt {
23 span: Span,
24 value: Expr,
25 },
26 Return {
27 span: Span,
28 value: Option<Expr>,
29 },
30 If {
31 span: Span,
32 test: Expr,
33 body: Vec<Stmt>,
34 orelse: Vec<Stmt>,
35 },
36 While {
37 span: Span,
38 test: Expr,
39 body: Vec<Stmt>,
40 },
41 For {
42 span: Span,
43 target: Expr,
44 iter: Expr,
45 body: Vec<Stmt>,
46 },
47 FunctionDef {
48 span: Span,
49 name: String,
50 args: Vec<String>,
51 body: Vec<Stmt>,
52 },
53 Import {
54 span: Span,
55 module: String,
56 asname: Option<String>,
57 },
58 ImportFrom {
59 span: Span,
60 module: String,
61 name: String,
62 asname: Option<String>,
63 },
64 Break {
65 span: Span,
66 },
67 Continue {
68 span: Span,
69 },
70 Pass {
71 span: Span,
72 },
73 Unsupported {
74 span: Span,
75 reason: String,
76 },
77}
78
79#[derive(Debug, Clone, PartialEq)]
80pub enum Expr {
81 Name {
82 span: Span,
83 id: String,
84 },
85 Number {
86 span: Span,
87 value: f64,
88 },
89 String {
90 span: Span,
91 value: String,
92 },
93 Bool {
94 span: Span,
95 value: bool,
96 },
97 None {
98 span: Span,
99 },
100 List {
101 span: Span,
102 elts: Vec<Expr>,
103 },
104 Dict {
105 span: Span,
106 items: Vec<(Expr, Expr)>,
107 },
108
109 BinOp {
110 span: Span,
111 op: String,
112 left: Box<Expr>,
113 right: Box<Expr>,
114 },
115 UnaryOp {
116 span: Span,
117 op: String,
118 operand: Box<Expr>,
119 },
120 BoolOp {
121 span: Span,
122 op: String,
123 values: Vec<Expr>,
124 },
125 Compare {
126 span: Span,
127 op: String,
128 left: Box<Expr>,
129 right: Box<Expr>,
130 },
131
132 Attribute {
133 span: Span,
134 value: Box<Expr>,
135 attr: String,
136 },
137 Call {
138 span: Span,
139 func: Box<Expr>,
140 args: Vec<Expr>,
141 },
142 Subscript {
143 span: Span,
144 value: Box<Expr>,
145 index: Box<Expr>,
146 },
147
148 Unsupported {
149 span: Span,
150 reason: String,
151 },
152}
153
154impl Expr {
155 pub fn span(&self) -> Span {
156 match self {
157 Expr::Name { span, .. }
158 | Expr::Number { span, .. }
159 | Expr::String { span, .. }
160 | Expr::Bool { span, .. }
161 | Expr::None { span }
162 | Expr::List { span, .. }
163 | Expr::Dict { span, .. }
164 | Expr::BinOp { span, .. }
165 | Expr::UnaryOp { span, .. }
166 | Expr::BoolOp { span, .. }
167 | Expr::Compare { span, .. }
168 | Expr::Attribute { span, .. }
169 | Expr::Call { span, .. }
170 | Expr::Subscript { span, .. }
171 | Expr::Unsupported { span, .. } => *span,
172 }
173 }
174}
175
176impl Stmt {
177 pub fn span(&self) -> Span {
178 match self {
179 Stmt::Assign { span, .. }
180 | Stmt::ExprStmt { span, .. }
181 | Stmt::Return { span, .. }
182 | Stmt::If { span, .. }
183 | Stmt::While { span, .. }
184 | Stmt::For { span, .. }
185 | Stmt::FunctionDef { span, .. }
186 | Stmt::Import { span, .. }
187 | Stmt::ImportFrom { span, .. }
188 | Stmt::Break { span }
189 | Stmt::Continue { span }
190 | Stmt::Pass { span }
191 | Stmt::Unsupported { span, .. } => *span,
192 }
193 }
194}