From 5768f00338383d9a95325eed6b269a2e9ae00ebe Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 24 Jan 2022 11:37:26 +0000 Subject: [PATCH 01/11] feat(rome_formatter): initial formatting of module --- crates/rome_core/src/file_handlers/unknown.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/rome_core/src/file_handlers/unknown.rs b/crates/rome_core/src/file_handlers/unknown.rs index eefdd0b722d..2b8f97dd505 100644 --- a/crates/rome_core/src/file_handlers/unknown.rs +++ b/crates/rome_core/src/file_handlers/unknown.rs @@ -23,3 +23,8 @@ impl ExtensionHandler for UnknownFileHandler { true } } +impl Default for UnknownFileHandler { + fn default() -> Self { + Self {} + } +} From 4468ea08b00925ce14d16d74ef3b7d337a0e6cf5 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 24 Jan 2022 15:08:26 +0000 Subject: [PATCH 02/11] chore: reduce bloat --- crates/rome_core/src/file_handlers/unknown.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/crates/rome_core/src/file_handlers/unknown.rs b/crates/rome_core/src/file_handlers/unknown.rs index 2b8f97dd505..eefdd0b722d 100644 --- a/crates/rome_core/src/file_handlers/unknown.rs +++ b/crates/rome_core/src/file_handlers/unknown.rs @@ -23,8 +23,3 @@ impl ExtensionHandler for UnknownFileHandler { true } } -impl Default for UnknownFileHandler { - fn default() -> Self { - Self {} - } -} From ce7b5cb0fcbdb85121523267b9679b1fa2f9dc24 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Fri, 21 Jan 2022 17:35:41 +0000 Subject: [PATCH 03/11] feat: format import syntax --- crates/rome_formatter/src/cst.rs | 1 + crates/rome_formatter/src/ts/import/import.rs | 21 +++++++++++++++++++ .../rome_formatter/src/ts/root/module_item.rs | 12 +++++++++++ .../tests/specs/js/import/named_import.js | 2 ++ 4 files changed, 36 insertions(+) create mode 100644 crates/rome_formatter/src/ts/import/import.rs create mode 100644 crates/rome_formatter/src/ts/root/module_item.rs create mode 100644 crates/rome_formatter/tests/specs/js/import/named_import.js diff --git a/crates/rome_formatter/src/cst.rs b/crates/rome_formatter/src/cst.rs index d83cd0608bf..384373d94d3 100644 --- a/crates/rome_formatter/src/cst.rs +++ b/crates/rome_formatter/src/cst.rs @@ -1,4 +1,5 @@ use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; +use rslint_parser::ast::JsAnyNamedImportSpecifier::JsNamedImportSpecifier; use rslint_parser::ast::{ ImportMeta, JsArrayBindingPattern, JsArrayExpression, JsArrowFunctionExpression, JsBlockStatement, JsBooleanLiteralExpression, JsCallArguments, JsCallExpression, JsCaseClause, diff --git a/crates/rome_formatter/src/ts/import/import.rs b/crates/rome_formatter/src/ts/import/import.rs new file mode 100644 index 00000000000..f2ddca30a23 --- /dev/null +++ b/crates/rome_formatter/src/ts/import/import.rs @@ -0,0 +1,21 @@ +use crate::{ + format_elements, space_token, token, FormatElement, FormatResult, Formatter, ToFormatElement, +}; +use rslint_parser::ast::JsImport; + +impl ToFormatElement for JsImport { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let import_token = formatter.format_token(&self.import_token()?)?; + let import_clause = formatter.format_node(self.import_clause()?)?; + let semicolon = formatter + .format_token(&self.semicolon_token())? + .unwrap_or_else(|| token(';')); + + Ok(format_elements![ + import_token, + space_token(), + import_clause, + semicolon + ]) + } +} diff --git a/crates/rome_formatter/src/ts/root/module_item.rs b/crates/rome_formatter/src/ts/root/module_item.rs new file mode 100644 index 00000000000..ca7aa412a6f --- /dev/null +++ b/crates/rome_formatter/src/ts/root/module_item.rs @@ -0,0 +1,12 @@ +use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; +use rslint_parser::ast::JsAnyModuleItem; + +impl ToFormatElement for JsAnyModuleItem { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + match self { + JsAnyModuleItem::JsAnyStatement(statement) => statement.to_format_element(formatter), + JsAnyModuleItem::JsExport(_) => todo!(), + JsAnyModuleItem::JsImport(import) => import.to_format_element(formatter), + } + } +} diff --git a/crates/rome_formatter/tests/specs/js/import/named_import.js b/crates/rome_formatter/tests/specs/js/import/named_import.js new file mode 100644 index 00000000000..4fd5c3036f6 --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/import/named_import.js @@ -0,0 +1,2 @@ +import "very_long_import_very_long_import_very_long_import_very_long_import_very_long_import_very_long_import_very_long_import_"; + From 6daf29e2a0d9fa8bb5aaa9d054d7d40f74c76b72 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 25 Jan 2022 14:49:22 +0000 Subject: [PATCH 04/11] feat: named import formatting --- crates/rome_formatter/src/ts/import/import.rs | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 crates/rome_formatter/src/ts/import/import.rs diff --git a/crates/rome_formatter/src/ts/import/import.rs b/crates/rome_formatter/src/ts/import/import.rs deleted file mode 100644 index f2ddca30a23..00000000000 --- a/crates/rome_formatter/src/ts/import/import.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::{ - format_elements, space_token, token, FormatElement, FormatResult, Formatter, ToFormatElement, -}; -use rslint_parser::ast::JsImport; - -impl ToFormatElement for JsImport { - fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - let import_token = formatter.format_token(&self.import_token()?)?; - let import_clause = formatter.format_node(self.import_clause()?)?; - let semicolon = formatter - .format_token(&self.semicolon_token())? - .unwrap_or_else(|| token(';')); - - Ok(format_elements![ - import_token, - space_token(), - import_clause, - semicolon - ]) - } -} From 59dfcbb88e898ce227d066b15519b4c1f7602c12 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 26 Jan 2022 09:53:14 +0000 Subject: [PATCH 05/11] feat: export syntax --- crates/rome_formatter/src/cst.rs | 12 ++++++++++ .../rome_formatter/src/ts/class/any_class.rs | 10 +++++++-- .../src/ts/export/any_export_clause.rs | 20 +++++++++++++++++ .../src/ts/export/class_clause.rs | 8 +++++++ .../src/ts/export/default_class_clause.rs | 13 +++++++++++ crates/rome_formatter/src/ts/export/mod.rs | 16 ++++++++++++++ crates/rome_formatter/src/ts/mod.rs | 1 + .../src/ts/root/any_module_item.rs | 2 +- .../specs/js/module/export/class_clause.js | 6 +++++ .../js/module/export/class_clause.js.snap | 22 +++++++++++++++++++ 10 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 crates/rome_formatter/src/ts/export/any_export_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/class_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/default_class_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/mod.rs create mode 100644 crates/rome_formatter/tests/specs/js/module/export/class_clause.js create mode 100644 crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap diff --git a/crates/rome_formatter/src/cst.rs b/crates/rome_formatter/src/cst.rs index 384373d94d3..9712609a42a 100644 --- a/crates/rome_formatter/src/cst.rs +++ b/crates/rome_formatter/src/cst.rs @@ -278,6 +278,18 @@ impl ToFormatElement for SyntaxNode { JsSyntaxKind::IMPORT_META => ImportMeta::cast(self.clone()) .unwrap() .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT => JsExport::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT_CLASS_CLAUSE => JsExportClassClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT_DEFAULT_CLASS_CLAUSE => { + JsExportDefaultClassClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter) + } + _ => todo!( "Implement formatting for the {:?} syntax kind.", self.kind() diff --git a/crates/rome_formatter/src/ts/class/any_class.rs b/crates/rome_formatter/src/ts/class/any_class.rs index a92405284bc..8a94a1752e4 100644 --- a/crates/rome_formatter/src/ts/class/any_class.rs +++ b/crates/rome_formatter/src/ts/class/any_class.rs @@ -1,6 +1,6 @@ use crate::{ - block_indent, empty_element, format_elements, group_elements, join_elements_hard_line, - space_token, FormatElement, FormatResult, Formatter, ToFormatElement, + block_indent, empty_element, format_elements, group_elements, hard_line_break, if_group_breaks, + join_elements_hard_line, space_token, FormatElement, FormatResult, Formatter, ToFormatElement, }; use rslint_parser::ast::JsAnyClass; @@ -26,6 +26,12 @@ impl ToFormatElement for JsAnyClass { group_elements(formatter.format_delimited( &self.l_curly_token()?, |open_token_trailing, close_token_leading| { + // leading comments should break before any other object member + let leading = if !leading.is_empty() { + format_elements![leading, hard_line_break()] + } else { + empty_element() + }; Ok(block_indent(format_elements![ open_token_trailing, join_elements_hard_line( diff --git a/crates/rome_formatter/src/ts/export/any_export_clause.rs b/crates/rome_formatter/src/ts/export/any_export_clause.rs new file mode 100644 index 00000000000..d94a681148c --- /dev/null +++ b/crates/rome_formatter/src/ts/export/any_export_clause.rs @@ -0,0 +1,20 @@ +use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; +use rslint_parser::ast::JsAnyExportClause; + +impl ToFormatElement for JsAnyExportClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + match self { + JsAnyExportClause::JsExportClassClause(node) => node.to_format_element(formatter), + JsAnyExportClause::JsExportDefaultClassClause(node) => { + node.to_format_element(formatter) + } + JsAnyExportClause::JsExportDefaultExpressionClause(_) => todo!(), + JsAnyExportClause::JsExportDefaultFunctionClause(_) => todo!(), + JsAnyExportClause::JsExportFromClause(_) => todo!(), + JsAnyExportClause::JsExportFunctionClause(_) => todo!(), + JsAnyExportClause::JsExportNamedClause(_) => todo!(), + JsAnyExportClause::JsExportNamedFromClause(_) => todo!(), + JsAnyExportClause::JsExportVariableClause(_) => todo!(), + } + } +} diff --git a/crates/rome_formatter/src/ts/export/class_clause.rs b/crates/rome_formatter/src/ts/export/class_clause.rs new file mode 100644 index 00000000000..63824ac1c3f --- /dev/null +++ b/crates/rome_formatter/src/ts/export/class_clause.rs @@ -0,0 +1,8 @@ +use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; +use rslint_parser::ast::{JsAnyClass, JsExportClassClause}; + +impl ToFormatElement for JsExportClassClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + JsAnyClass::from(self.clone()).to_format_element(formatter) + } +} diff --git a/crates/rome_formatter/src/ts/export/default_class_clause.rs b/crates/rome_formatter/src/ts/export/default_class_clause.rs new file mode 100644 index 00000000000..d37a5b1f67b --- /dev/null +++ b/crates/rome_formatter/src/ts/export/default_class_clause.rs @@ -0,0 +1,13 @@ +use crate::{ + format_elements, space_token, FormatElement, FormatResult, Formatter, ToFormatElement, +}; +use rslint_parser::ast::{JsAnyClass, JsExportDefaultClassClause}; + +impl ToFormatElement for JsExportDefaultClassClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let default_token = formatter.format_token(&self.default_token()?)?; + let class = JsAnyClass::from(self.clone()).to_format_element(formatter)?; + + Ok(format_elements![default_token, space_token(), class]) + } +} diff --git a/crates/rome_formatter/src/ts/export/mod.rs b/crates/rome_formatter/src/ts/export/mod.rs new file mode 100644 index 00000000000..25135e2cff1 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/mod.rs @@ -0,0 +1,16 @@ +mod any_export_clause; +mod class_clause; +mod default_class_clause; + +use crate::{ + format_elements, space_token, FormatElement, FormatResult, Formatter, ToFormatElement, +}; +use rslint_parser::ast::JsExport; + +impl ToFormatElement for JsExport { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let export_token = formatter.format_token(&self.export_token()?)?; + let export_clause = formatter.format_node(self.export_clause()?)?; + Ok(format_elements![export_token, space_token(), export_clause]) + } +} diff --git a/crates/rome_formatter/src/ts/mod.rs b/crates/rome_formatter/src/ts/mod.rs index 84dcf5fd011..addfa56e267 100644 --- a/crates/rome_formatter/src/ts/mod.rs +++ b/crates/rome_formatter/src/ts/mod.rs @@ -5,6 +5,7 @@ mod auxiliary; mod bindings; mod class; mod directives; +mod export; mod expressions; mod ident; mod import; diff --git a/crates/rome_formatter/src/ts/root/any_module_item.rs b/crates/rome_formatter/src/ts/root/any_module_item.rs index ca7aa412a6f..3c676f29f6c 100644 --- a/crates/rome_formatter/src/ts/root/any_module_item.rs +++ b/crates/rome_formatter/src/ts/root/any_module_item.rs @@ -5,7 +5,7 @@ impl ToFormatElement for JsAnyModuleItem { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { match self { JsAnyModuleItem::JsAnyStatement(statement) => statement.to_format_element(formatter), - JsAnyModuleItem::JsExport(_) => todo!(), + JsAnyModuleItem::JsExport(e) => e.to_format_element(formatter), JsAnyModuleItem::JsImport(import) => import.to_format_element(formatter), } } diff --git a/crates/rome_formatter/tests/specs/js/module/export/class_clause.js b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js new file mode 100644 index 00000000000..a860493dfbe --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js @@ -0,0 +1,6 @@ +// another comment +export class A { // small comment + constructor() { + } +} + diff --git a/crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap new file mode 100644 index 00000000000..a864c2e3551 --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap @@ -0,0 +1,22 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 57 +expression: class_clause.js + +--- +# Input +// another comment +export class A { // small comment + constructor() { + } +} + + +--- +# Output +// another comment +export class A { + // small comment + constructor() {} +} + From 2f0b0886d8ce1f28116a77bc2a3f0d26d1dea391 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 26 Jan 2022 13:23:05 +0000 Subject: [PATCH 06/11] feat: default expression and function --- crates/rome_formatter/src/cst.rs | 34 ++++++++++++++----- .../src/ts/export/any_export_clause.rs | 12 ++++--- .../ts/export/default_expression_clause.rs | 22 ++++++++++++ .../src/ts/export/default_function_clause.rs | 13 +++++++ .../src/ts/export/function_clause.rs | 8 +++++ crates/rome_formatter/src/ts/export/mod.rs | 4 +++ .../src/ts/export/variable_clause.rs | 15 ++++++++ .../specs/js/module/export/class_clause.js | 3 ++ .../js/module/export/class_clause.js.snap | 5 +++ .../js/module/export/expression_clause.js | 1 + .../module/export/expression_clause.js.snap | 12 +++++++ .../specs/js/module/export/function_clause.js | 9 +++++ .../js/module/export/function_clause.js.snap | 22 ++++++++++++ .../js/module/export/variable_declaration.js | 3 ++ .../export/variable_declaration.js.snap | 18 ++++++++++ 15 files changed, 169 insertions(+), 12 deletions(-) create mode 100644 crates/rome_formatter/src/ts/export/default_expression_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/default_function_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/function_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/variable_clause.rs create mode 100644 crates/rome_formatter/tests/specs/js/module/export/expression_clause.js create mode 100644 crates/rome_formatter/tests/specs/js/module/export/expression_clause.js.snap create mode 100644 crates/rome_formatter/tests/specs/js/module/export/function_clause.js create mode 100644 crates/rome_formatter/tests/specs/js/module/export/function_clause.js.snap create mode 100644 crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js create mode 100644 crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js.snap diff --git a/crates/rome_formatter/src/cst.rs b/crates/rome_formatter/src/cst.rs index 9712609a42a..5a050f292f1 100644 --- a/crates/rome_formatter/src/cst.rs +++ b/crates/rome_formatter/src/cst.rs @@ -5,14 +5,16 @@ use rslint_parser::ast::{ JsBlockStatement, JsBooleanLiteralExpression, JsCallArguments, JsCallExpression, JsCaseClause, JsCatchClause, JsClassStatement, JsConstructorParameters, JsContinueStatement, JsDebuggerStatement, JsDefaultClause, JsDefaultImportSpecifier, JsDoWhileStatement, - JsEmptyStatement, JsExpressionStatement, JsFinallyClause, JsForInStatement, JsForStatement, - JsFunctionStatement, JsGetterClassMember, JsIdentifierBinding, JsIdentifierExpression, - JsIfStatement, JsImport, JsImportAssertion, JsImportAssertionEntry, JsImportBareClause, - JsImportCallExpression, JsImportDefaultClause, JsImportNamedClause, JsImportNamespaceClause, - JsLabeledStatement, JsLiteralExportName, JsModule, JsModuleSource, JsNamedImportSpecifier, - JsNamedImportSpecifiers, JsNamespaceImportSpecifier, JsNullLiteralExpression, - JsNumberLiteralExpression, JsObjectExpression, JsParameters, JsPropertyClassMember, - JsPropertyObjectMember, JsReturnStatement, JsScript, JsSequenceExpression, JsSetterClassMember, + JsEmptyStatement, JsExportDefaultExpressionClause, JsExportDefaultFunctionClause, + JsExportFunctionClause, JsExportVariableClause, JsExpressionStatement, JsFinallyClause, + JsForInStatement, JsForStatement, JsFunctionStatement, JsGetterClassMember, + JsIdentifierBinding, JsIdentifierExpression, JsIfStatement, JsImport, JsImportAssertion, + JsImportAssertionEntry, JsImportBareClause, JsImportCallExpression, JsImportDefaultClause, + JsImportNamedClause, JsImportNamespaceClause, JsLabeledStatement, JsLiteralExportName, + JsModule, JsModuleSource, JsNamedImportSpecifier, JsNamedImportSpecifiers, + JsNamespaceImportSpecifier, JsNullLiteralExpression, JsNumberLiteralExpression, + JsObjectExpression, JsParameters, JsPropertyClassMember, JsPropertyObjectMember, + JsReturnStatement, JsScript, JsSequenceExpression, JsSetterClassMember, JsShorthandNamedImportSpecifier, JsShorthandPropertyObjectMember, JsSpread, JsStatementList, JsStaticInitializationBlockClassMember, JsStringLiteralExpression, JsSwitchStatement, JsTemplate, JsTemplateChunkElement, JsTemplateElement, JsTryStatement, JsUnknownAssignment, @@ -289,6 +291,22 @@ impl ToFormatElement for SyntaxNode { .unwrap() .to_format_element(formatter) } + JsSyntaxKind::JS_EXPORT_FUNCTION_CLAUSE => JsExportFunctionClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT_DEFAULT_FUNCTION_CLAUSE => { + JsExportDefaultFunctionClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter) + } + JsSyntaxKind::JS_EXPORT_VARIABLE_CLAUSE => JsExportVariableClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT_DEFAULT_EXPRESSION_CLAUSE => { + JsExportDefaultExpressionClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter) + } _ => todo!( "Implement formatting for the {:?} syntax kind.", diff --git a/crates/rome_formatter/src/ts/export/any_export_clause.rs b/crates/rome_formatter/src/ts/export/any_export_clause.rs index d94a681148c..64f1495bc69 100644 --- a/crates/rome_formatter/src/ts/export/any_export_clause.rs +++ b/crates/rome_formatter/src/ts/export/any_export_clause.rs @@ -8,13 +8,17 @@ impl ToFormatElement for JsAnyExportClause { JsAnyExportClause::JsExportDefaultClassClause(node) => { node.to_format_element(formatter) } - JsAnyExportClause::JsExportDefaultExpressionClause(_) => todo!(), - JsAnyExportClause::JsExportDefaultFunctionClause(_) => todo!(), + JsAnyExportClause::JsExportDefaultExpressionClause(node) => { + node.to_format_element(formatter) + } + JsAnyExportClause::JsExportDefaultFunctionClause(node) => { + node.to_format_element(formatter) + } JsAnyExportClause::JsExportFromClause(_) => todo!(), - JsAnyExportClause::JsExportFunctionClause(_) => todo!(), + JsAnyExportClause::JsExportFunctionClause(node) => node.to_format_element(formatter), JsAnyExportClause::JsExportNamedClause(_) => todo!(), JsAnyExportClause::JsExportNamedFromClause(_) => todo!(), - JsAnyExportClause::JsExportVariableClause(_) => todo!(), + JsAnyExportClause::JsExportVariableClause(node) => node.to_format_element(formatter), } } } diff --git a/crates/rome_formatter/src/ts/export/default_expression_clause.rs b/crates/rome_formatter/src/ts/export/default_expression_clause.rs new file mode 100644 index 00000000000..6f348243b65 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/default_expression_clause.rs @@ -0,0 +1,22 @@ +use crate::{ + format_elements, space_token, token, FormatElement, FormatResult, Formatter, ToFormatElement, +}; +use rslint_parser::ast::JsExportDefaultExpressionClause; + +impl ToFormatElement for JsExportDefaultExpressionClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let default_token = formatter.format_token(&self.default_token()?)?; + let class = formatter.format_node(self.expression()?)?; + let semicolon = if let Some(semicolon) = &self.semicolon_token() { + formatter.format_token(semicolon)? + } else { + token(";") + }; + Ok(format_elements![ + default_token, + space_token(), + class, + semicolon + ]) + } +} diff --git a/crates/rome_formatter/src/ts/export/default_function_clause.rs b/crates/rome_formatter/src/ts/export/default_function_clause.rs new file mode 100644 index 00000000000..ae45bd02270 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/default_function_clause.rs @@ -0,0 +1,13 @@ +use crate::{ + format_elements, space_token, FormatElement, FormatResult, Formatter, ToFormatElement, +}; +use rslint_parser::ast::{JsAnyFunction, JsExportDefaultFunctionClause}; + +impl ToFormatElement for JsExportDefaultFunctionClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let default_token = formatter.format_token(&self.default_token()?)?; + let class = JsAnyFunction::from(self.clone()).to_format_element(formatter)?; + + Ok(format_elements![default_token, space_token(), class]) + } +} diff --git a/crates/rome_formatter/src/ts/export/function_clause.rs b/crates/rome_formatter/src/ts/export/function_clause.rs new file mode 100644 index 00000000000..69b93f2235b --- /dev/null +++ b/crates/rome_formatter/src/ts/export/function_clause.rs @@ -0,0 +1,8 @@ +use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; +use rslint_parser::ast::{JsAnyFunction, JsExportFunctionClause}; + +impl ToFormatElement for JsExportFunctionClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + JsAnyFunction::from(self.clone()).to_format_element(formatter) + } +} diff --git a/crates/rome_formatter/src/ts/export/mod.rs b/crates/rome_formatter/src/ts/export/mod.rs index 25135e2cff1..d3b625b0edb 100644 --- a/crates/rome_formatter/src/ts/export/mod.rs +++ b/crates/rome_formatter/src/ts/export/mod.rs @@ -1,6 +1,10 @@ mod any_export_clause; mod class_clause; mod default_class_clause; +mod default_expression_clause; +mod default_function_clause; +mod function_clause; +mod variable_clause; use crate::{ format_elements, space_token, FormatElement, FormatResult, Formatter, ToFormatElement, diff --git a/crates/rome_formatter/src/ts/export/variable_clause.rs b/crates/rome_formatter/src/ts/export/variable_clause.rs new file mode 100644 index 00000000000..a0a63823996 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/variable_clause.rs @@ -0,0 +1,15 @@ +use crate::{format_elements, token, FormatElement, FormatResult, Formatter, ToFormatElement}; +use rslint_parser::ast::JsExportVariableClause; + +impl ToFormatElement for JsExportVariableClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let declarations = formatter.format_node(self.declarations()?)?; + let semicolon = if let Some(semicolon) = self.semicolon_token() { + formatter.format_token(&semicolon)? + } else { + token(";") + }; + + Ok(format_elements![declarations, semicolon]) + } +} diff --git a/crates/rome_formatter/tests/specs/js/module/export/class_clause.js b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js index a860493dfbe..1c132d82bb8 100644 --- a/crates/rome_formatter/tests/specs/js/module/export/class_clause.js +++ b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js @@ -4,3 +4,6 @@ export class A { // small comment } } + +export default class +B {} diff --git a/crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap index a864c2e3551..194ecdb9b6e 100644 --- a/crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap +++ b/crates/rome_formatter/tests/specs/js/module/export/class_clause.js.snap @@ -12,6 +12,9 @@ export class A { // small comment } +export default class +B {} + --- # Output // another comment @@ -20,3 +23,5 @@ export class A { constructor() {} } +export default class B {} + diff --git a/crates/rome_formatter/tests/specs/js/module/export/expression_clause.js b/crates/rome_formatter/tests/specs/js/module/export/expression_clause.js new file mode 100644 index 00000000000..6cda1a48eee --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/expression_clause.js @@ -0,0 +1 @@ +export default (1 - 43); \ No newline at end of file diff --git a/crates/rome_formatter/tests/specs/js/module/export/expression_clause.js.snap b/crates/rome_formatter/tests/specs/js/module/export/expression_clause.js.snap new file mode 100644 index 00000000000..062cd1ed057 --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/expression_clause.js.snap @@ -0,0 +1,12 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 57 +expression: expression_clause.js + +--- +# Input +export default (1 - 43); +--- +# Output +export default (1 - 43); + diff --git a/crates/rome_formatter/tests/specs/js/module/export/function_clause.js b/crates/rome_formatter/tests/specs/js/module/export/function_clause.js new file mode 100644 index 00000000000..d3f42cc8905 --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/function_clause.js @@ -0,0 +1,9 @@ +export function f() { + + +} + + +export default function ff() { + +} \ No newline at end of file diff --git a/crates/rome_formatter/tests/specs/js/module/export/function_clause.js.snap b/crates/rome_formatter/tests/specs/js/module/export/function_clause.js.snap new file mode 100644 index 00000000000..340aa341c44 --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/function_clause.js.snap @@ -0,0 +1,22 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 57 +expression: function_clause.js + +--- +# Input +export function f() { + + +} + + +export default function ff() { + +} +--- +# Output +export function f() {} + +export default function ff() {} + diff --git a/crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js b/crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js new file mode 100644 index 00000000000..ed7431a26fd --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js @@ -0,0 +1,3 @@ +export let a, d, c; + +export const foofoofoofoofoofoofoo = "ahah", barbarbarbarbarbarbar = {}, loremloremloremloremlorem = [] \ No newline at end of file diff --git a/crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js.snap b/crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js.snap new file mode 100644 index 00000000000..086ad66e56c --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/variable_declaration.js.snap @@ -0,0 +1,18 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 57 +expression: variable_declaration.js + +--- +# Input +export let a, d, c; + +export const foofoofoofoofoofoofoo = "ahah", barbarbarbarbarbarbar = {}, loremloremloremloremlorem = [] +--- +# Output +export let a, d, c; + +export const foofoofoofoofoofoofoo = "ahah", + barbarbarbarbarbarbar = {}, + loremloremloremloremlorem = []; + From 01dfc39de72498b413f67a1eb064c8eb26b730bd Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 26 Jan 2022 15:04:00 +0000 Subject: [PATCH 07/11] chore: export from syntax --- crates/rome_formatter/src/cst.rs | 28 +++++++++ .../rome_formatter/src/ts/class/any_class.rs | 10 +--- .../src/ts/export/any_export_clause.rs | 6 +- .../ts/export/any_export_name_specifier.rs | 15 +++++ .../rome_formatter/src/ts/export/as_clause.rs | 13 ++++ .../src/ts/export/from_clause.rs | 38 ++++++++++++ crates/rome_formatter/src/ts/export/mod.rs | 8 +++ .../src/ts/export/named_clause.rs | 44 ++++++++++++++ .../src/ts/export/named_from_clause.rs | 60 +++++++++++++++++++ .../src/ts/export/named_from_specifier.rs | 23 +++++++ .../ts/export/named_shorthand_specifier.rs | 19 ++++++ .../src/ts/export/named_specifier.rs | 28 +++++++++ .../specs/js/module/export/from_clause.js | 5 ++ .../js/module/export/from_clause.js.snap | 23 +++++++ .../specs/js/module/export/named_clause.js | 7 +++ .../js/module/export/named_clause.js.snap | 23 +++++++ .../js/module/export/named_from_clause.js | 9 +++ .../module/export/named_from_clause.js.snap | 30 ++++++++++ xtask/src/coverage/test262 | 1 + 19 files changed, 379 insertions(+), 11 deletions(-) create mode 100644 crates/rome_formatter/src/ts/export/any_export_name_specifier.rs create mode 100644 crates/rome_formatter/src/ts/export/as_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/from_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/named_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/named_from_clause.rs create mode 100644 crates/rome_formatter/src/ts/export/named_from_specifier.rs create mode 100644 crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs create mode 100644 crates/rome_formatter/src/ts/export/named_specifier.rs create mode 100644 crates/rome_formatter/tests/specs/js/module/export/from_clause.js create mode 100644 crates/rome_formatter/tests/specs/js/module/export/from_clause.js.snap create mode 100644 crates/rome_formatter/tests/specs/js/module/export/named_clause.js create mode 100644 crates/rome_formatter/tests/specs/js/module/export/named_clause.js.snap create mode 100644 crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js create mode 100644 crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js.snap create mode 160000 xtask/src/coverage/test262 diff --git a/crates/rome_formatter/src/cst.rs b/crates/rome_formatter/src/cst.rs index 5a050f292f1..ae01c3d9646 100644 --- a/crates/rome_formatter/src/cst.rs +++ b/crates/rome_formatter/src/cst.rs @@ -307,6 +307,34 @@ impl ToFormatElement for SyntaxNode { .unwrap() .to_format_element(formatter) } + JsSyntaxKind::JS_EXPORT_FROM_CLAUSE => JsExportFromClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + + JsSyntaxKind::JS_EXPORT_AS_CLAUSE => JsExportAsClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT_NAMED_CLAUSE => JsExportNamedClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT_NAMED_SPECIFIER => JsExportNamedSpecifier::cast(self.clone()) + .unwrap() + .to_format_element(formatter), + JsSyntaxKind::JS_EXPORT_NAMED_SHORTHAND_SPECIFIER => { + JsExportNamedShorthandSpecifier::cast(self.clone()) + .unwrap() + .to_format_element(formatter) + } + JsSyntaxKind::JS_EXPORT_NAMED_FROM_CLAUSE => { + JsExportNamedFromClause::cast(self.clone()) + .unwrap() + .to_format_element(formatter) + } + JsSyntaxKind::JS_EXPORT_NAMED_FROM_SPECIFIER => { + JsExportNamedFromSpecifier::cast(self.clone()) + .unwrap() + .to_format_element(formatter) + } _ => todo!( "Implement formatting for the {:?} syntax kind.", diff --git a/crates/rome_formatter/src/ts/class/any_class.rs b/crates/rome_formatter/src/ts/class/any_class.rs index 8a94a1752e4..a92405284bc 100644 --- a/crates/rome_formatter/src/ts/class/any_class.rs +++ b/crates/rome_formatter/src/ts/class/any_class.rs @@ -1,6 +1,6 @@ use crate::{ - block_indent, empty_element, format_elements, group_elements, hard_line_break, if_group_breaks, - join_elements_hard_line, space_token, FormatElement, FormatResult, Formatter, ToFormatElement, + block_indent, empty_element, format_elements, group_elements, join_elements_hard_line, + space_token, FormatElement, FormatResult, Formatter, ToFormatElement, }; use rslint_parser::ast::JsAnyClass; @@ -26,12 +26,6 @@ impl ToFormatElement for JsAnyClass { group_elements(formatter.format_delimited( &self.l_curly_token()?, |open_token_trailing, close_token_leading| { - // leading comments should break before any other object member - let leading = if !leading.is_empty() { - format_elements![leading, hard_line_break()] - } else { - empty_element() - }; Ok(block_indent(format_elements![ open_token_trailing, join_elements_hard_line( diff --git a/crates/rome_formatter/src/ts/export/any_export_clause.rs b/crates/rome_formatter/src/ts/export/any_export_clause.rs index 64f1495bc69..2fb9448fa0c 100644 --- a/crates/rome_formatter/src/ts/export/any_export_clause.rs +++ b/crates/rome_formatter/src/ts/export/any_export_clause.rs @@ -14,10 +14,10 @@ impl ToFormatElement for JsAnyExportClause { JsAnyExportClause::JsExportDefaultFunctionClause(node) => { node.to_format_element(formatter) } - JsAnyExportClause::JsExportFromClause(_) => todo!(), + JsAnyExportClause::JsExportFromClause(node) => node.to_format_element(formatter), JsAnyExportClause::JsExportFunctionClause(node) => node.to_format_element(formatter), - JsAnyExportClause::JsExportNamedClause(_) => todo!(), - JsAnyExportClause::JsExportNamedFromClause(_) => todo!(), + JsAnyExportClause::JsExportNamedClause(node) => node.to_format_element(formatter), + JsAnyExportClause::JsExportNamedFromClause(node) => node.to_format_element(formatter), JsAnyExportClause::JsExportVariableClause(node) => node.to_format_element(formatter), } } diff --git a/crates/rome_formatter/src/ts/export/any_export_name_specifier.rs b/crates/rome_formatter/src/ts/export/any_export_name_specifier.rs new file mode 100644 index 00000000000..7cc16f6c8cf --- /dev/null +++ b/crates/rome_formatter/src/ts/export/any_export_name_specifier.rs @@ -0,0 +1,15 @@ +use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; +use rslint_parser::ast::JsAnyExportNamedSpecifier; + +impl ToFormatElement for JsAnyExportNamedSpecifier { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + match self { + JsAnyExportNamedSpecifier::JsExportNamedShorthandSpecifier(node) => { + node.to_format_element(formatter) + } + JsAnyExportNamedSpecifier::JsExportNamedSpecifier(node) => { + node.to_format_element(formatter) + } + } + } +} diff --git a/crates/rome_formatter/src/ts/export/as_clause.rs b/crates/rome_formatter/src/ts/export/as_clause.rs new file mode 100644 index 00000000000..14d07b13738 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/as_clause.rs @@ -0,0 +1,13 @@ +use crate::{ + format_elements, space_token, FormatElement, FormatResult, Formatter, ToFormatElement, +}; +use rslint_parser::ast::JsExportAsClause; + +impl ToFormatElement for JsExportAsClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let as_token = formatter.format_token(&self.as_token()?)?; + let exported_name = formatter.format_node(self.exported_name()?)?; + + Ok(format_elements![as_token, space_token(), exported_name]) + } +} diff --git a/crates/rome_formatter/src/ts/export/from_clause.rs b/crates/rome_formatter/src/ts/export/from_clause.rs new file mode 100644 index 00000000000..f7d548ad39d --- /dev/null +++ b/crates/rome_formatter/src/ts/export/from_clause.rs @@ -0,0 +1,38 @@ +use crate::{ + empty_element, format_elements, space_token, token, FormatElement, FormatResult, Formatter, + ToFormatElement, +}; +use rslint_parser::ast::JsExportFromClause; + +impl ToFormatElement for JsExportFromClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let star = formatter.format_token(&self.star_token()?)?; + let export_as = if let Some(export_as) = self.export_as() { + format_elements![formatter.format_node(export_as)?, space_token()] + } else { + empty_element() + }; + let from = formatter.format_token(&self.from_token()?)?; + let source = formatter.format_node(self.source()?)?; + let assertion = if let Some(assertion) = self.assertion() { + formatter.format_node(assertion)? + } else { + empty_element() + }; + let semicolon = if let Some(semicolon) = self.semicolon_token() { + formatter.format_token(&semicolon)? + } else { + token(";") + }; + Ok(format_elements![ + star, + space_token(), + export_as, + from, + space_token(), + source, + assertion, + semicolon + ]) + } +} diff --git a/crates/rome_formatter/src/ts/export/mod.rs b/crates/rome_formatter/src/ts/export/mod.rs index d3b625b0edb..7e2bd5928a0 100644 --- a/crates/rome_formatter/src/ts/export/mod.rs +++ b/crates/rome_formatter/src/ts/export/mod.rs @@ -1,9 +1,17 @@ mod any_export_clause; +mod any_export_name_specifier; +mod as_clause; mod class_clause; mod default_class_clause; mod default_expression_clause; mod default_function_clause; +mod from_clause; mod function_clause; +mod named_clause; +mod named_from_clause; +mod named_from_specifier; +mod named_shorthand_specifier; +mod named_specifier; mod variable_clause; use crate::{ diff --git a/crates/rome_formatter/src/ts/export/named_clause.rs b/crates/rome_formatter/src/ts/export/named_clause.rs new file mode 100644 index 00000000000..26799c3dcb5 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/named_clause.rs @@ -0,0 +1,44 @@ +use crate::{ + empty_element, format_elements, group_elements, if_group_fits_on_single_line, join_elements, + soft_indent, soft_line_break_or_space, space_token, token, FormatElement, FormatResult, + Formatter, ToFormatElement, +}; +use rslint_parser::ast::JsExportNamedClause; +use rslint_parser::AstSeparatedList; + +impl ToFormatElement for JsExportNamedClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let specifiers = self.specifiers(); + let space = if specifiers.len() == 0 { + empty_element() + } else { + if_group_fits_on_single_line(space_token()) + }; + let list = group_elements(formatter.format_delimited( + &self.l_curly_token()?, + |leading, trailing| { + Ok(format_elements!( + space.clone(), + soft_indent(format_elements![ + leading, + join_elements( + soft_line_break_or_space(), + formatter.format_separated(specifiers, || token(","))? + ), + trailing, + ]), + space, + )) + }, + &self.r_curly_token()?, + )?); + + let semicolon = if let Some(semicolon) = self.semicolon_token() { + formatter.format_token(&semicolon)? + } else { + token(";") + }; + + Ok(format_elements![list, semicolon]) + } +} diff --git a/crates/rome_formatter/src/ts/export/named_from_clause.rs b/crates/rome_formatter/src/ts/export/named_from_clause.rs new file mode 100644 index 00000000000..34a214aea03 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/named_from_clause.rs @@ -0,0 +1,60 @@ +use crate::{ + empty_element, format_elements, group_elements, if_group_fits_on_single_line, join_elements, + soft_indent, soft_line_break_or_space, space_token, token, FormatElement, FormatResult, + Formatter, ToFormatElement, +}; +use rslint_parser::ast::JsExportNamedFromClause; +use rslint_parser::AstSeparatedList; + +impl ToFormatElement for JsExportNamedFromClause { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let specifiers = self.specifiers(); + let space = if specifiers.len() == 0 { + empty_element() + } else { + if_group_fits_on_single_line(space_token()) + }; + let list = group_elements(formatter.format_delimited( + &self.l_curly_token()?, + |leading, trailing| { + Ok(format_elements!( + space.clone(), + soft_indent(format_elements![ + leading, + join_elements( + soft_line_break_or_space(), + formatter.format_separated(specifiers, || token(","))? + ), + trailing, + ]), + space, + )) + }, + &self.r_curly_token()?, + )?); + + let from = formatter.format_token(&self.from_token()?)?; + let source = formatter.format_node(self.source()?)?; + let assertion = if let Some(assertion) = self.assertion() { + formatter.format_node(assertion)? + } else { + empty_element() + }; + let semicolon = if let Some(semicolon) = self.semicolon_token() { + formatter.format_token(&semicolon)? + } else { + token(";") + }; + + Ok(format_elements![ + list, + space_token(), + from, + space_token(), + source, + space_token(), + assertion, + semicolon + ]) + } +} diff --git a/crates/rome_formatter/src/ts/export/named_from_specifier.rs b/crates/rome_formatter/src/ts/export/named_from_specifier.rs new file mode 100644 index 00000000000..0ac7b335ed7 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/named_from_specifier.rs @@ -0,0 +1,23 @@ +use crate::{ + empty_element, format_elements, space_token, FormatElement, FormatResult, Formatter, + ToFormatElement, +}; +use rslint_parser::ast::JsExportNamedFromSpecifier; + +impl ToFormatElement for JsExportNamedFromSpecifier { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let type_token = if let Some(type_token) = self.type_token() { + format_elements![formatter.format_token(&type_token)?, space_token()] + } else { + empty_element() + }; + let export_as = if let Some(export_as) = self.export_as() { + format_elements![formatter.format_node(export_as)?, space_token()] + } else { + empty_element() + }; + let source = formatter.format_node(self.source_name()?)?; + + Ok(format_elements![type_token, export_as, source]) + } +} diff --git a/crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs b/crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs new file mode 100644 index 00000000000..06fc3f79f46 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs @@ -0,0 +1,19 @@ +use crate::{ + empty_element, format_elements, space_token, FormatElement, FormatResult, Formatter, + ToFormatElement, +}; +use rslint_parser::ast::JsExportNamedShorthandSpecifier; + +impl ToFormatElement for JsExportNamedShorthandSpecifier { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let type_token = if let Some(type_token) = self.type_token() { + format_elements![formatter.format_token(&type_token)?, space_token()] + } else { + empty_element() + }; + + let name = formatter.format_node(self.name()?)?; + + Ok(format_elements![type_token, name]) + } +} diff --git a/crates/rome_formatter/src/ts/export/named_specifier.rs b/crates/rome_formatter/src/ts/export/named_specifier.rs new file mode 100644 index 00000000000..5d66b742cf8 --- /dev/null +++ b/crates/rome_formatter/src/ts/export/named_specifier.rs @@ -0,0 +1,28 @@ +use crate::{ + empty_element, format_elements, space_token, FormatElement, FormatResult, Formatter, + ToFormatElement, +}; +use rslint_parser::ast::JsExportNamedSpecifier; + +impl ToFormatElement for JsExportNamedSpecifier { + fn to_format_element(&self, formatter: &Formatter) -> FormatResult { + let type_token = if let Some(type_token) = self.type_token() { + format_elements![formatter.format_token(&type_token)?, space_token()] + } else { + empty_element() + }; + + let as_token = formatter.format_token(&self.as_token()?)?; + let local_name = formatter.format_node(self.local_name()?)?; + let exported_name = formatter.format_node(self.exported_name()?)?; + + Ok(format_elements![ + type_token, + local_name, + space_token(), + as_token, + space_token(), + exported_name + ]) + } +} diff --git a/crates/rome_formatter/tests/specs/js/module/export/from_clause.js b/crates/rome_formatter/tests/specs/js/module/export/from_clause.js new file mode 100644 index 00000000000..7235ae959b0 --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/from_clause.js @@ -0,0 +1,5 @@ +export * from "hey" + +export * as something_bad_will_happen from "something_bad_might_not_happen" + +export * as something_bad_will_happen from "something_bad_might_not_happen" assert { "type": "json", "type2": "json3"} \ No newline at end of file diff --git a/crates/rome_formatter/tests/specs/js/module/export/from_clause.js.snap b/crates/rome_formatter/tests/specs/js/module/export/from_clause.js.snap new file mode 100644 index 00000000000..07565ecfb4c --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/from_clause.js.snap @@ -0,0 +1,23 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 57 +expression: from_clause.js + +--- +# Input +export * from "hey" + +export * as something_bad_will_happen from "something_bad_might_not_happen" + +export * as something_bad_will_happen from "something_bad_might_not_happen" assert { "type": "json", "type2": "json3"} +--- +# Output +export * from "hey"; + +export * as something_bad_will_happen from "something_bad_might_not_happen"; + +export * as something_bad_will_happen from "something_bad_might_not_happen"assert { + "type": "json", + "type2": "json3", +}; + diff --git a/crates/rome_formatter/tests/specs/js/module/export/named_clause.js b/crates/rome_formatter/tests/specs/js/module/export/named_clause.js new file mode 100644 index 00000000000..bfc4318374d --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/named_clause.js @@ -0,0 +1,7 @@ +export { + // the boo api + boo, + // the buzz api is now bar!! + buzz as bar, + +} \ No newline at end of file diff --git a/crates/rome_formatter/tests/specs/js/module/export/named_clause.js.snap b/crates/rome_formatter/tests/specs/js/module/export/named_clause.js.snap new file mode 100644 index 00000000000..9d060c7922c --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/named_clause.js.snap @@ -0,0 +1,23 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 57 +expression: named_clause.js + +--- +# Input +export { + // the boo api + boo, + // the buzz api is now bar!! + buzz as bar, + +} +--- +# Output +export { + // the boo api + boo, + // the buzz api is now bar!! + buzz as bar, +}; + diff --git a/crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js b/crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js new file mode 100644 index 00000000000..45a71590096 --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js @@ -0,0 +1,9 @@ +export {a, + b as c +} from "fancy" assert { type: "json"} + + +export { + lorem_lorem_lorem_lorem_lorem_lorem_lorem_lorem_lorem, + lorem_lorem_lorem_lorem_lorem_ as ipsum_ipsum_ipsum_ipsum_ipsum_ipsum_ +} from "fancy" assert { type: "json", "type2": "json", type23: "json", "type24": "json"} \ No newline at end of file diff --git a/crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js.snap b/crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js.snap new file mode 100644 index 00000000000..ab9f3a13feb --- /dev/null +++ b/crates/rome_formatter/tests/specs/js/module/export/named_from_clause.js.snap @@ -0,0 +1,30 @@ +--- +source: crates/rome_formatter/tests/spec_test.rs +assertion_line: 57 +expression: named_from_clause.js + +--- +# Input +export {a, + b as c +} from "fancy" assert { type: "json"} + + +export { + lorem_lorem_lorem_lorem_lorem_lorem_lorem_lorem_lorem, + lorem_lorem_lorem_lorem_lorem_ as ipsum_ipsum_ipsum_ipsum_ipsum_ipsum_ +} from "fancy" assert { type: "json", "type2": "json", type23: "json", "type24": "json"} +--- +# Output +export { a, as c b } from "fancy" assert { type: "json" }; + +export { + lorem_lorem_lorem_lorem_lorem_lorem_lorem_lorem_lorem, + as ipsum_ipsum_ipsum_ipsum_ipsum_ipsum_ lorem_lorem_lorem_lorem_lorem_, +} from "fancy" assert { + type: "json", + "type2": "json", + type23: "json", + "type24": "json", +}; + diff --git a/xtask/src/coverage/test262 b/xtask/src/coverage/test262 new file mode 160000 index 00000000000..cba42e88c72 --- /dev/null +++ b/xtask/src/coverage/test262 @@ -0,0 +1 @@ +Subproject commit cba42e88c72c7df634074e8f01f6cba430210909 From bed0370f5d54dded5a4d8ffa10f63321d6ef87bc Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 31 Jan 2022 14:44:14 +0000 Subject: [PATCH 08/11] rebase --- crates/rome_formatter/src/cst.rs | 1 - crates/rome_formatter/src/ts/export/as_clause.rs | 2 +- .../src/ts/export/default_expression_clause.rs | 2 +- crates/rome_formatter/src/ts/export/from_clause.rs | 6 +++--- crates/rome_formatter/src/ts/export/mod.rs | 2 +- crates/rome_formatter/src/ts/export/named_from_clause.rs | 4 ++-- crates/rome_formatter/src/ts/export/named_from_specifier.rs | 4 ++-- .../src/ts/export/named_shorthand_specifier.rs | 2 +- crates/rome_formatter/src/ts/export/named_specifier.rs | 4 ++-- crates/rome_formatter/src/ts/export/variable_clause.rs | 2 +- 10 files changed, 14 insertions(+), 15 deletions(-) diff --git a/crates/rome_formatter/src/cst.rs b/crates/rome_formatter/src/cst.rs index ae01c3d9646..49cf91b22b7 100644 --- a/crates/rome_formatter/src/cst.rs +++ b/crates/rome_formatter/src/cst.rs @@ -1,5 +1,4 @@ use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; -use rslint_parser::ast::JsAnyNamedImportSpecifier::JsNamedImportSpecifier; use rslint_parser::ast::{ ImportMeta, JsArrayBindingPattern, JsArrayExpression, JsArrowFunctionExpression, JsBlockStatement, JsBooleanLiteralExpression, JsCallArguments, JsCallExpression, JsCaseClause, diff --git a/crates/rome_formatter/src/ts/export/as_clause.rs b/crates/rome_formatter/src/ts/export/as_clause.rs index 14d07b13738..989eeddbfaa 100644 --- a/crates/rome_formatter/src/ts/export/as_clause.rs +++ b/crates/rome_formatter/src/ts/export/as_clause.rs @@ -6,7 +6,7 @@ use rslint_parser::ast::JsExportAsClause; impl ToFormatElement for JsExportAsClause { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { let as_token = formatter.format_token(&self.as_token()?)?; - let exported_name = formatter.format_node(self.exported_name()?)?; + let exported_name = formatter.format_node(&self.exported_name()?)?; Ok(format_elements![as_token, space_token(), exported_name]) } diff --git a/crates/rome_formatter/src/ts/export/default_expression_clause.rs b/crates/rome_formatter/src/ts/export/default_expression_clause.rs index 6f348243b65..db1a4a6db5e 100644 --- a/crates/rome_formatter/src/ts/export/default_expression_clause.rs +++ b/crates/rome_formatter/src/ts/export/default_expression_clause.rs @@ -6,7 +6,7 @@ use rslint_parser::ast::JsExportDefaultExpressionClause; impl ToFormatElement for JsExportDefaultExpressionClause { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { let default_token = formatter.format_token(&self.default_token()?)?; - let class = formatter.format_node(self.expression()?)?; + let class = formatter.format_node(&self.expression()?)?; let semicolon = if let Some(semicolon) = &self.semicolon_token() { formatter.format_token(semicolon)? } else { diff --git a/crates/rome_formatter/src/ts/export/from_clause.rs b/crates/rome_formatter/src/ts/export/from_clause.rs index f7d548ad39d..29b88e0582c 100644 --- a/crates/rome_formatter/src/ts/export/from_clause.rs +++ b/crates/rome_formatter/src/ts/export/from_clause.rs @@ -8,14 +8,14 @@ impl ToFormatElement for JsExportFromClause { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { let star = formatter.format_token(&self.star_token()?)?; let export_as = if let Some(export_as) = self.export_as() { - format_elements![formatter.format_node(export_as)?, space_token()] + format_elements![formatter.format_node(&export_as)?, space_token()] } else { empty_element() }; let from = formatter.format_token(&self.from_token()?)?; - let source = formatter.format_node(self.source()?)?; + let source = formatter.format_node(&self.source()?)?; let assertion = if let Some(assertion) = self.assertion() { - formatter.format_node(assertion)? + formatter.format_node(&assertion)? } else { empty_element() }; diff --git a/crates/rome_formatter/src/ts/export/mod.rs b/crates/rome_formatter/src/ts/export/mod.rs index 7e2bd5928a0..6162fcb9f7b 100644 --- a/crates/rome_formatter/src/ts/export/mod.rs +++ b/crates/rome_formatter/src/ts/export/mod.rs @@ -22,7 +22,7 @@ use rslint_parser::ast::JsExport; impl ToFormatElement for JsExport { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { let export_token = formatter.format_token(&self.export_token()?)?; - let export_clause = formatter.format_node(self.export_clause()?)?; + let export_clause = formatter.format_node(&self.export_clause()?)?; Ok(format_elements![export_token, space_token(), export_clause]) } } diff --git a/crates/rome_formatter/src/ts/export/named_from_clause.rs b/crates/rome_formatter/src/ts/export/named_from_clause.rs index 34a214aea03..63130b84850 100644 --- a/crates/rome_formatter/src/ts/export/named_from_clause.rs +++ b/crates/rome_formatter/src/ts/export/named_from_clause.rs @@ -34,9 +34,9 @@ impl ToFormatElement for JsExportNamedFromClause { )?); let from = formatter.format_token(&self.from_token()?)?; - let source = formatter.format_node(self.source()?)?; + let source = formatter.format_node(&self.source()?)?; let assertion = if let Some(assertion) = self.assertion() { - formatter.format_node(assertion)? + formatter.format_node(&assertion)? } else { empty_element() }; diff --git a/crates/rome_formatter/src/ts/export/named_from_specifier.rs b/crates/rome_formatter/src/ts/export/named_from_specifier.rs index 0ac7b335ed7..9e549fecb6f 100644 --- a/crates/rome_formatter/src/ts/export/named_from_specifier.rs +++ b/crates/rome_formatter/src/ts/export/named_from_specifier.rs @@ -12,11 +12,11 @@ impl ToFormatElement for JsExportNamedFromSpecifier { empty_element() }; let export_as = if let Some(export_as) = self.export_as() { - format_elements![formatter.format_node(export_as)?, space_token()] + format_elements![formatter.format_node(&export_as)?, space_token()] } else { empty_element() }; - let source = formatter.format_node(self.source_name()?)?; + let source = formatter.format_node(&self.source_name()?)?; Ok(format_elements![type_token, export_as, source]) } diff --git a/crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs b/crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs index 06fc3f79f46..b22098742ef 100644 --- a/crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs +++ b/crates/rome_formatter/src/ts/export/named_shorthand_specifier.rs @@ -12,7 +12,7 @@ impl ToFormatElement for JsExportNamedShorthandSpecifier { empty_element() }; - let name = formatter.format_node(self.name()?)?; + let name = formatter.format_node(&self.name()?)?; Ok(format_elements![type_token, name]) } diff --git a/crates/rome_formatter/src/ts/export/named_specifier.rs b/crates/rome_formatter/src/ts/export/named_specifier.rs index 5d66b742cf8..b3e0a83b244 100644 --- a/crates/rome_formatter/src/ts/export/named_specifier.rs +++ b/crates/rome_formatter/src/ts/export/named_specifier.rs @@ -13,8 +13,8 @@ impl ToFormatElement for JsExportNamedSpecifier { }; let as_token = formatter.format_token(&self.as_token()?)?; - let local_name = formatter.format_node(self.local_name()?)?; - let exported_name = formatter.format_node(self.exported_name()?)?; + let local_name = formatter.format_node(&self.local_name()?)?; + let exported_name = formatter.format_node(&self.exported_name()?)?; Ok(format_elements![ type_token, diff --git a/crates/rome_formatter/src/ts/export/variable_clause.rs b/crates/rome_formatter/src/ts/export/variable_clause.rs index a0a63823996..7b30efa4108 100644 --- a/crates/rome_formatter/src/ts/export/variable_clause.rs +++ b/crates/rome_formatter/src/ts/export/variable_clause.rs @@ -3,7 +3,7 @@ use rslint_parser::ast::JsExportVariableClause; impl ToFormatElement for JsExportVariableClause { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - let declarations = formatter.format_node(self.declarations()?)?; + let declarations = formatter.format_node(&self.declarations()?)?; let semicolon = if let Some(semicolon) = self.semicolon_token() { formatter.format_token(&semicolon)? } else { From c7657a145d6762e34b9bfd0d81ecbb4f599117fe Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 31 Jan 2022 14:47:51 +0000 Subject: [PATCH 09/11] rebase and fix indent --- crates/rome_formatter/src/cst.rs | 25 +++++++++++-------- .../src/ts/export/named_clause.rs | 4 +-- .../src/ts/export/named_from_clause.rs | 4 +-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/crates/rome_formatter/src/cst.rs b/crates/rome_formatter/src/cst.rs index 49cf91b22b7..705e96de7a5 100644 --- a/crates/rome_formatter/src/cst.rs +++ b/crates/rome_formatter/src/cst.rs @@ -4,17 +4,20 @@ use rslint_parser::ast::{ JsBlockStatement, JsBooleanLiteralExpression, JsCallArguments, JsCallExpression, JsCaseClause, JsCatchClause, JsClassStatement, JsConstructorParameters, JsContinueStatement, JsDebuggerStatement, JsDefaultClause, JsDefaultImportSpecifier, JsDoWhileStatement, - JsEmptyStatement, JsExportDefaultExpressionClause, JsExportDefaultFunctionClause, - JsExportFunctionClause, JsExportVariableClause, JsExpressionStatement, JsFinallyClause, - JsForInStatement, JsForStatement, JsFunctionStatement, JsGetterClassMember, - JsIdentifierBinding, JsIdentifierExpression, JsIfStatement, JsImport, JsImportAssertion, - JsImportAssertionEntry, JsImportBareClause, JsImportCallExpression, JsImportDefaultClause, - JsImportNamedClause, JsImportNamespaceClause, JsLabeledStatement, JsLiteralExportName, - JsModule, JsModuleSource, JsNamedImportSpecifier, JsNamedImportSpecifiers, - JsNamespaceImportSpecifier, JsNullLiteralExpression, JsNumberLiteralExpression, - JsObjectExpression, JsParameters, JsPropertyClassMember, JsPropertyObjectMember, - JsReturnStatement, JsScript, JsSequenceExpression, JsSetterClassMember, - JsShorthandNamedImportSpecifier, JsShorthandPropertyObjectMember, JsSpread, JsStatementList, + JsEmptyStatement, JsExport, JsExportAsClause, JsExportClassClause, JsExportDefaultClassClause, + JsExportDefaultExpressionClause, JsExportDefaultFunctionClause, JsExportFromClause, + JsExportFunctionClause, JsExportNamedClause, JsExportNamedFromClause, + JsExportNamedFromSpecifier, JsExportNamedShorthandSpecifier, JsExportNamedSpecifier, + JsExportVariableClause, JsExpressionStatement, JsFinallyClause, JsForInStatement, + JsForStatement, JsFunctionStatement, JsGetterClassMember, JsIdentifierBinding, + JsIdentifierExpression, JsIfStatement, JsImport, JsImportAssertion, JsImportAssertionEntry, + JsImportBareClause, JsImportCallExpression, JsImportDefaultClause, JsImportNamedClause, + JsImportNamespaceClause, JsLabeledStatement, JsLiteralExportName, JsModule, JsModuleSource, + JsNamedImportSpecifier, JsNamedImportSpecifiers, JsNamespaceImportSpecifier, + JsNullLiteralExpression, JsNumberLiteralExpression, JsObjectExpression, JsParameters, + JsPropertyClassMember, JsPropertyObjectMember, JsReturnStatement, JsScript, + JsSequenceExpression, JsSetterClassMember, JsShorthandNamedImportSpecifier, + JsShorthandPropertyObjectMember, JsSpread, JsStatementList, JsStaticInitializationBlockClassMember, JsStringLiteralExpression, JsSwitchStatement, JsTemplate, JsTemplateChunkElement, JsTemplateElement, JsTryStatement, JsUnknownAssignment, JsUnknownBinding, JsUnknownExpression, JsUnknownImportAssertionEntry, JsUnknownMember, diff --git a/crates/rome_formatter/src/ts/export/named_clause.rs b/crates/rome_formatter/src/ts/export/named_clause.rs index 26799c3dcb5..b16ceb4c2f4 100644 --- a/crates/rome_formatter/src/ts/export/named_clause.rs +++ b/crates/rome_formatter/src/ts/export/named_clause.rs @@ -1,6 +1,6 @@ use crate::{ empty_element, format_elements, group_elements, if_group_fits_on_single_line, join_elements, - soft_indent, soft_line_break_or_space, space_token, token, FormatElement, FormatResult, + soft_block_indent, soft_line_break_or_space, space_token, token, FormatElement, FormatResult, Formatter, ToFormatElement, }; use rslint_parser::ast::JsExportNamedClause; @@ -19,7 +19,7 @@ impl ToFormatElement for JsExportNamedClause { |leading, trailing| { Ok(format_elements!( space.clone(), - soft_indent(format_elements![ + soft_block_indent(format_elements![ leading, join_elements( soft_line_break_or_space(), diff --git a/crates/rome_formatter/src/ts/export/named_from_clause.rs b/crates/rome_formatter/src/ts/export/named_from_clause.rs index 63130b84850..98fa69733ac 100644 --- a/crates/rome_formatter/src/ts/export/named_from_clause.rs +++ b/crates/rome_formatter/src/ts/export/named_from_clause.rs @@ -1,6 +1,6 @@ use crate::{ empty_element, format_elements, group_elements, if_group_fits_on_single_line, join_elements, - soft_indent, soft_line_break_or_space, space_token, token, FormatElement, FormatResult, + soft_block_indent, soft_line_break_or_space, space_token, token, FormatElement, FormatResult, Formatter, ToFormatElement, }; use rslint_parser::ast::JsExportNamedFromClause; @@ -19,7 +19,7 @@ impl ToFormatElement for JsExportNamedFromClause { |leading, trailing| { Ok(format_elements!( space.clone(), - soft_indent(format_elements![ + soft_block_indent(format_elements![ leading, join_elements( soft_line_break_or_space(), From 17671a9c4d3915b381e0a6006dbabd57d6c023d3 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 31 Jan 2022 14:51:06 +0000 Subject: [PATCH 10/11] revert change --- xtask/src/coverage/test262 | 1 - 1 file changed, 1 deletion(-) delete mode 160000 xtask/src/coverage/test262 diff --git a/xtask/src/coverage/test262 b/xtask/src/coverage/test262 deleted file mode 160000 index cba42e88c72..00000000000 --- a/xtask/src/coverage/test262 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cba42e88c72c7df634074e8f01f6cba430210909 From ff5afa2a450ccd9ca6debcd2f3c280fa551a78ee Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 1 Feb 2022 08:49:39 +0000 Subject: [PATCH 11/11] code review --- crates/rome_formatter/src/ts/export/named_clause.rs | 2 +- .../src/ts/export/named_from_clause.rs | 2 +- crates/rome_formatter/src/ts/root/module_item.rs | 12 ------------ 3 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 crates/rome_formatter/src/ts/root/module_item.rs diff --git a/crates/rome_formatter/src/ts/export/named_clause.rs b/crates/rome_formatter/src/ts/export/named_clause.rs index b16ceb4c2f4..cb96a1ec613 100644 --- a/crates/rome_formatter/src/ts/export/named_clause.rs +++ b/crates/rome_formatter/src/ts/export/named_clause.rs @@ -9,7 +9,7 @@ use rslint_parser::AstSeparatedList; impl ToFormatElement for JsExportNamedClause { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { let specifiers = self.specifiers(); - let space = if specifiers.len() == 0 { + let space = if specifiers.is_empty() { empty_element() } else { if_group_fits_on_single_line(space_token()) diff --git a/crates/rome_formatter/src/ts/export/named_from_clause.rs b/crates/rome_formatter/src/ts/export/named_from_clause.rs index 98fa69733ac..e87b112b0a4 100644 --- a/crates/rome_formatter/src/ts/export/named_from_clause.rs +++ b/crates/rome_formatter/src/ts/export/named_from_clause.rs @@ -9,7 +9,7 @@ use rslint_parser::AstSeparatedList; impl ToFormatElement for JsExportNamedFromClause { fn to_format_element(&self, formatter: &Formatter) -> FormatResult { let specifiers = self.specifiers(); - let space = if specifiers.len() == 0 { + let space = if specifiers.is_empty() { empty_element() } else { if_group_fits_on_single_line(space_token()) diff --git a/crates/rome_formatter/src/ts/root/module_item.rs b/crates/rome_formatter/src/ts/root/module_item.rs deleted file mode 100644 index ca7aa412a6f..00000000000 --- a/crates/rome_formatter/src/ts/root/module_item.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::{FormatElement, FormatResult, Formatter, ToFormatElement}; -use rslint_parser::ast::JsAnyModuleItem; - -impl ToFormatElement for JsAnyModuleItem { - fn to_format_element(&self, formatter: &Formatter) -> FormatResult { - match self { - JsAnyModuleItem::JsAnyStatement(statement) => statement.to_format_element(formatter), - JsAnyModuleItem::JsExport(_) => todo!(), - JsAnyModuleItem::JsImport(import) => import.to_format_element(formatter), - } - } -}