diff --git a/crates/oxc_prettier/src/doc.rs b/crates/oxc_prettier/src/doc.rs index b9c91e184..87fa12d24 100644 --- a/crates/oxc_prettier/src/doc.rs +++ b/crates/oxc_prettier/src/doc.rs @@ -3,7 +3,7 @@ //! References: //! * -use oxc_allocator::{String, Vec}; +use oxc_allocator::{Box, String, Vec}; use crate::Prettier; @@ -31,11 +31,9 @@ pub enum Doc<'a> { /// no matter if the expression fits on one line or not. Hardline, /// Print something if the current `group` or the current element of `fill` breaks and something else if it doesn't. - IfBreak(Box>), + IfBreak(Box<'a, Doc<'a>>), } -impl<'a> Doc<'a> {} - #[derive(Clone, Copy)] #[allow(unused)] pub enum Separator { @@ -55,6 +53,11 @@ impl<'a> Prettier<'a> { Doc::Str(String::from_str_in(s, self.allocator).into_bump_str()) } + #[inline] + pub(crate) fn alloc(&self, doc: Doc<'a>) -> Box<'a, Doc<'a>> { + Box(self.allocator.alloc(doc)) + } + #[allow(unused)] pub(crate) fn join(&self, separator: Separator, docs: std::vec::Vec>) -> Doc<'a> { let mut parts = self.vec(); diff --git a/crates/oxc_prettier/src/format/mod.rs b/crates/oxc_prettier/src/format/mod.rs index f3c5f887a..67cc5203c 100644 --- a/crates/oxc_prettier/src/format/mod.rs +++ b/crates/oxc_prettier/src/format/mod.rs @@ -256,10 +256,10 @@ impl<'a> Format<'a> for ReturnStatement<'a> { parts.push(ss!(" ")); parts.push(group![ p, - if_break!("("), + if_break!(p, "("), indent!(p, softline!(), format!(p, argument)), softline!(), - if_break!(")") + if_break!(p, ")") ]); } parts.push(p.str(";")); @@ -792,7 +792,7 @@ impl<'a> Format<'a> for ArrayExpression<'a> { parts_inner.push(format!(p, element)); } - parts_inner.push(if_break!(",")); + parts_inner.push(if_break!(p, ",")); parts.push(group!(p, Doc::Indent(parts_inner))); diff --git a/crates/oxc_prettier/src/macros.rs b/crates/oxc_prettier/src/macros.rs index 2a510b4ec..6c70b8740 100644 --- a/crates/oxc_prettier/src/macros.rs +++ b/crates/oxc_prettier/src/macros.rs @@ -84,7 +84,7 @@ macro_rules! group { #[macro_export] macro_rules! if_break { - ($s:expr) => {{ - Doc::IfBreak(std::boxed::Box::new(Doc::Str($s))) + ($p:ident, $s:expr) => {{ + Doc::IfBreak($p.alloc(Doc::Str($s))) }}; } diff --git a/crates/oxc_prettier/src/printer/mod.rs b/crates/oxc_prettier/src/printer/mod.rs index 648c8be86..7d0f584dd 100644 --- a/crates/oxc_prettier/src/printer/mod.rs +++ b/crates/oxc_prettier/src/printer/mod.rs @@ -52,7 +52,7 @@ impl<'a> Printer<'a> { Doc::Line => self.handle_line(indent, mode), Doc::Softline => self.handle_softline(indent, mode), Doc::Hardline => self.handle_hardline(indent), - Doc::IfBreak(if_break) => self.handle_if_break(*if_break, indent, mode), + Doc::IfBreak(doc) => self.handle_if_break(doc.unbox(), indent, mode), } } }