From 4e35cd31223074341b6e3409edc2077a052391a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 20 Nov 2023 14:05:30 +0900 Subject: [PATCH 01/25] Fix AST --- crates/swc_ecma_ast/src/prop.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/swc_ecma_ast/src/prop.rs b/crates/swc_ecma_ast/src/prop.rs index 979027284f49..0ec399c7506c 100644 --- a/crates/swc_ecma_ast/src/prop.rs +++ b/crates/swc_ecma_ast/src/prop.rs @@ -6,10 +6,9 @@ use crate::{ function::Function, ident::Ident, lit::{BigInt, Number, Str}, - pat::Pat, stmt::BlockStmt, typescript::TsTypeAnn, - Id, MemberProp, + Id, MemberProp, Param, }; #[ast_node] @@ -76,7 +75,7 @@ pub struct GetterProp { pub struct SetterProp { pub span: Span, pub key: PropName, - pub param: Box, + pub params: Vec, #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Option, } From 845dc2cc9eb2bf8437c6b6d0e3b24b7a2bed332f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 20 Nov 2023 14:05:56 +0900 Subject: [PATCH 02/25] Fix parser --- crates/swc_ecma_parser/src/parser/object.rs | 31 ++++++--------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/crates/swc_ecma_parser/src/parser/object.rs b/crates/swc_ecma_parser/src/parser/object.rs index 1b2fbc5af629..2dcfdcd07729 100644 --- a/crates/swc_ecma_parser/src/parser/object.rs +++ b/crates/swc_ecma_parser/src/parser/object.rs @@ -351,28 +351,15 @@ impl ParseObject> for Parser { false, ) .map(|v| *v) - .map( - |Function { - mut params, body, .. - }| { - params.retain(|p| match &p.pat { - Pat::Ident(p) => p.sym != "this", - _ => true, - }); - - // debug_assert_eq!(params.len(), 1); - PropOrSpread::Prop(Box::new(Prop::Setter(SetterProp { - span: span!(parser, start), - key, - body, - param: Box::new( - params.into_iter().map(|p| p.pat).next().unwrap_or( - Pat::Invalid(Invalid { span: key_span }), - ), - ), - }))) - }, - ) + .map(|Function { params, body, .. }| { + // debug_assert_eq!(params.len(), 1); + PropOrSpread::Prop(Box::new(Prop::Setter(SetterProp { + span: span!(parser, start), + key, + body, + params, + }))) + }) } "async" => parser .parse_fn_args_body( From b37cffdaa7c6b6e3e273445fc6296bc92cdd6692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 20 Nov 2023 14:06:06 +0900 Subject: [PATCH 03/25] fix quasi quotter --- crates/swc_ecma_quote_macros/src/ast/prop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_ecma_quote_macros/src/ast/prop.rs b/crates/swc_ecma_quote_macros/src/ast/prop.rs index 924896c1bd51..e17ea53767fc 100644 --- a/crates/swc_ecma_quote_macros/src/ast/prop.rs +++ b/crates/swc_ecma_quote_macros/src/ast/prop.rs @@ -23,7 +23,7 @@ impl_struct!(KeyValueProp, [key, value]); impl_struct!(AssignProp, [key, value]); impl_struct!(GetterProp, [span, key, type_ann, body]); -impl_struct!(SetterProp, [span, key, param, body]); +impl_struct!(SetterProp, [span, key, params, body]); impl_struct!(MethodProp, [key, function]); From 640d27171a6d09d36058181179e0bd0987593836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 20 Nov 2023 14:06:30 +0900 Subject: [PATCH 04/25] Fix visitor --- crates/swc_ecma_visit/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_ecma_visit/src/lib.rs b/crates/swc_ecma_visit/src/lib.rs index 1fd732a068f0..030664353159 100644 --- a/crates/swc_ecma_visit/src/lib.rs +++ b/crates/swc_ecma_visit/src/lib.rs @@ -1290,7 +1290,7 @@ define!({ pub struct SetterProp { pub span: Span, pub key: PropName, - pub param: Box, + pub params: Vec, pub body: Option, } pub struct MethodProp { From b5cb307529f8b98e32ff636d5fdf6160c2fde974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 20 Nov 2023 15:18:32 +0900 Subject: [PATCH 05/25] emit --- crates/swc_ecma_codegen/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/swc_ecma_codegen/src/lib.rs b/crates/swc_ecma_codegen/src/lib.rs index 7691048a7540..d94e05a7b3d4 100644 --- a/crates/swc_ecma_codegen/src/lib.rs +++ b/crates/swc_ecma_codegen/src/lib.rs @@ -2112,7 +2112,11 @@ where formatting_space!(); punct!("("); - emit!(node.param); + self.emit_list( + node.span(), + Some(&node.params), + ListFormat::CommaListElements, + )?; punct!(")"); emit!(node.body); From 0caf8800b89b9c0ed0115a1742c483735f141db6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 20 Nov 2023 15:30:45 +0900 Subject: [PATCH 06/25] Fix utils --- crates/swc_ecma_utils/src/function/fn_env_hoister.rs | 4 ++-- crates/swc_ecma_utils/src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/swc_ecma_utils/src/function/fn_env_hoister.rs b/crates/swc_ecma_utils/src/function/fn_env_hoister.rs index cb3ca2b62169..a11691f97df4 100644 --- a/crates/swc_ecma_utils/src/function/fn_env_hoister.rs +++ b/crates/swc_ecma_utils/src/function/fn_env_hoister.rs @@ -663,7 +663,7 @@ fn extend_super( Prop::Setter(SetterProp { span: DUMMY_SP, key: PropName::Ident(quote_ident!("_")), - param: value.clone().into(), + params: vec![value.clone().into()], body: Some(BlockStmt { span: DUMMY_SP, stmts: vec![Expr::Ident( @@ -719,7 +719,7 @@ fn extend_super( Prop::Setter(SetterProp { span: DUMMY_SP, key: PropName::Ident(quote_ident!("_")), - param: value.clone().into(), + params: vec![value.clone().into()], body: Some(BlockStmt { span: DUMMY_SP, stmts: vec![Expr::Ident( diff --git a/crates/swc_ecma_utils/src/lib.rs b/crates/swc_ecma_utils/src/lib.rs index efe0c85978fe..c548ea31e6a6 100644 --- a/crates/swc_ecma_utils/src/lib.rs +++ b/crates/swc_ecma_utils/src/lib.rs @@ -92,7 +92,7 @@ impl Visit for ThisVisitor { /// Don't recurse into fn fn visit_setter_prop(&mut self, n: &SetterProp) { n.key.visit_with(self); - n.param.visit_with(self); + n.params.visit_with(self); } fn visit_this_expr(&mut self, _: &ThisExpr) { From 068215fdf98afae4b73591d6be9c697389af5473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 21 Nov 2023 13:27:19 +0900 Subject: [PATCH 07/25] fix mroe --- crates/swc_ecma_compat_common/src/macros.rs | 12 +++--------- .../swc_ecma_compat_es2015/src/block_scoping/mod.rs | 2 +- crates/swc_ecma_compat_es2015/src/computed_props.rs | 4 ++-- crates/swc_ecma_compat_es2015/src/generator.rs | 4 ++-- .../src/class_properties/mod.rs | 2 +- crates/swc_ecma_transforms_base/src/resolver/mod.rs | 2 +- crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs | 4 ++-- 7 files changed, 12 insertions(+), 18 deletions(-) diff --git a/crates/swc_ecma_compat_common/src/macros.rs b/crates/swc_ecma_compat_common/src/macros.rs index a25da938dcd9..978cbe707b20 100644 --- a/crates/swc_ecma_compat_common/src/macros.rs +++ b/crates/swc_ecma_compat_common/src/macros.rs @@ -75,17 +75,11 @@ macro_rules! impl_visit_mut_fn { f.visit_mut_children_with(self); - let (mut params, body) = self.visit_mut_fn_like( - &mut vec![Param { - span: DUMMY_SP, - decorators: Default::default(), - pat: *f.param.take(), - }], - &mut f.body.take().unwrap(), - ); + let (mut params, body) = + self.visit_mut_fn_like(&mut f.params, &mut f.body.take().unwrap()); debug_assert!(params.len() == 1); - f.param = Box::new(params.pop().unwrap().pat); + f.params = params; f.body = Some(body); } diff --git a/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs b/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs index 1c916586b526..b49b169543f6 100644 --- a/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs +++ b/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs @@ -537,7 +537,7 @@ impl VisitMut for BlockScoping { fn visit_mut_setter_prop(&mut self, f: &mut SetterProp) { f.key.visit_mut_with(self); - f.param.visit_mut_with(self); + f.params.visit_mut_with(self); self.visit_mut_with_scope(ScopeKind::Fn, &mut f.body); } diff --git a/crates/swc_ecma_compat_es2015/src/computed_props.rs b/crates/swc_ecma_compat_es2015/src/computed_props.rs index 7f615947469a..67476af1e759 100644 --- a/crates/swc_ecma_compat_es2015/src/computed_props.rs +++ b/crates/swc_ecma_compat_es2015/src/computed_props.rs @@ -170,7 +170,7 @@ impl VisitMut for ComputedProps { Prop::Setter(SetterProp { span, body, - param, + params, key, }) => ( key, @@ -179,7 +179,7 @@ impl VisitMut for ComputedProps { body, is_async: false, is_generator: false, - params: vec![(*param).into()], + params, decorators: Default::default(), type_params: Default::default(), return_type: Default::default(), diff --git a/crates/swc_ecma_compat_es2015/src/generator.rs b/crates/swc_ecma_compat_es2015/src/generator.rs index 8220a8e44e02..7b1b147ae6f8 100644 --- a/crates/swc_ecma_compat_es2015/src/generator.rs +++ b/crates/swc_ecma_compat_es2015/src/generator.rs @@ -405,7 +405,7 @@ impl VisitMut for Generator { fn visit_mut_getter_prop(&mut self, _: &mut GetterProp) {} fn visit_mut_setter_prop(&mut self, e: &mut SetterProp) { - e.param.visit_mut_with(self); + e.params.visit_mut_with(self); } fn visit_mut_expr(&mut self, e: &mut Expr) { @@ -1290,7 +1290,7 @@ impl Generator { KeyValueProp { key: quote_ident!("set").into(), value: Function { - params: vec![(*s.param).into()], + params: s.params, decorators: Default::default(), span: s.span, body: s.body, diff --git a/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs b/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs index b6228442d68b..d24bd2306a3c 100644 --- a/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs +++ b/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs @@ -1129,7 +1129,7 @@ impl Visit for SuperVisitor { /// Don't recurse into fn fn visit_setter_prop(&mut self, n: &SetterProp) { n.key.visit_with(self); - n.param.visit_with(self); + n.params.visit_with(self); } fn visit_super(&mut self, _: &Super) { diff --git a/crates/swc_ecma_transforms_base/src/resolver/mod.rs b/crates/swc_ecma_transforms_base/src/resolver/mod.rs index 4342c7b83bfa..9d6ed042f409 100644 --- a/crates/swc_ecma_transforms_base/src/resolver/mod.rs +++ b/crates/swc_ecma_transforms_base/src/resolver/mod.rs @@ -1137,7 +1137,7 @@ impl<'a> VisitMut for Resolver<'a> { { self.with_child(ScopeKind::Fn, |child| { child.ident_type = IdentType::Binding; - n.param.visit_mut_with(child); + n.params.visit_mut_with(child); n.body.visit_mut_with(child); }); }; diff --git a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs index c6d7c6db80e1..43bc7d16c36f 100644 --- a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs +++ b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs @@ -1096,7 +1096,7 @@ where in_pat_of_param: true, ..a.ctx }; - n.param.visit_with(&mut *a.with_ctx(ctx)); + n.params.visit_with(&mut *a.with_ctx(ctx)); } n.body.visit_with(a); @@ -1379,7 +1379,7 @@ fn for_each_id_ref_in_expr(e: &Expr, op: &mut impl FnMut(&Ident)) { } Prop::Setter(p) => { for_each_id_ref_in_prop_name(&p.key, op); - for_each_id_ref_in_pat(&p.param, op); + for_each_id_ref_in_pat(&p.params, op); } Prop::Method(p) => { for_each_id_ref_in_fn(&p.function, op); From 75a88da00d5215ada093197ef71ee11bcfc59e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 21 Nov 2023 13:28:49 +0900 Subject: [PATCH 08/25] fix mroe --- crates/swc_ecma_compat_es2015/src/parameters.rs | 8 ++------ crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs | 5 ++++- crates/swc_estree_compat/src/babelify/prop.rs | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/crates/swc_ecma_compat_es2015/src/parameters.rs b/crates/swc_ecma_compat_es2015/src/parameters.rs index 0d03d8fcb06b..6b71b4b188ff 100644 --- a/crates/swc_ecma_compat_es2015/src/parameters.rs +++ b/crates/swc_ecma_compat_es2015/src/parameters.rs @@ -717,18 +717,14 @@ impl VisitMut for Params { f.visit_mut_children_with(self); - let mut params = vec![Param { - span: DUMMY_SP, - decorators: Default::default(), - pat: *f.param.take(), - }]; + let mut params = f.params.take(); let mut body = f.body.take().unwrap(); self.visit_mut_fn_like(&mut params, &mut body, true); debug_assert!(params.len() == 1); - f.param = Box::new(params.pop().unwrap().pat); + f.params = params; f.body = Some(body); } diff --git a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs index 43bc7d16c36f..d4ef7129e15d 100644 --- a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs +++ b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs @@ -1379,7 +1379,10 @@ fn for_each_id_ref_in_expr(e: &Expr, op: &mut impl FnMut(&Ident)) { } Prop::Setter(p) => { for_each_id_ref_in_prop_name(&p.key, op); - for_each_id_ref_in_pat(&p.params, op); + + for p in &p.params { + for_each_id_ref_in_pat(&p.pat, op); + } } Prop::Method(p) => { for_each_id_ref_in_fn(&p.function, op); diff --git a/crates/swc_estree_compat/src/babelify/prop.rs b/crates/swc_estree_compat/src/babelify/prop.rs index d7e2128992a1..8e8cb9151fb3 100644 --- a/crates/swc_estree_compat/src/babelify/prop.rs +++ b/crates/swc_estree_compat/src/babelify/prop.rs @@ -99,7 +99,7 @@ impl Babelify for SetterProp { base: ctx.base(self.span), kind: ObjectMethodKind::Set, key: self.key.babelify(ctx), - params: vec![self.param.babelify(ctx).into()], + params: self.params.babelify(ctx), body: self.body.unwrap().babelify(ctx), return_type: Default::default(), computed: Default::default(), From cdac958812a06784400efb4c8e170d1cd956e7d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:25:21 +0900 Subject: [PATCH 09/25] this_param --- crates/swc_ecma_ast/src/prop.rs | 5 +++-- crates/swc_ecma_visit/src/lib.rs | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/swc_ecma_ast/src/prop.rs b/crates/swc_ecma_ast/src/prop.rs index 0ec399c7506c..8dc8c0f36da9 100644 --- a/crates/swc_ecma_ast/src/prop.rs +++ b/crates/swc_ecma_ast/src/prop.rs @@ -8,7 +8,7 @@ use crate::{ lit::{BigInt, Number, Str}, stmt::BlockStmt, typescript::TsTypeAnn, - Id, MemberProp, Param, + Id, MemberProp, Pat, }; #[ast_node] @@ -75,7 +75,8 @@ pub struct GetterProp { pub struct SetterProp { pub span: Span, pub key: PropName, - pub params: Vec, + pub this_param: Option, + pub param: Box, #[cfg_attr(feature = "serde-impl", serde(default))] pub body: Option, } diff --git a/crates/swc_ecma_visit/src/lib.rs b/crates/swc_ecma_visit/src/lib.rs index b02b02bd608e..fff1f07dde10 100644 --- a/crates/swc_ecma_visit/src/lib.rs +++ b/crates/swc_ecma_visit/src/lib.rs @@ -1290,7 +1290,8 @@ define!({ pub struct SetterProp { pub span: Span, pub key: PropName, - pub params: Vec, + pub this_param: Option, + pub param: Box, pub body: Option, } pub struct MethodProp { From 05b79f57d71fb14ee1c95c3478d29d5f17dea140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:26:20 +0900 Subject: [PATCH 10/25] Fix codegen/parser --- crates/swc_ecma_codegen/src/lib.rs | 14 +++++---- crates/swc_ecma_parser/src/parser/object.rs | 31 ++++++++++++++------ crates/swc_ecma_quote_macros/src/ast/prop.rs | 2 +- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/crates/swc_ecma_codegen/src/lib.rs b/crates/swc_ecma_codegen/src/lib.rs index 6451281d2026..ce2e45a67795 100644 --- a/crates/swc_ecma_codegen/src/lib.rs +++ b/crates/swc_ecma_codegen/src/lib.rs @@ -2218,11 +2218,15 @@ where formatting_space!(); punct!("("); - self.emit_list( - node.span(), - Some(&node.params), - ListFormat::CommaListElements, - )?; + if let Some(this) = &node.this_param { + emit!(this); + punct!(","); + + formatting_space!(); + } + + emit!(node.param); + punct!(")"); emit!(node.body); diff --git a/crates/swc_ecma_parser/src/parser/object.rs b/crates/swc_ecma_parser/src/parser/object.rs index 2dcfdcd07729..5994c08b2e71 100644 --- a/crates/swc_ecma_parser/src/parser/object.rs +++ b/crates/swc_ecma_parser/src/parser/object.rs @@ -351,15 +351,28 @@ impl ParseObject> for Parser { false, ) .map(|v| *v) - .map(|Function { params, body, .. }| { - // debug_assert_eq!(params.len(), 1); - PropOrSpread::Prop(Box::new(Prop::Setter(SetterProp { - span: span!(parser, start), - key, - body, - params, - }))) - }) + .map( + |Function { + mut params, body, .. + }| { + let mut this = None; + if params.len() <= 2 { + this = Some(params.remove(0).pat); + } + + let param = + Box::new(params.into_iter().next().unwrap().pat); + + // debug_assert_eq!(params.len(), 1); + PropOrSpread::Prop(Box::new(Prop::Setter(SetterProp { + span: span!(parser, start), + key, + body, + param, + this_param: this, + }))) + }, + ) } "async" => parser .parse_fn_args_body( diff --git a/crates/swc_ecma_quote_macros/src/ast/prop.rs b/crates/swc_ecma_quote_macros/src/ast/prop.rs index e17ea53767fc..8d267ff252a3 100644 --- a/crates/swc_ecma_quote_macros/src/ast/prop.rs +++ b/crates/swc_ecma_quote_macros/src/ast/prop.rs @@ -23,7 +23,7 @@ impl_struct!(KeyValueProp, [key, value]); impl_struct!(AssignProp, [key, value]); impl_struct!(GetterProp, [span, key, type_ann, body]); -impl_struct!(SetterProp, [span, key, params, body]); +impl_struct!(SetterProp, [span, key, param, this_param, body]); impl_struct!(MethodProp, [key, function]); From f7f609408a8aa33595a2b4b331fb66c6d859368c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:27:42 +0900 Subject: [PATCH 11/25] Fix more --- crates/swc_ecma_utils/src/function/fn_env_hoister.rs | 6 ++++-- crates/swc_ecma_utils/src/lib.rs | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/swc_ecma_utils/src/function/fn_env_hoister.rs b/crates/swc_ecma_utils/src/function/fn_env_hoister.rs index 61dc0449428d..1509a510c665 100644 --- a/crates/swc_ecma_utils/src/function/fn_env_hoister.rs +++ b/crates/swc_ecma_utils/src/function/fn_env_hoister.rs @@ -665,7 +665,8 @@ fn extend_super( Prop::Setter(SetterProp { span: DUMMY_SP, key: PropName::Ident(quote_ident!("_")), - params: vec![value.clone().into()], + this_param: None, + param: value.clone().into(), body: Some(BlockStmt { span: DUMMY_SP, stmts: vec![Expr::Ident( @@ -721,7 +722,8 @@ fn extend_super( Prop::Setter(SetterProp { span: DUMMY_SP, key: PropName::Ident(quote_ident!("_")), - params: vec![value.clone().into()], + this_param: None, + param: value.clone().into(), body: Some(BlockStmt { span: DUMMY_SP, stmts: vec![Expr::Ident( diff --git a/crates/swc_ecma_utils/src/lib.rs b/crates/swc_ecma_utils/src/lib.rs index e2134f15ab3e..211b661f7a97 100644 --- a/crates/swc_ecma_utils/src/lib.rs +++ b/crates/swc_ecma_utils/src/lib.rs @@ -92,7 +92,7 @@ impl Visit for ThisVisitor { /// Don't recurse into fn fn visit_setter_prop(&mut self, n: &SetterProp) { n.key.visit_with(self); - n.params.visit_with(self); + n.param.visit_with(self); } fn visit_this_expr(&mut self, _: &ThisExpr) { From ead07e6015a26ca7ddbcda46835471dc1eb00f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:33:46 +0900 Subject: [PATCH 12/25] Fix more --- crates/swc_ecma_transforms_base/src/resolver/mod.rs | 2 +- crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/swc_ecma_transforms_base/src/resolver/mod.rs b/crates/swc_ecma_transforms_base/src/resolver/mod.rs index 7cc8cd2fcb73..99cc82944b89 100644 --- a/crates/swc_ecma_transforms_base/src/resolver/mod.rs +++ b/crates/swc_ecma_transforms_base/src/resolver/mod.rs @@ -1125,7 +1125,7 @@ impl<'a> VisitMut for Resolver<'a> { { self.with_child(ScopeKind::Fn, |child| { child.ident_type = IdentType::Binding; - n.params.visit_mut_with(child); + n.param.visit_mut_with(child); n.body.visit_mut_with(child); }); }; diff --git a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs index d4ef7129e15d..379ff69c38c9 100644 --- a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs +++ b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs @@ -1096,7 +1096,7 @@ where in_pat_of_param: true, ..a.ctx }; - n.params.visit_with(&mut *a.with_ctx(ctx)); + n.param.visit_with(&mut *a.with_ctx(ctx)); } n.body.visit_with(a); From 0f892d51dd4f98c82dc2a8cbd97010a2b1328a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:34:33 +0900 Subject: [PATCH 13/25] Fix more --- crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs index 379ff69c38c9..674d2ab4bca9 100644 --- a/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs +++ b/crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs @@ -1380,9 +1380,7 @@ fn for_each_id_ref_in_expr(e: &Expr, op: &mut impl FnMut(&Ident)) { Prop::Setter(p) => { for_each_id_ref_in_prop_name(&p.key, op); - for p in &p.params { - for_each_id_ref_in_pat(&p.pat, op); - } + for_each_id_ref_in_pat(&p.param, op); } Prop::Method(p) => { for_each_id_ref_in_fn(&p.function, op); From 6e89ee5d4db3cf93ab5236b501d6e9706845b3a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:37:00 +0900 Subject: [PATCH 14/25] Fix more --- crates/swc_ecma_compat_common/src/macros.rs | 12 +++++++++--- .../swc_ecma_compat_es2015/src/block_scoping/mod.rs | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/crates/swc_ecma_compat_common/src/macros.rs b/crates/swc_ecma_compat_common/src/macros.rs index 2af219e2024f..6a6b27c92e2c 100644 --- a/crates/swc_ecma_compat_common/src/macros.rs +++ b/crates/swc_ecma_compat_common/src/macros.rs @@ -74,11 +74,17 @@ macro_rules! impl_visit_mut_fn { f.visit_mut_children_with(self); - let (mut params, body) = - self.visit_mut_fn_like(&mut f.params, &mut f.body.take().unwrap()); + let (mut params, body) = self.visit_mut_fn_like( + &mut vec![Param { + span: DUMMY_SP, + decorators: vec![], + pat: *f.param.take(), + }], + &mut f.body.take().unwrap(), + ); debug_assert!(params.len() == 1); - f.params = params; + f.param = Box::new(params.into_iter().next().unwrap().pat); f.body = Some(body); } diff --git a/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs b/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs index b49b169543f6..1c916586b526 100644 --- a/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs +++ b/crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs @@ -537,7 +537,7 @@ impl VisitMut for BlockScoping { fn visit_mut_setter_prop(&mut self, f: &mut SetterProp) { f.key.visit_mut_with(self); - f.params.visit_mut_with(self); + f.param.visit_mut_with(self); self.visit_mut_with_scope(ScopeKind::Fn, &mut f.body); } From 6c0207157ec006a64f2ff1c37533b516241d6025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:40:03 +0900 Subject: [PATCH 15/25] Fix more --- crates/swc_ecma_compat_es2015/src/computed_props.rs | 9 +++++++-- crates/swc_ecma_compat_es2015/src/generator.rs | 8 ++++++-- .../swc_ecma_compat_es2022/src/class_properties/mod.rs | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/crates/swc_ecma_compat_es2015/src/computed_props.rs b/crates/swc_ecma_compat_es2015/src/computed_props.rs index e166dbd9c003..87f1a82fee01 100644 --- a/crates/swc_ecma_compat_es2015/src/computed_props.rs +++ b/crates/swc_ecma_compat_es2015/src/computed_props.rs @@ -170,8 +170,9 @@ impl VisitMut for ComputedProps { Prop::Setter(SetterProp { span, body, - params, + param, key, + .. }) => ( key, Box::new(Function { @@ -179,7 +180,11 @@ impl VisitMut for ComputedProps { body, is_async: false, is_generator: false, - params, + params: vec![Param { + span: DUMMY_SP, + decorators: Default::default(), + pat: *param, + }], decorators: Default::default(), type_params: Default::default(), return_type: Default::default(), diff --git a/crates/swc_ecma_compat_es2015/src/generator.rs b/crates/swc_ecma_compat_es2015/src/generator.rs index f122d6b044fc..88b526f9e45b 100644 --- a/crates/swc_ecma_compat_es2015/src/generator.rs +++ b/crates/swc_ecma_compat_es2015/src/generator.rs @@ -405,7 +405,7 @@ impl VisitMut for Generator { fn visit_mut_getter_prop(&mut self, _: &mut GetterProp) {} fn visit_mut_setter_prop(&mut self, e: &mut SetterProp) { - e.params.visit_mut_with(self); + e.param.visit_mut_with(self); } fn visit_mut_expr(&mut self, e: &mut Expr) { @@ -1274,7 +1274,11 @@ impl Generator { KeyValueProp { key: quote_ident!("set").into(), value: Function { - params: s.params, + params: vec![Param { + span: DUMMY_SP, + decorators: Default::default(), + pat: *s.param, + }], decorators: Default::default(), span: s.span, body: s.body, diff --git a/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs b/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs index d24bd2306a3c..b6228442d68b 100644 --- a/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs +++ b/crates/swc_ecma_compat_es2022/src/class_properties/mod.rs @@ -1129,7 +1129,7 @@ impl Visit for SuperVisitor { /// Don't recurse into fn fn visit_setter_prop(&mut self, n: &SetterProp) { n.key.visit_with(self); - n.params.visit_with(self); + n.param.visit_with(self); } fn visit_super(&mut self, _: &Super) { From e13dc9374853dad2a1b5c462f6249c3fc2948e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:41:49 +0900 Subject: [PATCH 16/25] Revert --- crates/swc_ecma_compat_es2015/src/computed_props.rs | 7 +------ crates/swc_ecma_compat_es2015/src/generator.rs | 6 +----- crates/swc_ecma_compat_es2015/src/parameters.rs | 8 ++++++-- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/crates/swc_ecma_compat_es2015/src/computed_props.rs b/crates/swc_ecma_compat_es2015/src/computed_props.rs index 87f1a82fee01..f64eb646e24f 100644 --- a/crates/swc_ecma_compat_es2015/src/computed_props.rs +++ b/crates/swc_ecma_compat_es2015/src/computed_props.rs @@ -172,7 +172,6 @@ impl VisitMut for ComputedProps { body, param, key, - .. }) => ( key, Box::new(Function { @@ -180,11 +179,7 @@ impl VisitMut for ComputedProps { body, is_async: false, is_generator: false, - params: vec![Param { - span: DUMMY_SP, - decorators: Default::default(), - pat: *param, - }], + params: vec![(*param).into()], decorators: Default::default(), type_params: Default::default(), return_type: Default::default(), diff --git a/crates/swc_ecma_compat_es2015/src/generator.rs b/crates/swc_ecma_compat_es2015/src/generator.rs index 88b526f9e45b..d5ecc0408f69 100644 --- a/crates/swc_ecma_compat_es2015/src/generator.rs +++ b/crates/swc_ecma_compat_es2015/src/generator.rs @@ -1274,11 +1274,7 @@ impl Generator { KeyValueProp { key: quote_ident!("set").into(), value: Function { - params: vec![Param { - span: DUMMY_SP, - decorators: Default::default(), - pat: *s.param, - }], + params: vec![(*s.param).into()], decorators: Default::default(), span: s.span, body: s.body, diff --git a/crates/swc_ecma_compat_es2015/src/parameters.rs b/crates/swc_ecma_compat_es2015/src/parameters.rs index c7c96c3de51c..f9d3e638c1d6 100644 --- a/crates/swc_ecma_compat_es2015/src/parameters.rs +++ b/crates/swc_ecma_compat_es2015/src/parameters.rs @@ -717,14 +717,18 @@ impl VisitMut for Params { f.visit_mut_children_with(self); - let mut params = f.params.take(); + let mut params = vec![Param { + span: DUMMY_SP, + decorators: Default::default(), + pat: *f.param.take(), + }]; let mut body = f.body.take().unwrap(); self.visit_mut_fn_like(&mut params, &mut body, true); debug_assert!(params.len() == 1); - f.params = params; + f.param = Box::new(params.pop().unwrap().pat); f.body = Some(body); } From 4814b25ea5d020177ca928f33e77256e9c0bbead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:42:29 +0900 Subject: [PATCH 17/25] Revert --- crates/swc_estree_compat/src/babelify/prop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_estree_compat/src/babelify/prop.rs b/crates/swc_estree_compat/src/babelify/prop.rs index 8e8cb9151fb3..d7e2128992a1 100644 --- a/crates/swc_estree_compat/src/babelify/prop.rs +++ b/crates/swc_estree_compat/src/babelify/prop.rs @@ -99,7 +99,7 @@ impl Babelify for SetterProp { base: ctx.base(self.span), kind: ObjectMethodKind::Set, key: self.key.babelify(ctx), - params: self.params.babelify(ctx), + params: vec![self.param.babelify(ctx).into()], body: self.body.unwrap().babelify(ctx), return_type: Default::default(), computed: Default::default(), From f428df9d204998e775b452db0b1d1f6e0ec9ae41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:42:33 +0900 Subject: [PATCH 18/25] fix --- crates/swc_ecma_compat_es2015/src/computed_props.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/swc_ecma_compat_es2015/src/computed_props.rs b/crates/swc_ecma_compat_es2015/src/computed_props.rs index f64eb646e24f..214e2144a447 100644 --- a/crates/swc_ecma_compat_es2015/src/computed_props.rs +++ b/crates/swc_ecma_compat_es2015/src/computed_props.rs @@ -172,6 +172,7 @@ impl VisitMut for ComputedProps { body, param, key, + .. }) => ( key, Box::new(Function { From 2d70cb9079c505e958e58ec3f28c5a5ae156904e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:50:59 +0900 Subject: [PATCH 19/25] fix --- crates/swc_ecma_parser/src/parser/object.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/crates/swc_ecma_parser/src/parser/object.rs b/crates/swc_ecma_parser/src/parser/object.rs index 5994c08b2e71..4f3eb1a793ab 100644 --- a/crates/swc_ecma_parser/src/parser/object.rs +++ b/crates/swc_ecma_parser/src/parser/object.rs @@ -1,6 +1,6 @@ //! Parser for object literal. -use swc_common::Spanned; +use swc_common::{Spanned, DUMMY_SP}; use super::*; use crate::parser::class_and_fn::is_not_this; @@ -360,8 +360,20 @@ impl ParseObject> for Parser { this = Some(params.remove(0).pat); } - let param = - Box::new(params.into_iter().next().unwrap().pat); + let param = Box::new( + params + .into_iter() + .next() + .map(|v| v.pat) + .unwrap_or_else(|| { + parser.emit_err( + key_span, + SyntaxError::SetterParam, + ); + + Pat::Invalid(Invalid { span: DUMMY_SP }) + }), + ); // debug_assert_eq!(params.len(), 1); PropOrSpread::Prop(Box::new(Prop::Setter(SetterProp { From 7052d9964d5e308597e33d26509b1ba3bd2a6ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:51:38 +0900 Subject: [PATCH 20/25] Update test refs --- .../tests/span/js/decl/accessor.js.span.swc-stderr | 4 ++++ .../fail/2f95824f19005b11.js.swc-stderr | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr b/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr index 938b1dd6a7da..4fe8f7a6b3c3 100644 --- a/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr +++ b/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr @@ -387,6 +387,10 @@ 13 | } `---- + x Pat + + x Invalid + x BlockStmt ,-[$DIR/tests/span/js/decl/accessor.js:11:1] 11 | get a() { }, diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr index 17ea95879ebc..b6a554530584 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr @@ -4,3 +4,9 @@ 1 | var a = { set foo(...v) {} }; : ^^^^ `---- + + x A `set` accessor must have exactly one parameter + ,-[$DIR/tests/test262-parser/fail/2f95824f19005b11.js:1:1] + 1 | var a = { set foo(...v) {} }; + : ^^^ + `---- From ebfc05fce8da6b470682ffabec1e59735256f1f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:52:22 +0900 Subject: [PATCH 21/25] fix parser --- crates/swc_ecma_parser/src/parser/object.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_ecma_parser/src/parser/object.rs b/crates/swc_ecma_parser/src/parser/object.rs index 4f3eb1a793ab..9fcd695ab28b 100644 --- a/crates/swc_ecma_parser/src/parser/object.rs +++ b/crates/swc_ecma_parser/src/parser/object.rs @@ -356,7 +356,7 @@ impl ParseObject> for Parser { mut params, body, .. }| { let mut this = None; - if params.len() <= 2 { + if params.len() >= 2 { this = Some(params.remove(0).pat); } From d58bc9a6cddb14f0ade90a77b67c339b0e84e4d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 14:52:58 +0900 Subject: [PATCH 22/25] Update test refs --- .../span/js/decl/accessor.js.span.swc-stderr | 4 - .../fail/2f95824f19005b11.js.swc-stderr | 6 -- .../tests/tsc/accessorWithES3.json | 1 + .../tests/tsc/accessorWithES5.json | 1 + .../tsc/computedPropertyNames11_ES5.json | 5 ++ .../tsc/computedPropertyNames11_ES6.json | 5 ++ .../tests/tsc/computedPropertyNames1_ES5.json | 1 + .../tests/tsc/computedPropertyNames1_ES6.json | 1 + ...utedPropertyNamesDeclarationEmit5_ES5.json | 1 + ...utedPropertyNamesDeclarationEmit5_ES6.json | 1 + .../jsDeclarationsFunctionLikeClasses2.json | 2 + ...IndexerConstrainsPropertyDeclarations.json | 1 + .../tests/tsc/objectLiteralErrorsES3.json | 2 + .../tsc/objectSpreadSetonlyAccessor.json | 2 + .../tests/tsc/parserAccessors4.json | 1 + .../tsc/parserComputedPropertyName17.json | 1 + .../tests/tsc/parserES3Accessors4.json | 1 + ...IndexerConstrainsPropertyDeclarations.json | 1 + .../tests/tsc/symbolDeclarationEmit10.json | 1 + .../tests/tsc/symbolProperty18.json | 1 + .../tests/tsc/thisTypeInAccessors.json | 86 +++++++++++++++++++ .../tsc/thisTypeInAccessorsNegative.json | 37 ++++++++ .../tests/tsc/thisTypeInObjectLiterals2.json | 1 + .../tests/tsc/typeGuardsObjectMethods.json | 1 + 24 files changed, 154 insertions(+), 10 deletions(-) diff --git a/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr b/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr index 4fe8f7a6b3c3..938b1dd6a7da 100644 --- a/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr +++ b/crates/swc_ecma_parser/tests/span/js/decl/accessor.js.span.swc-stderr @@ -387,10 +387,6 @@ 13 | } `---- - x Pat - - x Invalid - x BlockStmt ,-[$DIR/tests/span/js/decl/accessor.js:11:1] 11 | get a() { }, diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr index b6a554530584..17ea95879ebc 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/2f95824f19005b11.js.swc-stderr @@ -4,9 +4,3 @@ 1 | var a = { set foo(...v) {} }; : ^^^^ `---- - - x A `set` accessor must have exactly one parameter - ,-[$DIR/tests/test262-parser/fail/2f95824f19005b11.js:1:1] - 1 | var a = { set foo(...v) {} }; - : ^^^ - `---- diff --git a/crates/swc_ecma_parser/tests/tsc/accessorWithES3.json b/crates/swc_ecma_parser/tests/tsc/accessorWithES3.json index 920731b53647..46ab643a6282 100644 --- a/crates/swc_ecma_parser/tests/tsc/accessorWithES3.json +++ b/crates/swc_ecma_parser/tests/tsc/accessorWithES3.json @@ -334,6 +334,7 @@ "value": "b", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/accessorWithES5.json b/crates/swc_ecma_parser/tests/tsc/accessorWithES5.json index 7b688a3a0cdf..937f346d334b 100644 --- a/crates/swc_ecma_parser/tests/tsc/accessorWithES5.json +++ b/crates/swc_ecma_parser/tests/tsc/accessorWithES5.json @@ -334,6 +334,7 @@ "value": "b", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES5.json b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES5.json index 568cf9f4134d..e477d7a5a1d3 100644 --- a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES5.json +++ b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES5.json @@ -269,6 +269,7 @@ "optional": false } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -408,6 +409,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -518,6 +520,7 @@ "raw": "\"\"" } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -619,6 +622,7 @@ "optional": false } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -748,6 +752,7 @@ ] } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES6.json b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES6.json index 568cf9f4134d..e477d7a5a1d3 100644 --- a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES6.json +++ b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames11_ES6.json @@ -269,6 +269,7 @@ "optional": false } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -408,6 +409,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -518,6 +520,7 @@ "raw": "\"\"" } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -619,6 +622,7 @@ "optional": false } }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -748,6 +752,7 @@ ] } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES5.json b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES5.json index a6638ba7dfc0..3b4e40f31f12 100644 --- a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES5.json +++ b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES5.json @@ -160,6 +160,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES6.json b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES6.json index a6638ba7dfc0..3b4e40f31f12 100644 --- a/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES6.json +++ b/crates/swc_ecma_parser/tests/tsc/computedPropertyNames1_ES6.json @@ -160,6 +160,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES5.json b/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES5.json index 8d11066e6643..2b5831b1b28a 100644 --- a/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES5.json +++ b/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES5.json @@ -270,6 +270,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES6.json b/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES6.json index 8d11066e6643..2b5831b1b28a 100644 --- a/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES6.json +++ b/crates/swc_ecma_parser/tests/tsc/computedPropertyNamesDeclarationEmit5_ES6.json @@ -270,6 +270,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/jsDeclarationsFunctionLikeClasses2.json b/crates/swc_ecma_parser/tests/tsc/jsDeclarationsFunctionLikeClasses2.json index 7d5620a79f92..536f5987ee3b 100644 --- a/crates/swc_ecma_parser/tests/tsc/jsDeclarationsFunctionLikeClasses2.json +++ b/crates/swc_ecma_parser/tests/tsc/jsDeclarationsFunctionLikeClasses2.json @@ -1728,6 +1728,7 @@ "value": "x", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -1935,6 +1936,7 @@ "value": "y", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/numericIndexerConstrainsPropertyDeclarations.json b/crates/swc_ecma_parser/tests/tsc/numericIndexerConstrainsPropertyDeclarations.json index 17b7a98d009c..8d47440be005 100644 --- a/crates/swc_ecma_parser/tests/tsc/numericIndexerConstrainsPropertyDeclarations.json +++ b/crates/swc_ecma_parser/tests/tsc/numericIndexerConstrainsPropertyDeclarations.json @@ -2808,6 +2808,7 @@ "value": "X", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/objectLiteralErrorsES3.json b/crates/swc_ecma_parser/tests/tsc/objectLiteralErrorsES3.json index 4173d558c743..4eaedf004dc3 100644 --- a/crates/swc_ecma_parser/tests/tsc/objectLiteralErrorsES3.json +++ b/crates/swc_ecma_parser/tests/tsc/objectLiteralErrorsES3.json @@ -148,6 +148,7 @@ "value": "a", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -275,6 +276,7 @@ "value": "a", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/objectSpreadSetonlyAccessor.json b/crates/swc_ecma_parser/tests/tsc/objectSpreadSetonlyAccessor.json index ed3b48a288f8..d325f8b54a4f 100644 --- a/crates/swc_ecma_parser/tests/tsc/objectSpreadSetonlyAccessor.json +++ b/crates/swc_ecma_parser/tests/tsc/objectSpreadSetonlyAccessor.json @@ -196,6 +196,7 @@ "value": "bar", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -391,6 +392,7 @@ "value": "foo", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/parserAccessors4.json b/crates/swc_ecma_parser/tests/tsc/parserAccessors4.json index 6026c1d72cf0..f1d97dc53f8e 100644 --- a/crates/swc_ecma_parser/tests/tsc/parserAccessors4.json +++ b/crates/swc_ecma_parser/tests/tsc/parserAccessors4.json @@ -59,6 +59,7 @@ "value": "Foo", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/parserComputedPropertyName17.json b/crates/swc_ecma_parser/tests/tsc/parserComputedPropertyName17.json index 2f8c72a8808f..1871ae1c1e5e 100644 --- a/crates/swc_ecma_parser/tests/tsc/parserComputedPropertyName17.json +++ b/crates/swc_ecma_parser/tests/tsc/parserComputedPropertyName17.json @@ -67,6 +67,7 @@ "optional": false } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/parserES3Accessors4.json b/crates/swc_ecma_parser/tests/tsc/parserES3Accessors4.json index 1450b8281453..702c2011092b 100644 --- a/crates/swc_ecma_parser/tests/tsc/parserES3Accessors4.json +++ b/crates/swc_ecma_parser/tests/tsc/parserES3Accessors4.json @@ -59,6 +59,7 @@ "value": "Foo", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/stringIndexerConstrainsPropertyDeclarations.json b/crates/swc_ecma_parser/tests/tsc/stringIndexerConstrainsPropertyDeclarations.json index ebab650b5759..402440c61c95 100644 --- a/crates/swc_ecma_parser/tests/tsc/stringIndexerConstrainsPropertyDeclarations.json +++ b/crates/swc_ecma_parser/tests/tsc/stringIndexerConstrainsPropertyDeclarations.json @@ -2808,6 +2808,7 @@ "value": "X", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/symbolDeclarationEmit10.json b/crates/swc_ecma_parser/tests/tsc/symbolDeclarationEmit10.json index 833aafa14be8..ebaae0948db2 100644 --- a/crates/swc_ecma_parser/tests/tsc/symbolDeclarationEmit10.json +++ b/crates/swc_ecma_parser/tests/tsc/symbolDeclarationEmit10.json @@ -158,6 +158,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/symbolProperty18.json b/crates/swc_ecma_parser/tests/tsc/symbolProperty18.json index 73e86e6494b7..39da0afcf8c5 100644 --- a/crates/swc_ecma_parser/tests/tsc/symbolProperty18.json +++ b/crates/swc_ecma_parser/tests/tsc/symbolProperty18.json @@ -212,6 +212,7 @@ } } }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessors.json b/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessors.json index a03bd64baf8c..8d3fb74b8d96 100644 --- a/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessors.json +++ b/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessors.json @@ -274,6 +274,43 @@ "value": "x", "optional": false }, + "thisParam": { + "type": "Identifier", + "span": { + "start": 204, + "end": 213, + "ctxt": 0 + }, + "value": "this", + "optional": false, + "typeAnnotation": { + "type": "TsTypeAnnotation", + "span": { + "start": 208, + "end": 213, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsTypeReference", + "span": { + "start": 210, + "end": 213, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 210, + "end": 213, + "ctxt": 0 + }, + "value": "Foo", + "optional": false + }, + "typeParams": null + } + } + }, "param": { "type": "Identifier", "span": { @@ -526,6 +563,7 @@ "value": "x", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { @@ -746,6 +784,43 @@ "value": "x", "optional": false }, + "thisParam": { + "type": "Identifier", + "span": { + "start": 441, + "end": 450, + "ctxt": 0 + }, + "value": "this", + "optional": false, + "typeAnnotation": { + "type": "TsTypeAnnotation", + "span": { + "start": 445, + "end": 450, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsTypeReference", + "span": { + "start": 447, + "end": 450, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 447, + "end": 450, + "ctxt": 0 + }, + "value": "Foo", + "optional": false + }, + "typeParams": null + } + } + }, "param": { "type": "Identifier", "span": { @@ -982,6 +1057,17 @@ "value": "x", "optional": false }, + "thisParam": { + "type": "Identifier", + "span": { + "start": 580, + "end": 584, + "ctxt": 0 + }, + "value": "this", + "optional": false, + "typeAnnotation": null + }, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessorsNegative.json b/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessorsNegative.json index 1a8333bed8fb..6925571e7d5b 100644 --- a/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessorsNegative.json +++ b/crates/swc_ecma_parser/tests/tsc/thisTypeInAccessorsNegative.json @@ -403,6 +403,43 @@ "value": "x", "optional": false }, + "thisParam": { + "type": "Identifier", + "span": { + "start": 267, + "end": 276, + "ctxt": 0 + }, + "value": "this", + "optional": false, + "typeAnnotation": { + "type": "TsTypeAnnotation", + "span": { + "start": 271, + "end": 276, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsTypeReference", + "span": { + "start": 273, + "end": 276, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 273, + "end": 276, + "ctxt": 0 + }, + "value": "Bar", + "optional": false + }, + "typeParams": null + } + } + }, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/thisTypeInObjectLiterals2.json b/crates/swc_ecma_parser/tests/tsc/thisTypeInObjectLiterals2.json index 4b00869f9ca1..e272c85e220e 100644 --- a/crates/swc_ecma_parser/tests/tsc/thisTypeInObjectLiterals2.json +++ b/crates/swc_ecma_parser/tests/tsc/thisTypeInObjectLiterals2.json @@ -400,6 +400,7 @@ "value": "e", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { diff --git a/crates/swc_ecma_parser/tests/tsc/typeGuardsObjectMethods.json b/crates/swc_ecma_parser/tests/tsc/typeGuardsObjectMethods.json index d2957762dfdb..45b8885110fd 100644 --- a/crates/swc_ecma_parser/tests/tsc/typeGuardsObjectMethods.json +++ b/crates/swc_ecma_parser/tests/tsc/typeGuardsObjectMethods.json @@ -1050,6 +1050,7 @@ "value": "prop", "optional": false }, + "thisParam": null, "param": { "type": "Identifier", "span": { From 864080e5d7d87fae83df24754d9f6e319709f593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 15:03:54 +0900 Subject: [PATCH 23/25] setter prop --- crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts | 2 +- crates/swc_ecma_transforms_base/src/resolver/mod.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts b/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts index e9a3d70b61c6..f04db5c86ccd 100644 --- a/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts +++ b/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts @@ -1,6 +1,6 @@ "use strict"; const s = { - set m (value1){ + set m (_this, value1){ console.log(value1); } }; diff --git a/crates/swc_ecma_transforms_base/src/resolver/mod.rs b/crates/swc_ecma_transforms_base/src/resolver/mod.rs index 99cc82944b89..2284b9c2ed1d 100644 --- a/crates/swc_ecma_transforms_base/src/resolver/mod.rs +++ b/crates/swc_ecma_transforms_base/src/resolver/mod.rs @@ -1125,6 +1125,7 @@ impl<'a> VisitMut for Resolver<'a> { { self.with_child(ScopeKind::Fn, |child| { child.ident_type = IdentType::Binding; + n.this_param.visit_mut_with(child); n.param.visit_mut_with(child); n.body.visit_mut_with(child); }); From 72288f69e5cb7900a8aec263c94f3b69c9165619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 15:05:25 +0900 Subject: [PATCH 24/25] Fix TS --- .../src/strip_type.rs | 154 +++++++++--------- 1 file changed, 80 insertions(+), 74 deletions(-) diff --git a/crates/swc_ecma_transforms_typescript/src/strip_type.rs b/crates/swc_ecma_transforms_typescript/src/strip_type.rs index df6b38fee55a..f04fd224cef1 100644 --- a/crates/swc_ecma_transforms_typescript/src/strip_type.rs +++ b/crates/swc_ecma_transforms_typescript/src/strip_type.rs @@ -23,75 +23,16 @@ impl VisitMut for StripType { Box ); - fn visit_mut_module_items(&mut self, n: &mut Vec) { - n.retain(should_retain_module_item); - n.visit_mut_children_with(self); - } - - fn visit_mut_import_specifiers(&mut self, n: &mut Vec) { - n.retain(|s| !matches!(s, ImportSpecifier::Named(named) if named.is_type_only)); - } - - fn visit_mut_export_specifiers(&mut self, n: &mut Vec) { - n.retain(|s| match s { - ExportSpecifier::Named(ExportNamedSpecifier { is_type_only, .. }) => !is_type_only, - _ => true, - }) - } - - fn visit_mut_stmts(&mut self, n: &mut Vec) { - n.retain(should_retain_stmt); - n.visit_mut_children_with(self); - } - - // https://github.com/tc39/proposal-type-annotations#parameter-optionality - fn visit_mut_ident(&mut self, n: &mut Ident) { - n.optional = false; - } - fn visit_mut_array_pat(&mut self, n: &mut ArrayPat) { n.visit_mut_children_with(self); n.optional = false; } - fn visit_mut_object_pat(&mut self, pat: &mut ObjectPat) { - pat.visit_mut_children_with(self); - pat.optional = false; - } - - fn visit_mut_expr(&mut self, n: &mut Expr) { - // https://github.com/tc39/proposal-type-annotations#type-assertions - // https://github.com/tc39/proposal-type-annotations#non-nullable-assertions - while let Expr::TsAs(TsAsExpr { expr, .. }) - | Expr::TsNonNull(TsNonNullExpr { expr, .. }) - | Expr::TsTypeAssertion(TsTypeAssertion { expr, .. }) - | Expr::TsConstAssertion(TsConstAssertion { expr, .. }) - | Expr::TsInstantiation(TsInstantiation { expr, .. }) - | Expr::TsSatisfies(TsSatisfiesExpr { expr, .. }) = n - { - *n = *expr.take(); - } - - n.visit_mut_children_with(self); - } - - // https://github.com/tc39/proposal-type-annotations#this-parameters - fn visit_mut_params(&mut self, n: &mut Vec) { - if n.first() - .filter(|param| { - matches!( - ¶m.pat, - Pat::Ident(BindingIdent { - id: Ident { sym, .. }, - .. - }) if &**sym == "this" - ) - }) - .is_some() - { - n.drain(0..1); - } - + fn visit_mut_auto_accessor(&mut self, n: &mut AutoAccessor) { + n.type_ann = None; + n.accessibility = None; + n.definite = false; + n.is_override = false; n.visit_mut_children_with(self); } @@ -130,11 +71,6 @@ impl VisitMut for StripType { n.visit_mut_children_with(self); } - fn visit_mut_constructor(&mut self, n: &mut Constructor) { - n.accessibility = None; - n.visit_mut_children_with(self); - } - fn visit_mut_class_method(&mut self, n: &mut ClassMethod) { n.accessibility = None; n.is_override = false; @@ -153,6 +89,73 @@ impl VisitMut for StripType { prop.visit_mut_children_with(self); } + fn visit_mut_constructor(&mut self, n: &mut Constructor) { + n.accessibility = None; + n.visit_mut_children_with(self); + } + + fn visit_mut_export_specifiers(&mut self, n: &mut Vec) { + n.retain(|s| match s { + ExportSpecifier::Named(ExportNamedSpecifier { is_type_only, .. }) => !is_type_only, + _ => true, + }) + } + + fn visit_mut_expr(&mut self, n: &mut Expr) { + // https://github.com/tc39/proposal-type-annotations#type-assertions + // https://github.com/tc39/proposal-type-annotations#non-nullable-assertions + while let Expr::TsAs(TsAsExpr { expr, .. }) + | Expr::TsNonNull(TsNonNullExpr { expr, .. }) + | Expr::TsTypeAssertion(TsTypeAssertion { expr, .. }) + | Expr::TsConstAssertion(TsConstAssertion { expr, .. }) + | Expr::TsInstantiation(TsInstantiation { expr, .. }) + | Expr::TsSatisfies(TsSatisfiesExpr { expr, .. }) = n + { + *n = *expr.take(); + } + + n.visit_mut_children_with(self); + } + + // https://github.com/tc39/proposal-type-annotations#parameter-optionality + fn visit_mut_ident(&mut self, n: &mut Ident) { + n.optional = false; + } + + fn visit_mut_import_specifiers(&mut self, n: &mut Vec) { + n.retain(|s| !matches!(s, ImportSpecifier::Named(named) if named.is_type_only)); + } + + fn visit_mut_module_items(&mut self, n: &mut Vec) { + n.retain(should_retain_module_item); + n.visit_mut_children_with(self); + } + + fn visit_mut_object_pat(&mut self, pat: &mut ObjectPat) { + pat.visit_mut_children_with(self); + pat.optional = false; + } + + // https://github.com/tc39/proposal-type-annotations#this-parameters + fn visit_mut_params(&mut self, n: &mut Vec) { + if n.first() + .filter(|param| { + matches!( + ¶m.pat, + Pat::Ident(BindingIdent { + id: Ident { sym, .. }, + .. + }) if &**sym == "this" + ) + }) + .is_some() + { + n.drain(0..1); + } + + n.visit_mut_children_with(self); + } + fn visit_mut_private_prop(&mut self, prop: &mut PrivateProp) { prop.readonly = false; prop.is_override = false; @@ -162,11 +165,14 @@ impl VisitMut for StripType { prop.visit_mut_children_with(self); } - fn visit_mut_auto_accessor(&mut self, n: &mut AutoAccessor) { - n.type_ann = None; - n.accessibility = None; - n.definite = false; - n.is_override = false; + fn visit_mut_setter_prop(&mut self, n: &mut SetterProp) { + n.this_param = None; + + n.visit_mut_children_with(self); + } + + fn visit_mut_stmts(&mut self, n: &mut Vec) { + n.retain(should_retain_stmt); n.visit_mut_children_with(self); } From 3d4c80a5eae560465066b819472b2bfc99aaacae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Fri, 19 Jan 2024 15:05:40 +0900 Subject: [PATCH 25/25] Update test refs --- crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts b/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts index f04db5c86ccd..e9a3d70b61c6 100644 --- a/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts +++ b/crates/swc/tests/fixture/issues-8xxx/8156/output/1.ts @@ -1,6 +1,6 @@ "use strict"; const s = { - set m (_this, value1){ + set m (value1){ console.log(value1); } };