fix(rome_js_formatter): restrict export line break for single specifier
MODIFY
crates/rome_js_formatter/src/js/module/export_named_from_clause.rs
crates/rome_js_formatter/src/js/module/export_named_from_clause.rs
@@ -4,7 +4,7 @@ use rome_formatter::write;
use rome_js_syntax::JsExportNamedFromClause;
use rome_js_syntax::JsExportNamedFromClauseFields;
-use rome_rowan::AstNode;
+use rome_rowan::{AstNode, AstSeparatedElement};
#[derive(Debug, Clone, Default)]
pub struct FormatJsExportNamedFromClause;
@@ -29,6 +29,20 @@ impl FormatNodeRule<JsExportNamedFromClause> for FormatJsExportNamedFromClause {
write!(f, [l_curly_token.format(),])?;
+ match specifiers.elements().next() {
+ Some(AstSeparatedElement {
+ node: Ok(node),
+ trailing_separator: Ok(separator),
+ }) if specifiers.len() == 1 && !f.comments().has_comments(node.syntax()) => {
+ write!(f, [space(), node.format()])?;
+
+ if let Some(separator) = separator {
+ write!(f, [format_removed(&separator)])?;
+ }
+
+ write!(f, [space()])?;
+ }
+ _ => {
if node_has_leading_newline(specifiers.syntax()) {
write!(f, [block_indent(&specifiers.format()),])?;
} else {
@@ -37,6 +51,8 @@ impl FormatNodeRule<JsExportNamedFromClause> for FormatJsExportNamedFromClause {
[group(&soft_space_or_block_indent(&specifiers.format())),]
)?;
};
+ }
+ }
write![
f,

MODIFY
crates/rome_js_formatter/src/js/module/import_named_clause.rs
crates/rome_js_formatter/src/js/module/import_named_clause.rs
@@ -64,13 +64,7 @@ impl FormatNodeRule<JsImportNamedClause> for FormatJsImportNamedClause {
)),
Ok(separator),
) => {
- if specifier.syntax().has_comments_direct()
- || separator
- .map(|sep| {
- sep.has_leading_comments() || sep.has_trailing_comments()
- })
- .unwrap_or(false)
- {
+ if f.comments().has_comments(specifier.syntax()) {
write!(f, [named_import.format()])
} else {
let JsNamedImportSpecifiersFields {

MODIFY
crates/rome_js_formatter/tests/specs/js/module/export/named_from_clause.js
crates/rome_js_formatter/tests/specs/js/module/export/named_from_clause.js
@@ -7,3 +7,12 @@ 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"}
+
+
+export { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+export { loooooooooooooooooooooooooooooooooooooooooooooooooong, } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+export {
+// comment
+loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
\ No newline at end of file

MODIFY
crates/rome_js_formatter/tests/specs/js/module/export/named_from_clause.js.snap
crates/rome_js_formatter/tests/specs/js/module/export/named_from_clause.js.snap
@@ -15,6 +15,15 @@ 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"}
+
+
+export { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+export { loooooooooooooooooooooooooooooooooooooooooooooooooong, } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+export {
+// comment
+loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
```
@@ -44,6 +53,21 @@ export {
type23: "json",
"type24": "json",
};
+
+export { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
+
+export { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
+
+export {
+ // comment
+ loooooooooooooooooooooooooooooooooooooooooooooooooong,
+} from "loooooooooooooooooooooooooooooooooooooooooooooong";
+
+
+## Lines exceeding width of 80 characters
+
+ 13: export { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
+ 15: export { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
```

MODIFY
crates/rome_js_formatter/tests/specs/js/module/import/import_specifiers.js
crates/rome_js_formatter/tests/specs/js/module/import/import_specifiers.js
@@ -18,3 +18,11 @@ import {loooooooooooooooooooong3,loooooooooooooooooooong5,loooooooooooooooooooon
import { f as x, default as w, "a-b-c" as y } from "b";
import loooooooooooooooooooong7, { loooooooooooooooooooong8, loooooooooooooooooooong9, loooooooooooooooooooong10} from "module"
+
+import { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+import { loooooooooooooooooooooooooooooooooooooooooooooooooong, } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+import {
+// comment
+loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
\ No newline at end of file

MODIFY
crates/rome_js_formatter/tests/specs/js/module/import/import_specifiers.js.snap
crates/rome_js_formatter/tests/specs/js/module/import/import_specifiers.js.snap
@@ -26,6 +26,14 @@ import {loooooooooooooooooooong3,loooooooooooooooooooong5,loooooooooooooooooooon
import { f as x, default as w, "a-b-c" as y } from "b";
import loooooooooooooooooooong7, { loooooooooooooooooooong8, loooooooooooooooooooong9, loooooooooooooooooooong10} from "module"
+
+import { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+import { loooooooooooooooooooooooooooooooooooooooooooooooooong, } from "loooooooooooooooooooooooooooooooooooooooooooooong"
+
+import {
+// comment
+loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong"
```
@@ -71,6 +79,21 @@ import loooooooooooooooooooong7, {
loooooooooooooooooooong9,
loooooooooooooooooooong10,
} from "module";
+
+import { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
+
+import { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
+
+import {
+ // comment
+ loooooooooooooooooooooooooooooooooooooooooooooooooong,
+} from "loooooooooooooooooooooooooooooooooooooooooooooong";
+
+
+## Lines exceeding width of 80 characters
+
+ 29: import { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
+ 31: import { loooooooooooooooooooooooooooooooooooooooooooooooooong } from "loooooooooooooooooooooooooooooooooooooooooooooong";
```

MODIFY
crates/rome_rowan/src/ast/mod.rs
crates/rome_rowan/src/ast/mod.rs
@@ -368,8 +368,8 @@ impl<L: Language, N: AstNode<Language = L>> DoubleEndedIterator for AstNodeListI
#[derive(Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct AstSeparatedElement<L: Language, N> {
- node: SyntaxResult<N>,
- trailing_separator: SyntaxResult<Option<SyntaxToken<L>>>,
+ pub node: SyntaxResult<N>,
+ pub trailing_separator: SyntaxResult<Option<SyntaxToken<L>>>,
}
impl<L: Language, N: AstNode<Language = L>> AstSeparatedElement<L, N> {

fix(rome_js_formatter): restrict export line break for single specifier (#3726)

Co-authored-by: Micha Reiser <micha@reiser.io>