Skip to content

Commit bbf19b6

Browse files
committed
wip
1 parent 57eb042 commit bbf19b6

File tree

10 files changed

+76
-20
lines changed

10 files changed

+76
-20
lines changed

deployment/schema.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,17 @@
284284
},
285285
"forceMultiLineSpecifiers": {
286286
"description": "If code import/export specifiers should be forced to be on multiple lines.",
287-
"type": "boolean",
288-
"default": false,
287+
"type": "string",
288+
"default": "never",
289289
"oneOf": [{
290-
"const": true,
290+
"const": "always",
291291
"description": ""
292292
}, {
293-
"const": false,
293+
"const": "never",
294294
"description": ""
295+
}, {
296+
"const": "onlyWhenMultiple",
297+
"description": "Force multiple lines only if importing more than one thing."
295298
}]
296299
},
297300
"sortOrder": {

src/configuration/builder.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -759,12 +759,12 @@ impl ConfigurationBuilder {
759759

760760
/* force multi line specifiers */
761761

762-
pub fn export_declaration_force_multi_line(&mut self, value: bool) -> &mut Self {
763-
self.insert("exportDeclaration.forceMultiLine", value.into())
762+
pub fn export_declaration_force_multi_line(&mut self, value: ForceMultiLine) -> &mut Self {
763+
self.insert("exportDeclaration.forceMultiLine", value.to_string().into())
764764
}
765765

766-
pub fn import_declaration_force_multi_line(&mut self, value: bool) -> &mut Self {
767-
self.insert("importDeclaration.forceMultiLine", value.into())
766+
pub fn import_declaration_force_multi_line(&mut self, value: ForceMultiLine) -> &mut Self {
767+
self.insert("importDeclaration.forceMultiLine", value.to_string().into())
768768
}
769769

770770
/* member spacing */
@@ -1220,8 +1220,8 @@ mod tests {
12201220
.export_declaration_force_single_line(true)
12211221
.import_declaration_force_single_line(true)
12221222
/* force multi line specifiers */
1223-
.export_declaration_force_multi_line(true)
1224-
.import_declaration_force_multi_line(true)
1223+
.export_declaration_force_multi_line(ForceMultiLine::Never)
1224+
.import_declaration_force_multi_line(ForceMultiLine::Never)
12251225
/* space settings */
12261226
.binary_expression_space_surrounding_bitwise_and_arithmetic_operator(true)
12271227
.comment_line_force_space_after_slashes(false)

src/configuration/resolve_config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,8 @@ pub fn resolve_config(config: ConfigKeyMap, global_config: &GlobalConfiguration)
254254
import_declaration_force_single_line: get_value(&mut config, "importDeclaration.forceSingleLine", false, &mut diagnostics),
255255
export_declaration_force_single_line: get_value(&mut config, "exportDeclaration.forceSingleLine", false, &mut diagnostics),
256256
/* force multi line specifiers */
257-
import_declaration_force_multi_line: get_value(&mut config, "importDeclaration.forceMultiLine", false, &mut diagnostics),
258-
export_declaration_force_multi_line: get_value(&mut config, "exportDeclaration.forceMultiLine", false, &mut diagnostics),
257+
import_declaration_force_multi_line: get_value(&mut config, "importDeclaration.forceMultiLine", ForceMultiLine::Never, &mut diagnostics),
258+
export_declaration_force_multi_line: get_value(&mut config, "exportDeclaration.forceMultiLine", ForceMultiLine::Never, &mut diagnostics),
259259
/* space settings */
260260
binary_expression_space_surrounding_bitwise_and_arithmetic_operator: get_value(
261261
&mut config,

src/configuration/types.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ pub enum TrailingCommas {
5757

5858
generate_str_to_from![TrailingCommas, [Always, "always"], [Never, "never"], [OnlyMultiLine, "onlyMultiLine"]];
5959

60+
/// Force multilines possibilities.
61+
#[derive(Clone, PartialEq, Copy, Serialize, Deserialize)]
62+
#[serde(rename_all = "camelCase")]
63+
pub enum ForceMultiLine {
64+
/// Multiline imports/exports should not be forced.
65+
Never,
66+
/// Always force multiline imports/exports.
67+
Always,
68+
/// Mulitline imports/exports should be forced only when importing/exporting multiple items.
69+
OnlyWhenMultiple,
70+
}
71+
72+
generate_str_to_from![ForceMultiLine, [Always, "always"], [Never, "never"], [OnlyWhenMultiple, "onlyWhenMultiple"]];
73+
6074
/// Where to place the opening brace.
6175
#[derive(Clone, PartialEq, Copy, Serialize, Deserialize)]
6276
#[serde(rename_all = "camelCase")]
@@ -541,9 +555,9 @@ pub struct Configuration {
541555
pub export_declaration_force_single_line: bool,
542556
/* force multi line specifiers */
543557
#[serde(rename = "exportDeclaration.forceMultiLine")]
544-
pub export_declaration_force_multi_line: bool,
558+
pub export_declaration_force_multi_line: ForceMultiLine,
545559
#[serde(rename = "importDeclaration.forceMultiLine")]
546-
pub import_declaration_force_multi_line: bool,
560+
pub import_declaration_force_multi_line: ForceMultiLine,
547561

548562
/* use space separator */
549563
#[serde(rename = "binaryExpression.spaceSurroundingBitwiseAndArithmeticOperator")]

src/generation/generate.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,10 +1033,15 @@ fn gen_export_named_decl<'a>(node: &NamedExport<'a>, context: &mut Context<'a>)
10331033
}
10341034

10351035
let force_single_line = context.config.export_declaration_force_single_line && !contains_line_or_multiline_comment(node.into(), context.program);
1036+
1037+
let force_multi_line = !force_single_line
1038+
&& ((context.config.export_declaration_force_multi_line == ForceMultiLine::Always)
1039+
|| (named_exports.len() > 1 && context.config.export_declaration_force_multi_line == ForceMultiLine::OnlyWhenMultiple));
1040+
10361041
let should_single_line = force_single_line
10371042
|| (default_export.is_none()
10381043
&& namespace_export.is_none()
1039-
&& (named_exports.len() <= 1 && !context.config.export_declaration_force_multi_line)
1044+
&& !force_multi_line
10401045
&& node.start_line_fast(context.program) == node.end_line_fast(context.program));
10411046

10421047
// generate
@@ -1218,10 +1223,14 @@ fn gen_import_decl<'a>(node: &ImportDecl<'a>, context: &mut Context<'a>) -> Prin
12181223
}
12191224

12201225
let force_single_line = context.config.import_declaration_force_single_line && !contains_line_or_multiline_comment(node.into(), context.program);
1226+
let force_multi_line = !force_single_line
1227+
&& ((context.config.import_declaration_force_multi_line == ForceMultiLine::Always)
1228+
|| (named_imports.len() > 1 && context.config.import_declaration_force_multi_line == ForceMultiLine::OnlyWhenMultiple));
1229+
12211230
let should_single_line = force_single_line
12221231
|| (default_import.is_none()
12231232
&& namespace_import.is_none()
1224-
&& (named_imports.len() <= 1 && !context.config.import_declaration_force_multi_line)
1233+
&& !force_multi_line
12251234
&& node.start_line_fast(context.program) == node.end_line_fast(context.program));
12261235
let has_named_imports = !named_imports.is_empty() || {
12271236
let from_keyword = context.token_finder.get_previous_token_if_from_keyword(node.src);
@@ -1467,7 +1476,7 @@ struct GenNamedImportOrExportSpecifierOptions<'a> {
14671476
parent: Node<'a>,
14681477
specifiers: Vec<Node<'a>>,
14691478
force_single_line: bool,
1470-
force_multi_line_specifiers: bool,
1479+
force_multi_line_specifiers: ForceMultiLine,
14711480
}
14721481

14731482
fn gen_named_import_or_export_specifiers<'a>(opts: GenNamedImportOrExportSpecifierOptions<'a>, context: &mut Context<'a>) -> PrintItems {
@@ -1487,6 +1496,14 @@ fn gen_named_import_or_export_specifiers<'a>(opts: GenNamedImportOrExportSpecifi
14871496
context,
14881497
);
14891498

1499+
fn get_force_multiline(parent_decl: Node, context: &Context) -> ForceMultiLine {
1500+
match parent_decl {
1501+
Node::NamedExport(_) => context.config.export_declaration_force_multi_line,
1502+
Node::ImportDecl(_) => context.config.import_declaration_force_multi_line,
1503+
_ => unreachable!(),
1504+
}
1505+
}
1506+
14901507
fn get_trailing_commas(parent_decl: Node, context: &Context) -> TrailingCommas {
14911508
match parent_decl {
14921509
Node::NamedExport(_) => context.config.export_declaration_trailing_commas,

tests/specs/declarations/export/ExportDeclaration_ForceMultiLine_True.txt renamed to tests/specs/declarations/export/ExportDeclaration_ForceMultiLine_Always.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
~~ exportDeclaration.forceMultiLine: true, lineWidth: 40 ~~
1+
~~ exportDeclaration.forceMultiLine: always, lineWidth: 40 ~~
22
== should always add a new line between exports ==
33
export { testing, a, b, c, d, e } from "./test.ts";
44
export { testing, a, b, c, d, e // test

tests/specs/declarations/import/ImportDeclaration_ForceMultiLine.txt renamed to tests/specs/declarations/import/ImportDeclaration_ForceMultiLine_Always.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
~~ importDeclaration.forceMultiLine: true, lineWidth: 40 ~~
1+
~~ importDeclaration.forceMultiLine: always, lineWidth: 40 ~~
22
== should always add a new line between ==
33
import { testing, a, b, c, d, e } from "./test.ts";
44
import { testing, a, b, c, d, e // test
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
~~ importDeclaration.forceMultiLine: never, lineWidth: 40 ~~
2+
== should never add a new line between ==
3+
import { a, b } from "./test.ts";
4+
5+
[expect]
6+
import { a, b } from "./test.ts";
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
~~ importDeclaration.forceMultiLine: onlyWhenMultiple, lineWidth: 40 ~~
2+
== should break imports when more than one ==
3+
import { a, b } from "./test.ts";
4+
5+
[expect]
6+
import {
7+
a,
8+
b,
9+
} from "./test.ts";
10+
11+
== should not break single-line imports ==
12+
import { a } from "./test.ts";
13+
14+
15+
[expect]
16+
import {a,} from "./test.ts";

tests/specs/declarations/import/NamedImports_PreferHanging_True.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { test1, test2, test3 as something } from "test";
1313
import { test1, test2,
1414
test3 as something } from "test";
1515

16-
== should break up on `as` when really long on the same line ==
16+
== should break up on `as` when really long on the same line (only) ==
1717
import { loooooooooooooooooooooooooooooooooooong as alias, test } from "test";
1818

1919
[expect]

0 commit comments

Comments
 (0)