Skip to content

Commit

Permalink
refactor(prettier): Verify printing array
Browse files Browse the repository at this point in the history
  • Loading branch information
leaysgur committed Jan 28, 2025
1 parent 003c190 commit 4dd2fb6
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 59 deletions.
24 changes: 11 additions & 13 deletions crates/oxc_prettier/src/format/js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -949,17 +949,14 @@ impl<'a> Format<'a> for ArrayExpressionElement<'a> {

impl<'a> Format<'a> for SpreadElement<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
wrap!(p, self, SpreadElement, {
let argument_doc = self.argument.format(p);
array!(p, [text!("..."), argument_doc])
})
wrap!(p, self, SpreadElement, { array!(p, [text!("..."), self.argument.format(p)]) })
}
}

impl<'a> Format<'a> for ArrayExpression<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
wrap!(p, self, ArrayExpression, {
array::print_array(p, &array::Array::ArrayExpression(self))
array::print_array(p, &array::ArrayLike::ArrayExpression(self))
})
}
}
Expand Down Expand Up @@ -1190,7 +1187,7 @@ impl<'a> Format<'a> for AssignmentTargetPattern<'a> {

impl<'a> Format<'a> for ArrayAssignmentTarget<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
array::print_array(p, &array::Array::ArrayAssignmentTarget(self))
array::print_array(p, &array::ArrayLike::ArrayAssignmentTarget(self))
}
}

Expand Down Expand Up @@ -1261,8 +1258,7 @@ impl<'a> Format<'a> for AssignmentTargetPropertyProperty<'a> {

impl<'a> Format<'a> for AssignmentTargetRest<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
let target_doc = self.target.format(p);
array!(p, [text!("..."), target_doc])
array!(p, [text!("..."), self.target.format(p)])
}
}

Expand Down Expand Up @@ -1444,6 +1440,7 @@ impl<'a> Format<'a> for PrivateIdentifier<'a> {
impl<'a> Format<'a> for BindingPattern<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
let mut parts = Vec::new_in(p.allocator);

parts.push(match &self.kind {
BindingPatternKind::BindingIdentifier(ident) => ident.format(p),
BindingPatternKind::ObjectPattern(pattern) => pattern.format(p),
Expand All @@ -1456,9 +1453,9 @@ impl<'a> Format<'a> for BindingPattern<'a> {
}

if let Some(typ) = &self.type_annotation {
let type_annotation_doc = typ.type_annotation.format(p);
parts.push(array!(p, [text!(": "), type_annotation_doc]));
parts.push(array!(p, [text!(": "), typ.type_annotation.format(p)]));
}

array!(p, parts)
}
}
Expand Down Expand Up @@ -1494,14 +1491,15 @@ impl<'a> Format<'a> for BindingProperty<'a> {

impl<'a> Format<'a> for BindingRestElement<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
let argument_doc = self.argument.format(p);
array!(p, [text!("..."), argument_doc])
wrap!(p, self, BindingRestElement, { array!(p, [text!("..."), self.argument.format(p)]) })
}
}

impl<'a> Format<'a> for ArrayPattern<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
wrap!(p, self, ArrayPattern, { array::print_array(p, &array::Array::ArrayPattern(self)) })
wrap!(p, self, ArrayPattern, {
array::print_array(p, &array::ArrayLike::ArrayPattern(self))
})
}
}

Expand Down
61 changes: 21 additions & 40 deletions crates/oxc_prettier/src/format/print/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,17 @@ use oxc_span::{GetSpan, Span};
use oxc_syntax::operator::UnaryOperator;

use crate::{
array,
comments::{CommentFlags, DanglingCommentsPrintOptions},
fill, group, hardline, if_break, indent,
ir::Doc,
line, softline, text, Format, Prettier,
array, fill, group, hardline, if_break, indent, ir::Doc, line, softline, text, Format, Prettier,
};

// TODO: Rename `ArrayLike`
#[allow(clippy::enum_variant_names)]
pub enum Array<'a, 'b> {
pub enum ArrayLike<'a, 'b> {
ArrayExpression(&'b ArrayExpression<'a>),
TSTupleType(&'b TSTupleType<'a>),
ArrayPattern(&'b ArrayPattern<'a>),
ArrayAssignmentTarget(&'b ArrayAssignmentTarget<'a>),
}

impl Array<'_, '_> {
impl ArrayLike<'_, '_> {
fn len(&self) -> usize {
match self {
Self::ArrayExpression(array) => array.elements.len(),
Expand Down Expand Up @@ -62,13 +56,13 @@ impl Array<'_, '_> {
}
}

pub fn print_array<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a> {
pub fn print_array<'a>(p: &mut Prettier<'a>, arr: &ArrayLike<'a, '_>) -> Doc<'a> {
if arr.len() == 0 {
return print_empty_array_elements(p, arr);
return text!("[]");
}

let (needs_forced_trailing_comma, can_have_trailing_comma) =
if let Array::ArrayExpression(arr) = arr {
if let ArrayLike::ArrayExpression(arr) = arr {
arr.elements.last().map_or((false, false), |last| {
(
matches!(last, ArrayExpressionElement::Elision(_)),
Expand Down Expand Up @@ -111,9 +105,6 @@ pub fn print_array<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a> {
let elements = print_array_elements(p, arr);
array!(p, [elements, trailing_comma])
});
if let Some(dangling_comments) = p.print_dangling_comments(arr.span(), None) {
indent_parts.push(dangling_comments);
};
indent_parts
};

Expand All @@ -130,23 +121,17 @@ pub fn print_array<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a> {

pub fn is_concisely_printed_array(arr: &Expression) -> bool {
match arr {
Expression::ArrayExpression(array) => Array::ArrayExpression(array).is_concisely_printed(),
Expression::ArrayExpression(array) => {
ArrayLike::ArrayExpression(array).is_concisely_printed()
}
_ => false,
}
}

fn print_empty_array_elements<'a>(p: &mut Prettier<'a>, array: &Array<'a, '_>) -> Doc<'a> {
let dangling_options = DanglingCommentsPrintOptions::default().with_ident(true);
p.print_dangling_comments(array.span(), Some(&dangling_options)).map_or_else(
|| text!("[]"),
|dangling_comments| group!(p, [text!("["), dangling_comments, softline!(), text!("]")]),
)
}

fn print_array_elements<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a> {
fn print_array_elements<'a>(p: &mut Prettier<'a>, arr: &ArrayLike<'a, '_>) -> Doc<'a> {
let mut parts = Vec::new_in(p.allocator);
match arr {
Array::ArrayExpression(array) => {
ArrayLike::ArrayExpression(array) => {
for (i, element) in array.elements.iter().enumerate() {
parts.push(element.format(p));
let is_last = i == array.elements.len() - 1;
Expand All @@ -159,7 +144,7 @@ fn print_array_elements<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a
}
}
}
Array::TSTupleType(tuple) => {
ArrayLike::TSTupleType(tuple) => {
for (i, element) in tuple.element_types.iter().enumerate() {
if i > 0 && i < tuple.element_types.len() {
parts.push(text!(","));
Expand All @@ -169,7 +154,7 @@ fn print_array_elements<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a
parts.push(element.format(p));
}
}
Array::ArrayPattern(array_pat) => {
ArrayLike::ArrayPattern(array_pat) => {
let len = array_pat.elements.len();
let has_rest = array_pat.rest.is_some();
for (i, element) in array_pat.elements.iter().enumerate() {
Expand All @@ -188,7 +173,7 @@ fn print_array_elements<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a
parts.push(group!(p, [rest_doc]));
}
}
Array::ArrayAssignmentTarget(array_pat) => {
ArrayLike::ArrayAssignmentTarget(array_pat) => {
for (i, element) in array_pat.elements.iter().enumerate() {
if i > 0 && i < array_pat.elements.len() {
parts.push(text!(","));
Expand All @@ -213,14 +198,14 @@ fn print_array_elements<'a>(p: &mut Prettier<'a>, arr: &Array<'a, '_>) -> Doc<'a

fn print_array_elements_concisely<'a, F>(
p: &mut Prettier<'a>,
arr: &Array<'a, '_>,
arr: &ArrayLike<'a, '_>,
trailing_comma_fn: F,
) -> Doc<'a>
where
F: Fn(&Prettier<'a>) -> Doc<'a>,
{
let mut parts = Vec::new_in(p.allocator);
if let Array::ArrayExpression(arr) = arr {
if let ArrayLike::ArrayExpression(arr) = arr {
for (i, element) in arr.elements.iter().enumerate() {
let is_last = i == arr.elements.len() - 1;
let element_doc = element.format(p);
Expand All @@ -234,10 +219,6 @@ where
if !is_last {
if is_line_after_element_empty(p, element.span().end) {
parts.push(array!(p, [hardline!(p), hardline!(p)]));
} else if arr.elements.get(i + 1).is_some_and(|next| {
p.has_comment(next.span(), CommentFlags::Leading | CommentFlags::Line)
}) {
parts.push(array!(p, [hardline!(p)]));
} else {
parts.push(line!());
}
Expand All @@ -252,13 +233,13 @@ where
fill!(p, parts)
}

fn should_break(array: &Array) -> bool {
fn should_break(array: &ArrayLike) -> bool {
if array.len() <= 1 {
return false;
}

match array {
Array::ArrayExpression(array) => {
ArrayLike::ArrayExpression(array) => {
array.elements.iter().enumerate().all(|(index, element)| {
if let Some(next_element) = array.elements.get(index + 1) {
let all_array_or_object = matches!(
Expand All @@ -283,7 +264,7 @@ fn should_break(array: &Array) -> bool {
}
})
}
Array::TSTupleType(tuple) => {
ArrayLike::TSTupleType(tuple) => {
tuple.element_types.iter().enumerate().all(|(index, element)| {
let TSTupleElement::TSTupleType(array) = element else {
return false;
Expand All @@ -300,8 +281,8 @@ fn should_break(array: &Array) -> bool {
array.element_types.len() > 1
})
}
Array::ArrayPattern(array) => false,
Array::ArrayAssignmentTarget(array) => false,
ArrayLike::ArrayPattern(array) => false,
ArrayLike::ArrayAssignmentTarget(array) => false,
}
}

Expand Down
2 changes: 1 addition & 1 deletion crates/oxc_prettier/src/format/print/call_arguments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use oxc_syntax::operator::UnaryOperator;
use crate::{
array, break_parent, conditional_group,
format::print::{
array::{is_concisely_printed_array, Array},
array::{is_concisely_printed_array, ArrayLike},
call_expression::{is_commons_js_or_amd_call, CallExpressionLike},
misc,
},
Expand Down
6 changes: 2 additions & 4 deletions crates/oxc_prettier/src/format/print/call_expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ use oxc_allocator::Vec;
use oxc_ast::ast::*;
use oxc_span::{GetSpan, Span};

use crate::{
format::print::call_arguments::print_call_arguments, group, ir::Doc, text, Format, Prettier,
};
use crate::{format::print::call_arguments, group, ir::Doc, text, Format, Prettier};

pub enum CallExpressionLike<'a, 'b> {
CallExpression(&'b CallExpression<'a>),
Expand Down Expand Up @@ -74,7 +72,7 @@ pub fn print_call_expression<'a>(
parts.push(text!("?."));
}

parts.push(print_call_arguments(p, expression));
parts.push(call_arguments::print_call_arguments(p, expression));

group!(p, parts)
}
Expand Down
2 changes: 1 addition & 1 deletion crates/oxc_prettier/src/format/typescript.rs
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ impl<'a> Format<'a> for TSTemplateLiteralType<'a> {

impl<'a> Format<'a> for TSTupleType<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
array::print_array(p, &array::Array::TSTupleType(self))
array::print_array(p, &array::ArrayLike::TSTupleType(self))
}
}

Expand Down

0 comments on commit 4dd2fb6

Please sign in to comment.