oxilean_codegen/lua_backend/
luaexpr_traits.rs1use 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}