oxilean_codegen/js_backend/
jsexpr_traits.rs1use 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}