1pub type JuliaAst = ModuleNode;
3
4#[derive(Debug, Clone, PartialEq)]
6pub struct ModuleNode {
7 pub statements: Vec<StmtKind>,
8}
9
10#[derive(Debug, Clone, PartialEq)]
12pub enum StmtKind {
13 FunctionDef(FunctionDefNode),
15 AsyncFunctionDef(AsyncFunctionDefNode),
17 ClassDef(ClassDefNode),
19 Return(Option<Box<ExprKind>>),
21 Delete(Vec<ExprKind>),
23 Assign(AssignNode),
25 AugAssign(AugAssignNode),
27 AnnAssign(AnnAssignNode),
29 For(ForNode),
31 AsyncFor(AsyncForNode),
33 While(WhileNode),
35 If(IfNode),
37 With(WithNode),
39 AsyncWith(AsyncWithNode),
41 Raise(RaiseNode),
43 Try(TryNode),
45 Assert(AssertNode),
47 Import(ImportNode),
49 ImportFrom(ImportFromNode),
51 Global(Vec<String>),
53 Nonlocal(Vec<String>),
55 Expr(ExprKind),
57 Pass,
59 Break,
61 Continue,
63}
64
65#[derive(Debug, Clone, PartialEq)]
67pub enum ExprKind {
68 BoolOp(BoolOpNode),
70 NamedExpr(NamedExprNode),
72 BinOp(BinOpNode),
74 UnaryOp(UnaryOpNode),
76 Lambda(LambdaNode),
78 IfExp(IfExpNode),
80 Dict(DictNode),
82 Set(SetNode),
84 ListComp(ListCompNode),
86 SetComp(SetCompNode),
88 DictComp(DictCompNode),
90 GeneratorExp(GeneratorExpNode),
92 Await(Box<ExprKind>),
94 Yield(Option<Box<ExprKind>>),
96 YieldFrom(Box<ExprKind>),
98 Compare(CompareNode),
100 Call(CallNode),
102 FormattedValue(FormattedValueNode),
104 JoinedStr(Vec<ExprKind>),
106 Constant(ConstantNode),
108 Attribute(AttributeNode),
110 Subscript(SubscriptNode),
112 Starred(Box<ExprKind>),
114 Name(NameNode),
116 List(ListNode),
118 Tuple(TupleNode),
120 Slice(SliceNode),
122}
123
124#[derive(Debug, Clone, PartialEq)]
126pub struct FunctionDefNode {
127 pub name: String,
128 pub args: ArgumentsNode,
129 pub body: Vec<StmtKind>,
130 pub decorator_list: Vec<ExprKind>,
131 pub returns: Option<Box<ExprKind>>,
132 pub type_comment: Option<String>,
133}
134
135#[derive(Debug, Clone, PartialEq)]
137pub struct AsyncFunctionDefNode {
138 pub name: String,
139 pub args: ArgumentsNode,
140 pub body: Vec<StmtKind>,
141 pub decorator_list: Vec<ExprKind>,
142 pub returns: Option<Box<ExprKind>>,
143 pub type_comment: Option<String>,
144}
145
146#[derive(Debug, Clone, PartialEq)]
148pub struct ClassDefNode {
149 pub name: String,
150 pub bases: Vec<ExprKind>,
151 pub keywords: Vec<KeywordNode>,
152 pub body: Vec<StmtKind>,
153 pub decorator_list: Vec<ExprKind>,
154}
155
156#[derive(Debug, Clone, PartialEq)]
158pub struct ArgumentsNode {
159 pub posonlyargs: Vec<ArgNode>,
160 pub args: Vec<ArgNode>,
161 pub vararg: Option<ArgNode>,
162 pub kwonlyargs: Vec<ArgNode>,
163 pub kw_defaults: Vec<Option<ExprKind>>,
164 pub kwarg: Option<ArgNode>,
165 pub defaults: Vec<ExprKind>,
166}
167
168#[derive(Debug, Clone, PartialEq)]
170pub struct ArgNode {
171 pub arg: String,
172 pub annotation: Option<Box<ExprKind>>,
173 pub type_comment: Option<String>,
174}
175
176#[derive(Debug, Clone, PartialEq)]
178pub struct KeywordNode {
179 pub arg: Option<String>,
180 pub value: ExprKind,
181}
182
183#[derive(Debug, Clone, PartialEq)]
185pub struct AssignNode {
186 pub targets: Vec<ExprKind>,
187 pub value: ExprKind,
188 pub type_comment: Option<String>,
189}
190
191#[derive(Debug, Clone, PartialEq)]
193pub struct AugAssignNode {
194 pub target: ExprKind,
195 pub op: BinaryOperator,
196 pub value: ExprKind,
197}
198
199#[derive(Debug, Clone, PartialEq)]
201pub struct AnnAssignNode {
202 pub target: ExprKind,
203 pub annotation: ExprKind,
204 pub value: Option<Box<ExprKind>>,
205 pub simple: bool,
206}
207
208#[derive(Debug, Clone, PartialEq)]
210pub struct ForNode {
211 pub target: ExprKind,
212 pub iter: ExprKind,
213 pub body: Vec<StmtKind>,
214 pub orelse: Vec<StmtKind>,
215 pub type_comment: Option<String>,
216}
217
218#[derive(Debug, Clone, PartialEq)]
220pub struct AsyncForNode {
221 pub target: ExprKind,
222 pub iter: ExprKind,
223 pub body: Vec<StmtKind>,
224 pub orelse: Vec<StmtKind>,
225 pub type_comment: Option<String>,
226}
227
228#[derive(Debug, Clone, PartialEq)]
230pub struct WhileNode {
231 pub test: ExprKind,
232 pub body: Vec<StmtKind>,
233 pub orelse: Vec<StmtKind>,
234}
235
236#[derive(Debug, Clone, PartialEq)]
238pub struct IfNode {
239 pub test: ExprKind,
240 pub body: Vec<StmtKind>,
241 pub orelse: Vec<StmtKind>,
242}
243
244#[derive(Debug, Clone, PartialEq)]
246pub struct WithNode {
247 pub items: Vec<WithItemNode>,
248 pub body: Vec<StmtKind>,
249 pub type_comment: Option<String>,
250}
251
252#[derive(Debug, Clone, PartialEq)]
254pub struct AsyncWithNode {
255 pub items: Vec<WithItemNode>,
256 pub body: Vec<StmtKind>,
257 pub type_comment: Option<String>,
258}
259
260#[derive(Debug, Clone, PartialEq)]
262pub struct WithItemNode {
263 pub context_expr: ExprKind,
264 pub optional_vars: Option<Box<ExprKind>>,
265}
266
267#[derive(Debug, Clone, PartialEq)]
269pub struct RaiseNode {
270 pub exc: Option<Box<ExprKind>>,
271 pub cause: Option<Box<ExprKind>>,
272}
273
274#[derive(Debug, Clone, PartialEq)]
276pub struct TryNode {
277 pub body: Vec<StmtKind>,
278 pub handlers: Vec<ExceptHandlerNode>,
279 pub orelse: Vec<StmtKind>,
280 pub finalbody: Vec<StmtKind>,
281}
282
283#[derive(Debug, Clone, PartialEq)]
285pub struct ExceptHandlerNode {
286 pub type_: Option<Box<ExprKind>>,
287 pub name: Option<String>,
288 pub body: Vec<StmtKind>,
289}
290
291#[derive(Debug, Clone, PartialEq)]
293pub struct AssertNode {
294 pub test: ExprKind,
295 pub msg: Option<Box<ExprKind>>,
296}
297
298#[derive(Debug, Clone, PartialEq)]
300pub struct ImportNode {
301 pub names: Vec<AliasNode>,
302}
303
304#[derive(Debug, Clone, PartialEq)]
306pub struct ImportFromNode {
307 pub module: Option<String>,
308 pub names: Vec<AliasNode>,
309 pub level: Option<i32>,
310}
311
312#[derive(Debug, Clone, PartialEq)]
314pub struct AliasNode {
315 pub name: String,
316 pub asname: Option<String>,
317}
318
319#[derive(Debug, Clone, PartialEq)]
321pub struct BoolOpNode {
322 pub op: BooleanOperator,
323 pub values: Vec<ExprKind>,
324}
325
326#[derive(Debug, Clone, PartialEq)]
328pub struct NamedExprNode {
329 pub target: Box<ExprKind>,
330 pub value: Box<ExprKind>,
331}
332
333#[derive(Debug, Clone, PartialEq)]
335pub struct BinOpNode {
336 pub left: Box<ExprKind>,
337 pub op: BinaryOperator,
338 pub right: Box<ExprKind>,
339}
340
341#[derive(Debug, Clone, PartialEq)]
343pub struct UnaryOpNode {
344 pub op: UnaryOperator,
345 pub operand: Box<ExprKind>,
346}
347
348#[derive(Debug, Clone, PartialEq)]
350pub struct LambdaNode {
351 pub args: ArgumentsNode,
352 pub body: Box<ExprKind>,
353}
354
355#[derive(Debug, Clone, PartialEq)]
357pub struct IfExpNode {
358 pub test: Box<ExprKind>,
359 pub body: Box<ExprKind>,
360 pub orelse: Box<ExprKind>,
361}
362
363#[derive(Debug, Clone, PartialEq)]
365pub struct DictNode {
366 pub keys: Vec<Option<ExprKind>>,
367 pub values: Vec<ExprKind>,
368}
369
370#[derive(Debug, Clone, PartialEq)]
372pub struct SetNode {
373 pub elts: Vec<ExprKind>,
374}
375
376#[derive(Debug, Clone, PartialEq)]
378pub struct ListCompNode {
379 pub elt: Box<ExprKind>,
380 pub generators: Vec<ComprehensionNode>,
381}
382
383#[derive(Debug, Clone, PartialEq)]
385pub struct SetCompNode {
386 pub elt: Box<ExprKind>,
387 pub generators: Vec<ComprehensionNode>,
388}
389
390#[derive(Debug, Clone, PartialEq)]
392pub struct DictCompNode {
393 pub key: Box<ExprKind>,
394 pub value: Box<ExprKind>,
395 pub generators: Vec<ComprehensionNode>,
396}
397
398#[derive(Debug, Clone, PartialEq)]
400pub struct GeneratorExpNode {
401 pub elt: Box<ExprKind>,
402 pub generators: Vec<ComprehensionNode>,
403}
404
405#[derive(Debug, Clone, PartialEq)]
407pub struct ComprehensionNode {
408 pub target: ExprKind,
409 pub iter: ExprKind,
410 pub ifs: Vec<ExprKind>,
411 pub is_async: bool,
412}
413
414#[derive(Debug, Clone, PartialEq)]
416pub struct CompareNode {
417 pub left: Box<ExprKind>,
418 pub ops: Vec<ComparisonOperator>,
419 pub comparators: Vec<ExprKind>,
420}
421
422#[derive(Debug, Clone, PartialEq)]
424pub struct CallNode {
425 pub func: Box<ExprKind>,
426 pub args: Vec<ExprKind>,
427 pub keywords: Vec<KeywordNode>,
428}
429
430#[derive(Debug, Clone, PartialEq)]
432pub struct FormattedValueNode {
433 pub value: Box<ExprKind>,
434 pub conversion: Option<i32>,
435 pub format_spec: Option<Box<ExprKind>>,
436}
437
438#[derive(Debug, Clone, PartialEq)]
440pub struct ConstantNode {
441 pub value: ConstantValue,
442 pub kind: Option<String>,
443}
444
445#[derive(Debug, Clone, PartialEq)]
447pub enum ConstantValue {
448 None,
449 Bool(bool),
450 Int(i64),
451 Float(f64),
452 Complex { real: f64, imag: f64 },
453 Str(String),
454 Bytes(Vec<u8>),
455 Ellipsis,
456}
457
458#[derive(Debug, Clone, PartialEq)]
460pub struct AttributeNode {
461 pub value: Box<ExprKind>,
462 pub attr: String,
463}
464
465#[derive(Debug, Clone, PartialEq)]
467pub struct SubscriptNode {
468 pub value: Box<ExprKind>,
469 pub slice: Box<ExprKind>,
470}
471
472#[derive(Debug, Clone, PartialEq)]
474pub struct NameNode {
475 pub id: String,
476}
477
478#[derive(Debug, Clone, PartialEq)]
480pub struct ListNode {
481 pub elts: Vec<ExprKind>,
482}
483
484#[derive(Debug, Clone, PartialEq)]
486pub struct TupleNode {
487 pub elts: Vec<ExprKind>,
488}
489
490#[derive(Debug, Clone, PartialEq)]
492pub struct SliceNode {
493 pub lower: Option<Box<ExprKind>>,
494 pub upper: Option<Box<ExprKind>>,
495 pub step: Option<Box<ExprKind>>,
496}
497
498#[derive(Debug, Clone, PartialEq)]
500pub enum BooleanOperator {
501 And,
502 Or,
503}
504
505#[derive(Debug, Clone, PartialEq)]
507pub enum BinaryOperator {
508 Add,
509 Sub,
510 Mult,
511 MatMult,
512 Div,
513 Mod,
514 Pow,
515 LShift,
516 RShift,
517 BitOr,
518 BitXor,
519 BitAnd,
520 FloorDiv,
521}
522
523#[derive(Debug, Clone, PartialEq)]
525pub enum UnaryOperator {
526 Invert,
527 Not,
528 UAdd,
529 USub,
530}
531
532#[derive(Debug, Clone, PartialEq)]
534pub enum ComparisonOperator {
535 Eq,
536 NotEq,
537 Lt,
538 LtE,
539 Gt,
540 GtE,
541 Is,
542 IsNot,
543 In,
544 NotIn,
545}
546
547impl ModuleNode {
549 pub fn kind(&self) -> &'static str {
550 "Module"
551 }
552}
553
554pub trait JuliaAstVisitor {
556 fn visit_module(&mut self, node: &ModuleNode);
557 fn visit_stmt(&mut self, stmt: &StmtKind);
558 fn visit_expr(&mut self, expr: &ExprKind);
559 fn visit_function_def(&mut self, node: &FunctionDefNode);
560 fn visit_class_def(&mut self, node: &ClassDefNode);
561 fn visit_call(&mut self, node: &CallNode);
562 fn visit_name(&mut self, node: &NameNode);
563 fn visit_constant(&mut self, node: &ConstantNode);
564}