Skip to main content

oxilean_codegen/js_backend/
jsexpr_traits.rs

1//! # JsExpr - Trait Implementations
2//!
3//! This module contains trait implementations for `JsExpr`.
4//!
5//! ## Implemented Traits
6//!
7//! - `Display`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11use crate::lcnf::*;
12
13use super::functions::*;
14use super::types::{JsExpr, JsStmt};
15use std::fmt;
16
17impl fmt::Display for JsExpr {
18    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19        match self {
20            JsExpr::Lit(lit) => write!(f, "{}", lit),
21            JsExpr::Var(name) => write!(f, "{}", name),
22            JsExpr::Call(func, args) => {
23                write!(f, "{}(", func)?;
24                for (i, a) in args.iter().enumerate() {
25                    if i > 0 {
26                        write!(f, ", ")?;
27                    }
28                    write!(f, "{}", a)?;
29                }
30                write!(f, ")")
31            }
32            JsExpr::Method(obj, method, args) => {
33                write!(f, "{}.{}(", obj, method)?;
34                for (i, a) in args.iter().enumerate() {
35                    if i > 0 {
36                        write!(f, ", ")?;
37                    }
38                    write!(f, "{}", a)?;
39                }
40                write!(f, ")")
41            }
42            JsExpr::Field(obj, field) => write!(f, "{}.{}", obj, field),
43            JsExpr::Index(arr, idx) => write!(f, "{}[{}]", arr, idx),
44            JsExpr::Arrow(params, body) => {
45                write!(f, "(")?;
46                for (i, p) in params.iter().enumerate() {
47                    if i > 0 {
48                        write!(f, ", ")?;
49                    }
50                    write!(f, "{}", p)?;
51                }
52                write!(f, ") => ")?;
53                match body.as_ref() {
54                    JsStmt::Block(stmts) => {
55                        write!(f, "{{")?;
56                        let inner = display_indented(stmts, 2);
57                        if !inner.is_empty() {
58                            write!(f, "\n{}\n}}", inner)?;
59                        } else {
60                            write!(f, "}}")?;
61                        }
62                    }
63                    other => write!(f, "{}", other)?,
64                }
65                Ok(())
66            }
67            JsExpr::Ternary(cond, then_e, else_e) => {
68                write!(f, "({}) ? ({}) : ({})", cond, then_e, else_e)
69            }
70            JsExpr::BinOp(op, lhs, rhs) => write!(f, "{} {} {}", lhs, op, rhs),
71            JsExpr::UnOp(op, expr) => write!(f, "{}{}", op, expr),
72            JsExpr::Await(expr) => write!(f, "await {}", expr),
73            JsExpr::New(ctor, args) => {
74                write!(f, "new {}(", ctor)?;
75                for (i, a) in args.iter().enumerate() {
76                    if i > 0 {
77                        write!(f, ", ")?;
78                    }
79                    write!(f, "{}", a)?;
80                }
81                write!(f, ")")
82            }
83            JsExpr::Spread(expr) => write!(f, "...{}", expr),
84            JsExpr::Object(fields) => {
85                write!(f, "{{")?;
86                for (i, (k, v)) in fields.iter().enumerate() {
87                    if i > 0 {
88                        write!(f, ", ")?;
89                    }
90                    write!(f, "{}: {}", k, v)?;
91                }
92                write!(f, "}}")
93            }
94            JsExpr::Array(elems) => {
95                write!(f, "[")?;
96                for (i, e) in elems.iter().enumerate() {
97                    if i > 0 {
98                        write!(f, ", ")?;
99                    }
100                    write!(f, "{}", e)?;
101                }
102                write!(f, "]")
103            }
104        }
105    }
106}