aether/pytranspile/
ir.rs

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}