From e7416fbc1e4cf1c07da912145957dc37aa35b0dc Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 21 Nov 2022 00:07:57 +0100 Subject: [PATCH] Pretty print table destructors --- src/pretty.rs | 1 + src/pretty/expr.rs | 2 +- src/pretty/table_destr.rs | 51 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/pretty/table_destr.rs diff --git a/src/pretty.rs b/src/pretty.rs index 01a0dbb..149eb1c 100644 --- a/src/pretty.rs +++ b/src/pretty.rs @@ -5,6 +5,7 @@ mod field; mod lit; mod program; mod table_constr; +mod table_destr; mod var; const NEST_DEPTH: isize = 4; diff --git a/src/pretty/expr.rs b/src/pretty/expr.rs index 4869084..454651e 100644 --- a/src/pretty/expr.rs +++ b/src/pretty/expr.rs @@ -30,7 +30,7 @@ impl<'a, D: DocAllocator<'a>> Pretty<'a, D> for Expr { Self::Field(field) => field.pretty(allocator), Self::Var(var) => var.pretty(allocator), Self::TableConstr(constr) => constr.pretty(allocator), - Self::TableDestr(destr) => allocator.text(""), + Self::TableDestr(destr) => destr.pretty(allocator), Self::FuncDef(def) => allocator.text(""), Self::Paren { s0, diff --git a/src/pretty/table_destr.rs b/src/pretty/table_destr.rs new file mode 100644 index 0000000..9191121 --- /dev/null +++ b/src/pretty/table_destr.rs @@ -0,0 +1,51 @@ +use pretty::{DocAllocator, DocBuilder, Pretty}; + +use crate::ast::{TableDestr, TablePattern, TablePatternElem}; + +use super::NEST_DEPTH; + +impl<'a, D: DocAllocator<'a>> Pretty<'a, D> for TablePatternElem { + fn pretty(self, allocator: &'a D) -> DocBuilder<'a, D> { + match self { + Self::Positional(ident) => ident.pretty(allocator), + Self::Named { + name, + s0, + s1, + ident, + span: _, + } => name + .pretty(allocator) + .append(allocator.text(": ")) + .append(ident.pretty(allocator)), + } + } +} + +impl<'a, D: DocAllocator<'a>> Pretty<'a, D> for TablePattern { + fn pretty(self, allocator: &'a D) -> DocBuilder<'a, D> { + self.elems + .pretty( + allocator, + |a, e| a.line().append(e.pretty(a)), + |a, (s0, s1)| a.text(","), + |a, s| a.text(","), + ) + .nest(NEST_DEPTH) + .append(allocator.line()) + .braces() + .group() + } +} + +impl<'a, D: DocAllocator<'a>> Pretty<'a, D> for TableDestr { + fn pretty(self, allocator: &'a D) -> DocBuilder<'a, D> { + // TODO Handle spaces + self.local + .map(|s| allocator.text("local ")) + .unwrap_or_else(|| allocator.nil()) + .append(self.pattern.pretty(allocator)) + .append(allocator.text(" = ")) + .append(self.value.pretty(allocator)) + } +}