From 8fd9d420d08b967bb8acdc06eaaccf0a8cfc3f10 Mon Sep 17 00:00:00 2001 From: Darrow O'Lykos Date: Tue, 22 Mar 2022 02:22:57 -0400 Subject: [PATCH] feat(rome_formatter): tag_expression (rome#2262) the simplest tag_expression (that is not self closing) to format is the smallest possible tree that needs no formatting. for example ``. --- .../rome_formatter/src/jsx/auxiliary/name.rs | 10 ++++++--- .../rome_formatter/src/jsx/auxiliary/text.rs | 2 +- .../src/jsx/expressions/tag_expression.rs | 7 ++++--- .../src/jsx/tag/closing_element.rs | 21 ++++++++++++++++--- crates/rome_formatter/src/jsx/tag/element.rs | 16 +++++++++++--- .../src/jsx/tag/opening_element.rs | 21 ++++++++++++++++--- crates/rome_formatter/src/lib.rs | 6 ++++-- .../specs/jsx/expressions/tag_expression.jsx | 1 + .../expressions/tag_expression.jsx.snap.new | 17 +++++++++++++++ 9 files changed, 83 insertions(+), 18 deletions(-) create mode 100644 crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx create mode 100644 crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx.snap.new diff --git a/crates/rome_formatter/src/jsx/auxiliary/name.rs b/crates/rome_formatter/src/jsx/auxiliary/name.rs index 0440cc666cc..bca7a0d5339 100644 --- a/crates/rome_formatter/src/jsx/auxiliary/name.rs +++ b/crates/rome_formatter/src/jsx/auxiliary/name.rs @@ -1,7 +1,11 @@ -use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; -use rome_js_syntax::{AstNode, JsxName}; +use crate::{ + formatter_traits::FormatTokenAndNode, FormatElement, FormatResult, Formatter, ToFormatElement, +}; +use rome_js_syntax::{AstNode, JsxName, JsxNameFields}; impl ToFormatElement for JsxName { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - Ok(formatter.format_verbatim(self.syntax())) + let JsxNameFields { value_token } = self.as_fields(); + + value_token.format(formatter) } } diff --git a/crates/rome_formatter/src/jsx/auxiliary/text.rs b/crates/rome_formatter/src/jsx/auxiliary/text.rs index b632bd8cc0f..cf543f27214 100644 --- a/crates/rome_formatter/src/jsx/auxiliary/text.rs +++ b/crates/rome_formatter/src/jsx/auxiliary/text.rs @@ -1,4 +1,4 @@ -use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; +use crate::{FormatElement, FormatResult, Formatter, ToFormatElement, token}; use rome_js_syntax::{AstNode, JsxText}; impl ToFormatElement for JsxText { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { diff --git a/crates/rome_formatter/src/jsx/expressions/tag_expression.rs b/crates/rome_formatter/src/jsx/expressions/tag_expression.rs index 49b98d72c6f..412dfbee7aa 100644 --- a/crates/rome_formatter/src/jsx/expressions/tag_expression.rs +++ b/crates/rome_formatter/src/jsx/expressions/tag_expression.rs @@ -1,7 +1,8 @@ -use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; -use rome_js_syntax::{AstNode, JsxTagExpression}; +use crate::{format_elements, token, FormatElement, FormatResult, Formatter, ToFormatElement}; +use rome_js_syntax::{AstNode, JsxTagExpression, JsxTagExpressionFields}; impl ToFormatElement for JsxTagExpression { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - Ok(formatter.format_verbatim(self.syntax())) + let JsxTagExpressionFields { tag } = self.as_fields(); + Ok(tag?.to_format_element(formatter)?) } } diff --git a/crates/rome_formatter/src/jsx/tag/closing_element.rs b/crates/rome_formatter/src/jsx/tag/closing_element.rs index 723082d0250..a0d7602fa93 100644 --- a/crates/rome_formatter/src/jsx/tag/closing_element.rs +++ b/crates/rome_formatter/src/jsx/tag/closing_element.rs @@ -1,7 +1,22 @@ -use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; -use rome_js_syntax::{AstNode, JsxClosingElement}; +use crate::{ + format_elements, formatter_traits::FormatTokenAndNode, FormatElement, FormatResult, Formatter, + ToFormatElement, +}; +use rome_js_syntax::{AstNode, JsxClosingElement, JsxClosingElementFields}; impl ToFormatElement for JsxClosingElement { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - Ok(formatter.format_verbatim(self.syntax())) + let JsxClosingElementFields { + l_angle_token, + slash_token, + name, + r_angle_token, + } = self.as_fields(); + + Ok(format_elements![ + l_angle_token.format(formatter)?, + slash_token.format(formatter)?, + name?.to_format_element(formatter)?, + r_angle_token.format(formatter)? + ]) } } diff --git a/crates/rome_formatter/src/jsx/tag/element.rs b/crates/rome_formatter/src/jsx/tag/element.rs index bab9b1e87c5..f32b85e3834 100644 --- a/crates/rome_formatter/src/jsx/tag/element.rs +++ b/crates/rome_formatter/src/jsx/tag/element.rs @@ -1,7 +1,17 @@ -use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; -use rome_js_syntax::{AstNode, JsxElement}; +use crate::{format_elements, token, FormatElement, FormatResult, Formatter, ToFormatElement}; +use rome_js_syntax::{AstNode, JsxElement, JsxElementFields}; impl ToFormatElement for JsxElement { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - Ok(formatter.format_verbatim(self.syntax())) + let JsxElementFields { + opening_element, + children, + closing_element, + } = self.as_fields(); + + Ok(format_elements![ + opening_element?.to_format_element(formatter)?, + formatter.format_list(children), + closing_element?.to_format_element(formatter)? + ]) } } diff --git a/crates/rome_formatter/src/jsx/tag/opening_element.rs b/crates/rome_formatter/src/jsx/tag/opening_element.rs index 5068d7251ac..9305d3ebc44 100644 --- a/crates/rome_formatter/src/jsx/tag/opening_element.rs +++ b/crates/rome_formatter/src/jsx/tag/opening_element.rs @@ -1,7 +1,22 @@ -use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; -use rome_js_syntax::{AstNode, JsxOpeningElement}; +use crate::{ + format_elements, formatter_traits::FormatTokenAndNode, FormatElement, FormatResult, Formatter, + ToFormatElement, +}; +use rome_js_syntax::{AstNode, JsxOpeningElement, JsxOpeningElementFields}; impl ToFormatElement for JsxOpeningElement { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - Ok(formatter.format_verbatim(self.syntax())) + let JsxOpeningElementFields { + l_angle_token, + name, + attributes, + r_angle_token, + } = self.as_fields(); + + Ok(format_elements![ + l_angle_token.format(formatter)?, + name?.to_format_element(formatter)?, + formatter.format_list(attributes), + r_angle_token.format(formatter)? + ]) } } diff --git a/crates/rome_formatter/src/lib.rs b/crates/rome_formatter/src/lib.rs index 569ec28850e..081083f8926 100644 --- a/crates/rome_formatter/src/lib.rs +++ b/crates/rome_formatter/src/lib.rs @@ -596,9 +596,11 @@ mod test { // use this test check if your snippet prints as you wish, without using a snapshot fn quick_test() { let src = r#" -3 + 3 === 7 + + {abc} + "#; - let syntax = SourceType::ts(); + let syntax = SourceType::jsx(); let tree = parse(src, 0, syntax.clone()); let result = format(FormatOptions::default(), &tree.syntax()).unwrap(); check_reformat(CheckReformatParams { diff --git a/crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx b/crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx new file mode 100644 index 00000000000..7df325ba281 --- /dev/null +++ b/crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx.snap.new b/crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx.snap.new new file mode 100644 index 00000000000..82765475d14 --- /dev/null +++ b/crates/rome_formatter/tests/specs/jsx/expressions/tag_expression.jsx.snap.new @@ -0,0 +1,17 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 197 +expression: tag_expression.jsx + +--- +# Input + +============================= +# Outputs +## Output 1 +----- +Indent style: Tab +Line width: 80 +----- +; +