Skip to content

Commit

Permalink
fix(ecma/codegen): don't print trailing coma for rest argument
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait committed Dec 9, 2022
1 parent 66b5282 commit f9d831e
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 12 deletions.
55 changes: 55 additions & 0 deletions crates/swc_ecma_codegen/src/ctx.rs
@@ -0,0 +1,55 @@
use std::ops::{Deref, DerefMut};

use swc_common::SourceMapper;
use swc_ecma_ast::SourceMapperExt;

use crate::{text_writer::WriteJs, Emitter};

impl<'a, 'b, W, S: SourceMapper> Emitter<'a, W, S>
where
W: WriteJs,
S: SourceMapperExt,
{
/// Original context is restored when returned guard is dropped.
#[inline]
pub(super) fn with_ctx(&mut self, ctx: Ctx) -> WithCtx<'b, W, S> {
let orig_ctx = self.ctx;

self.ctx = ctx;

WithCtx {
orig_ctx,
inner: self,
}
}
}

#[derive(Debug, Default, Clone, Copy)]
pub(crate) struct Ctx {
pub in_function_params: bool,
}

pub(super) struct WithCtx<'w, I: 'w + WriteJs, S: 'w + SourceMapper + SourceMapperExt> {
inner: &'w mut Emitter<'w, I, S>,
orig_ctx: Ctx,
}

impl<'w, I: 'w + WriteJs, S: 'w + SourceMapper + SourceMapperExt> Deref for WithCtx<'w, I, S> {
type Target = Emitter<'w, I, S>;

fn deref(&self) -> &Emitter<'w, I, S> {
self.inner
}
}

impl<'w, I: 'w + WriteJs, S: 'w + SourceMapper + SourceMapperExt> DerefMut for WithCtx<'w, I, S> {
fn deref_mut(&mut self) -> &mut Emitter<'w, I, S> {
self.inner
}
}

impl<'w, I: 'w + WriteJs, S: 'w + SourceMapper + SourceMapperExt> Drop for WithCtx<'w, I, S> {
fn drop(&mut self) {
self.inner.ctx = self.orig_ctx;
}
}
13 changes: 1 addition & 12 deletions crates/swc_ecma_codegen/src/lib.rs
Expand Up @@ -2481,23 +2481,12 @@ where
self.emit_leading_comments_of_span(node.span(), false)?;

srcmap!(node, true);

let is_last_rest = match node.props.last() {
Some(ObjectPatProp::Rest(..)) => true,
_ => false,
};
let format = if is_last_rest {
ListFormat::ObjectBindingPatternElements ^ ListFormat::AllowTrailingComma
} else {
ListFormat::ObjectBindingPatternElements
};

punct!("{");

self.emit_list(
node.span(),
Some(&node.props),
format | ListFormat::CanSkipTrailingComma,
ListFormat::ObjectBindingPatternElements | ListFormat::CanSkipTrailingComma,
)?;

punct!("}");
Expand Down
14 changes: 14 additions & 0 deletions crates/swc_ecma_codegen/tests/fixture/issue-6589/js/input.js
@@ -0,0 +1,14 @@
export function func({a, b, ...rest}) {
console.log(a,b, rest)
}

const other = { unknow: "foo" }

let foo = {
...other,
bar: "baz"
};
let bar = {
bar: "baz",
...other
};
14 changes: 14 additions & 0 deletions crates/swc_ecma_codegen/tests/fixture/issue-6589/js/output.js
@@ -0,0 +1,14 @@
export function func({ a , b , ...rest }) {
console.log(a, b, rest);
}
const other = {
unknow: "foo"
};
let foo = {
...other,
bar: "baz"
};
let bar = {
bar: "baz",
...other
};
@@ -0,0 +1 @@
export function func({a,b,...rest}){console.log(a,b,rest)}const other={unknow:"foo"};let foo={...other,bar:"baz"};let bar={bar:"baz",...other};
21 changes: 21 additions & 0 deletions crates/swc_ecma_codegen/tests/fixture/issue-6589/ts/input.ts
@@ -0,0 +1,21 @@
export function func({
a,
b,
...rest
}: {
a: string,
b: string,
}) {
console.log(a,b, rest)
}

const other = { unknow: "foo" }

let foo = {
...other,
bar: "baz"
};
let bar = {
bar: "baz",
...other
};
17 changes: 17 additions & 0 deletions crates/swc_ecma_codegen/tests/fixture/issue-6589/ts/output.ts
@@ -0,0 +1,17 @@
export function func({ a , b , ...rest }: {
a: string;
b: string;
}) {
console.log(a, b, rest);
}
const other = {
unknow: "foo"
};
let foo = {
...other,
bar: "baz"
};
let bar = {
bar: "baz",
...other
};

0 comments on commit f9d831e

Please sign in to comment.