From 232b93ba416ff6d69cc68f142704b1733ed4fb03 Mon Sep 17 00:00:00 2001 From: Cameron Date: Tue, 14 Nov 2023 01:45:26 +0000 Subject: [PATCH] feat(printer) Print `ArrayExpression` (#1279) --- crates/oxc_prettier/src/doc.rs | 1 + crates/oxc_prettier/src/format.rs | 36 ++++++++++++++++++++++++++++-- crates/oxc_prettier/src/printer.rs | 3 +++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/crates/oxc_prettier/src/doc.rs b/crates/oxc_prettier/src/doc.rs index 2bbd3b647..0ad2f4193 100644 --- a/crates/oxc_prettier/src/doc.rs +++ b/crates/oxc_prettier/src/doc.rs @@ -19,6 +19,7 @@ pub enum Doc<'a> { Line, Softline, Hardline, + IfBreak(Vec<'a, Doc<'a>>, Vec<'a, Doc<'a>>), } /// Doc Builder diff --git a/crates/oxc_prettier/src/format.rs b/crates/oxc_prettier/src/format.rs index 69c8573f2..d4b07cabe 100644 --- a/crates/oxc_prettier/src/format.rs +++ b/crates/oxc_prettier/src/format.rs @@ -601,7 +601,11 @@ impl<'a> Format<'a> for Argument<'a> { impl<'a> Format<'a> for ArrayExpressionElement<'a> { fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> { - Doc::Line + match self { + Self::SpreadElement(expr) => expr.format(p), + Self::Expression(expr) => expr.format(p), + Self::Elision(elision) => Doc::Str(""), + } } } @@ -613,7 +617,35 @@ impl<'a> Format<'a> for SpreadElement<'a> { impl<'a> Format<'a> for ArrayExpression<'a> { fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> { - Doc::Line + if self.elements.len() == 0 { + return p.str("[]"); + } + + let mut parts = p.vec(); + parts.push(p.str("[")); + + let mut parts_inner = p.vec(); + parts_inner.push(Doc::Softline); + + for (i, element) in self.elements.iter().enumerate() { + if i > 0 { + parts_inner.push(string!(p, ",")); + parts_inner.push(Doc::Softline); + } + parts_inner.push(format!(p, element)); + } + + let mut if_break_comma = p.vec(); + if_break_comma.push(Doc::Str(",")); + + parts_inner.push(Doc::IfBreak(if_break_comma, p.vec())); + + parts.push(group!(p, Doc::Indent(parts_inner))); + + parts.push(Doc::Softline); + parts.push(p.str("]")); + + Doc::Group(parts) } } diff --git a/crates/oxc_prettier/src/printer.rs b/crates/oxc_prettier/src/printer.rs index abc722867..6f684fd33 100644 --- a/crates/oxc_prettier/src/printer.rs +++ b/crates/oxc_prettier/src/printer.rs @@ -77,6 +77,9 @@ impl<'a> Printer<'a> { Doc::Line | Doc::Softline | Doc::Hardline => { out.push(b'\n'); } + Doc::IfBreak(docs, _) => { + cmds.extend(docs.into_iter().rev().map(|doc| Command::new(indent, mode, doc))); + } } }