Skip to main content

code_gen/statement/
expression_statement.rs

1use crate::{CodeBuffer, Expression, Statement};
2
3/// A statement that wraps an expression.
4pub struct ExpressionStatement<E: Expression> {
5    expression: E,
6}
7
8impl<E: Expression> From<E> for ExpressionStatement<E> {
9    fn from(expression: E) -> Self {
10        Self { expression }
11    }
12}
13
14impl<E: Expression> Statement for ExpressionStatement<E> {
15    fn write(&self, b: &mut CodeBuffer, level: usize) {
16        b.indent(level);
17        self.expression.write(b);
18        b.end_line();
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use super::*;
25    use crate::Literal;
26
27    #[test]
28    fn expression_statement() {
29        let stmt = ExpressionStatement::from(Literal::from("hello"));
30        assert_eq!(stmt.to_code(), "hello\n");
31    }
32
33    #[test]
34    fn expression_statement_indented() {
35        let stmt = ExpressionStatement::from(Literal::from("hello"));
36        let mut b = CodeBuffer::default();
37        stmt.write(&mut b, 1);
38        assert_eq!(b.peek(), "    hello\n");
39    }
40}