Skip to content

Commit 1b7c60b

Browse files
authored
fix: trailing comments sometimes being inserted before the comma in parameter lists (#651)
1 parent dae690d commit 1b7c60b

File tree

4 files changed

+64
-9
lines changed

4 files changed

+64
-9
lines changed

Cargo.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ anyhow = "1.0.64"
3434
deno_ast = { version = "0.40.0", features = ["view"] }
3535
dprint-core = { version = "0.66.2", features = ["formatting"] }
3636
dprint-core-macros = "0.1.0"
37+
# temp until https://github.com/swc-project/swc/issues/9290 is fixed
38+
dprint-swc-ext = "0.17.1"
3739
percent-encoding = "2.3.1"
3840
rustc-hash = "1.1.0"
3941
serde = { version = "1.0.144", features = ["derive"] }

src/generation/generate.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ use crate::configuration::*;
2626
use crate::utils;
2727

2828
pub fn generate(parsed_source: &ParsedSource, config: &Configuration) -> PrintItems {
29-
// println!("Leading: {:?}", parsed_source.comments().leading_map());
30-
// println!("Trailing: {:?}", parsed_source.comments().trailing_map());
29+
// eprintln!("Leading: {:?}", parsed_source.comments().leading_map());
30+
// eprintln!("Trailing: {:?}", parsed_source.comments().trailing_map());
3131

3232
parsed_source.with_view(|program| {
3333
let program_node = program.into();
@@ -52,13 +52,13 @@ fn gen_node<'a>(node: Node<'a>, context: &mut Context<'a>) -> PrintItems {
5252

5353
fn gen_node_with_inner_gen<'a>(node: Node<'a>, context: &mut Context<'a>, inner_gen: impl FnOnce(PrintItems, &mut Context<'a>) -> PrintItems) -> PrintItems {
5454
let node_kind = node.kind();
55-
// println!("Node kind: {:?}", node_kind);
56-
// println!("Text: {:?}", node.text());
57-
// println!("Range: {:?}", node.range());
55+
// eprintln!("Node kind: {:?}", node_kind);
56+
// eprintln!("Text: {:?}", node.text());
57+
// eprintln!("Range: {:?}", node.range());
5858

5959
// store info
6060
let past_current_node = std::mem::replace(&mut context.current_node, node);
61-
let parent_hi = past_current_node.end();
61+
let parent_end = past_current_node.end();
6262
context.parent_stack.push(past_current_node);
6363

6464
// handle decorators (since their starts can come before their parent)
@@ -110,7 +110,7 @@ fn gen_node_with_inner_gen<'a>(node: Node<'a>, context: &mut Context<'a>, inner_
110110

111111
// Get the trailing comments -- This needs to be done based on the parse
112112
// stack order because certain nodes like binary expressions are flattened
113-
if node_end != parent_hi || matches!(context.parent().kind(), NodeKind::Module | NodeKind::Script) {
113+
if node_end != parent_end || matches!(context.parent().kind(), NodeKind::Module | NodeKind::Script) {
114114
let trailing_comments = context.comments.trailing_comments_with_previous(node_end);
115115
items.extend(gen_comments_as_trailing(&node_range, trailing_comments, context));
116116
}

tests/specs/issues/issue0650.txt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
~~ lineWidth: 120, indentWidth: 2 ~~
2+
== should work ==
3+
function foo(arg: number, /** @deferred */ b) {}
4+
5+
[expect]
6+
function foo(arg: number, /** @deferred */ b) {}
7+
8+
== interface method ==
9+
interface A {
10+
b(
11+
arg1: { new(...args: any[]): T }, // This is a comment
12+
arg2,
13+
)
14+
}
15+
16+
[expect]
17+
interface A {
18+
b(
19+
arg1: { new(...args: any[]): T }, // This is a comment
20+
arg2,
21+
);
22+
}
23+
24+
== long example ==
25+
function foo(arg: number, /** @deferred */ cb: () => void): void {}
26+
27+
interface Foo {
28+
method<T>(
29+
arg: { new(...args: any[]): T }, // This is a comment
30+
arg2: (instance: T) => HTMLElement | undefined,
31+
): Disposable;
32+
33+
method2<T>(
34+
arg: { new(...args: any[]): T },
35+
arg2: (instance: T) => HTMLElement | undefined, // This is a comment
36+
): Disposable;
37+
}
38+
39+
[expect]
40+
function foo(arg: number, /** @deferred */ cb: () => void): void {}
41+
42+
interface Foo {
43+
method<T>(
44+
arg: { new(...args: any[]): T }, // This is a comment
45+
arg2: (instance: T) => HTMLElement | undefined,
46+
): Disposable;
47+
48+
method2<T>(
49+
arg: { new(...args: any[]): T },
50+
arg2: (instance: T) => HTMLElement | undefined, // This is a comment
51+
): Disposable;
52+
}

0 commit comments

Comments
 (0)