Skip to main content

oxilean_codegen/lua_backend/
luaexpr_traits.rs

1//! # LuaExpr - Trait Implementations
2//!
3//! This module contains trait implementations for `LuaExpr`.
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::types::LuaExpr;
14use std::fmt;
15
16impl fmt::Display for LuaExpr {
17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18        match self {
19            LuaExpr::Nil => write!(f, "nil"),
20            LuaExpr::True => write!(f, "true"),
21            LuaExpr::False => write!(f, "false"),
22            LuaExpr::Int(n) => write!(f, "{}", n),
23            LuaExpr::Float(v) => {
24                if v.fract() == 0.0 && v.is_finite() {
25                    write!(f, "{}.0", *v as i64)
26                } else {
27                    write!(f, "{}", v)
28                }
29            }
30            LuaExpr::Str(s) => {
31                write!(f, "\"")?;
32                for c in s.chars() {
33                    match c {
34                        '"' => write!(f, "\\\"")?,
35                        '\\' => write!(f, "\\\\")?,
36                        '\n' => write!(f, "\\n")?,
37                        '\r' => write!(f, "\\r")?,
38                        '\t' => write!(f, "\\t")?,
39                        c => write!(f, "{}", c)?,
40                    }
41                }
42                write!(f, "\"")
43            }
44            LuaExpr::Var(name) => write!(f, "{}", name),
45            LuaExpr::BinOp { op, lhs, rhs } => write!(f, "({} {} {})", lhs, op, rhs),
46            LuaExpr::UnaryOp { op, operand } => write!(f, "({} {})", op, operand),
47            LuaExpr::Call { func, args } => {
48                write!(f, "{}(", func)?;
49                for (i, a) in args.iter().enumerate() {
50                    if i > 0 {
51                        write!(f, ", ")?;
52                    }
53                    write!(f, "{}", a)?;
54                }
55                write!(f, ")")
56            }
57            LuaExpr::MethodCall { obj, method, args } => {
58                write!(f, "{}:{}(", obj, method)?;
59                for (i, a) in args.iter().enumerate() {
60                    if i > 0 {
61                        write!(f, ", ")?;
62                    }
63                    write!(f, "{}", a)?;
64                }
65                write!(f, ")")
66            }
67            LuaExpr::TableConstructor(fields) => {
68                write!(f, "{{")?;
69                for (i, field) in fields.iter().enumerate() {
70                    if i > 0 {
71                        write!(f, ", ")?;
72                    }
73                    write!(f, "{}", field)?;
74                }
75                write!(f, "}}")
76            }
77            LuaExpr::IndexAccess { table, key } => write!(f, "{}[{}]", table, key),
78            LuaExpr::FieldAccess { table, field } => write!(f, "{}.{}", table, field),
79            LuaExpr::Lambda {
80                params,
81                vararg,
82                body,
83            } => {
84                write!(f, "function(")?;
85                for (i, p) in params.iter().enumerate() {
86                    if i > 0 {
87                        write!(f, ", ")?;
88                    }
89                    write!(f, "{}", p)?;
90                }
91                if *vararg {
92                    if !params.is_empty() {
93                        write!(f, ", ")?;
94                    }
95                    write!(f, "...")?;
96                }
97                writeln!(f, ")")?;
98                for stmt in body {
99                    writeln!(f, "  {}", stmt)?;
100                }
101                write!(f, "end")
102            }
103            LuaExpr::Ellipsis => write!(f, "..."),
104        }
105    }
106}