Skip to content

Commit 4f77597

Browse files
committed
define the binding in init of param
1 parent 0573948 commit 4f77597

File tree

4 files changed

+83
-47
lines changed

4 files changed

+83
-47
lines changed

crates/swc_ecma_minifier/src/compress/optimize/inline.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -861,8 +861,9 @@ impl Optimizer<'_> {
861861
class: c.class,
862862
}
863863
.into(),
864-
Decl::Fn(f) => FnExpr {
864+
Decl::Fn(mut f) => FnExpr {
865865
ident: if usage.flags.contains(VarUsageInfoFlags::USED_RECURSIVELY) {
866+
f.ident.node_id = self.r.find_binding_by_ident(&f.ident);
866867
Some(f.ident)
867868
} else {
868869
None

crates/swc_ecma_minifier/src/compress/optimize/sequences.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -826,9 +826,6 @@ impl Optimizer<'_> {
826826
if let (Some(a_id), Some(b_id)) =
827827
(a_exp.left.as_ident(), b.name.as_ident())
828828
{
829-
debug_assert!(!self
830-
.r
831-
.is_ref_to_unresolved(a_id.id.node_id));
832829
let a_node_id = self.r.find_binding_by_ident(&a_id.id);
833830
if a_id.id.eq_ignore_span(&b_id.id)
834831
&& a_exp.op == op!("=")

crates/swc_ecma_transforms_base/src/resolve/mod.rs

Lines changed: 80 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -209,61 +209,35 @@ impl Resolver {
209209
self.references.add_reference(id, dummy_var);
210210
}
211211

212-
fn visit_pat_with_binding(&mut self, pat: &mut Pat, is_var: bool) {
213-
match pat {
214-
Pat::Ident(n) => {
215-
if is_var {
216-
self.hoist_decl_var_kind(n);
217-
} else {
218-
self.add_binding_for_ident(n);
219-
}
220-
}
212+
fn visit_pat_with_reference(&mut self, node: &mut Pat) {
213+
match node {
214+
Pat::Ident(_) => {}
221215
Pat::Array(n) => {
222216
for elem in n.elems.iter_mut().flatten() {
223-
self.visit_pat_with_binding(elem, is_var);
217+
self.visit_pat_with_reference(elem);
224218
}
225219
}
226220
Pat::Rest(n) => {
227-
self.visit_pat_with_binding(&mut n.arg, is_var);
221+
self.visit_pat_with_reference(&mut n.arg);
228222
}
229223
Pat::Object(n) => {
230224
for prop in n.props.iter_mut() {
231225
match prop {
232226
ObjectPatProp::KeyValue(p) => {
233-
if let PropName::Computed(key) = &mut p.key {
234-
struct BindingIdent<'r> {
235-
r: &'r mut Resolver,
236-
}
237-
impl<'r> VisitMut for BindingIdent<'r> {
238-
noop_visit_mut_type!();
239-
240-
fn visit_mut_ident(&mut self, ident: &mut Ident) {
241-
self.r.add_binding_for_ident(ident);
242-
}
243-
}
244-
let mut v = BindingIdent { r: self };
245-
key.visit_mut_children_with(&mut v);
246-
};
247-
self.visit_pat_with_binding(&mut p.value, is_var);
227+
self.visit_pat_with_reference(&mut p.value);
248228
}
249229
ObjectPatProp::Assign(p) => {
250-
if is_var {
251-
self.hoist_decl_var_kind(&mut p.key);
252-
} else {
253-
self.add_binding_for_ident(&mut p.key.id);
254-
}
255230
p.value.visit_mut_children_with(self);
256231
}
257232
ObjectPatProp::Rest(p) => {
258-
self.visit_pat_with_binding(&mut p.arg, is_var);
233+
self.visit_pat_with_reference(&mut p.arg);
259234
}
260235
}
261236
}
262237
}
263238
Pat::Assign(n) => {
264239
// TODO:
265-
self.visit_pat_with_binding(&mut n.left, is_var);
266-
n.right.visit_mut_children_with(self);
240+
n.right.visit_mut_with(self);
267241
}
268242
Pat::Invalid(_) => {
269243
// TODO:
@@ -393,8 +367,9 @@ impl VisitMut for Resolver {
393367
});
394368
}
395369

396-
fn visit_mut_param(&mut self, _: &mut Param) {
370+
fn visit_mut_param(&mut self, node: &mut Param) {
397371
// `node.pat` had been defined in `LookaheadResolver`
372+
self.visit_pat_with_reference(&mut node.pat);
398373
}
399374

400375
fn visit_mut_fn_decl(&mut self, node: &mut FnDecl) {
@@ -556,19 +531,83 @@ impl<'r> LookaheadResolver<'r> {
556531
f(this);
557532
});
558533
}
534+
535+
fn visit_pat_with_binding(&mut self, pat: &mut Pat, is_var: bool) {
536+
match pat {
537+
Pat::Ident(n) => {
538+
if is_var {
539+
self.r.hoist_decl_var_kind(n);
540+
} else {
541+
self.r.add_binding_for_ident(n);
542+
}
543+
}
544+
Pat::Array(n) => {
545+
for elem in n.elems.iter_mut().flatten() {
546+
self.visit_pat_with_binding(elem, is_var);
547+
}
548+
}
549+
Pat::Rest(n) => {
550+
self.visit_pat_with_binding(&mut n.arg, is_var);
551+
}
552+
Pat::Object(n) => {
553+
for prop in n.props.iter_mut() {
554+
match prop {
555+
ObjectPatProp::KeyValue(p) => {
556+
if let PropName::Computed(key) = &mut p.key {
557+
struct BindingIdent<'r> {
558+
r: &'r mut Resolver,
559+
}
560+
impl<'r> VisitMut for BindingIdent<'r> {
561+
noop_visit_mut_type!();
562+
563+
fn visit_mut_ident(&mut self, ident: &mut Ident) {
564+
self.r.add_binding_for_ident(ident);
565+
}
566+
}
567+
let mut v = BindingIdent { r: self.r };
568+
key.visit_mut_children_with(&mut v);
569+
};
570+
self.visit_pat_with_binding(&mut p.value, is_var);
571+
}
572+
ObjectPatProp::Assign(p) => {
573+
if is_var {
574+
self.r.hoist_decl_var_kind(&mut p.key);
575+
} else {
576+
self.r.add_binding_for_ident(&mut p.key.id);
577+
}
578+
p.value.visit_mut_children_with(self);
579+
}
580+
ObjectPatProp::Rest(p) => {
581+
self.visit_pat_with_binding(&mut p.arg, is_var);
582+
}
583+
}
584+
}
585+
}
586+
Pat::Assign(n) => {
587+
// TODO:
588+
self.visit_pat_with_binding(&mut n.left, is_var);
589+
n.right.visit_mut_with(self);
590+
}
591+
Pat::Invalid(_) => {
592+
// TODO:
593+
}
594+
Pat::Expr(_) => {
595+
// TODO:
596+
}
597+
}
598+
}
559599
}
560600

561601
impl<'r> VisitMut for LookaheadResolver<'r> {
562602
noop_visit_mut_type!();
563603

564604
fn visit_mut_param(&mut self, node: &mut Param) {
565-
self.r.visit_pat_with_binding(&mut node.pat, false);
605+
self.visit_pat_with_binding(&mut node.pat, false);
566606
}
567607

568608
fn visit_mut_var_decl(&mut self, node: &mut VarDecl) {
569609
for decl in &mut node.decls {
570-
self.r
571-
.visit_pat_with_binding(&mut decl.name, node.kind == VarDeclKind::Var);
610+
self.visit_pat_with_binding(&mut decl.name, node.kind == VarDeclKind::Var);
572611
decl.init.visit_mut_with(self);
573612
}
574613
}
@@ -632,7 +671,7 @@ impl<'r> VisitMut for LookaheadResolver<'r> {
632671
fn visit_mut_arrow_expr(&mut self, node: &mut ArrowExpr) {
633672
self.with_new_scope(ScopeKind::Fn, |this| {
634673
for param in &mut node.params {
635-
this.r.visit_pat_with_binding(param, false);
674+
this.visit_pat_with_binding(param, false);
636675
}
637676

638677
match node.body.as_mut() {
@@ -718,7 +757,7 @@ impl<'r> VisitMut for LookaheadResolver<'r> {
718757
if let Some(handler) = node.handler.as_mut() {
719758
self.with_new_scope(ScopeKind::Block, |this| {
720759
if let Some(param) = &mut handler.param {
721-
this.r.visit_pat_with_binding(param, false);
760+
this.visit_pat_with_binding(param, false);
722761
}
723762
handler.body.visit_mut_with(this);
724763
});
@@ -739,7 +778,7 @@ impl<'r> VisitMut for LookaheadResolver<'r> {
739778
fn visit_mut_setter_prop(&mut self, node: &mut SetterProp) {
740779
node.key.visit_mut_with(self);
741780
self.with_new_scope(ScopeKind::Fn, |this| {
742-
this.r.visit_pat_with_binding(&mut node.param, false);
781+
this.visit_pat_with_binding(&mut node.param, false);
743782
node.body.visit_mut_with(this)
744783
});
745784
}

crates/swc_ecma_utils/src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3392,8 +3392,7 @@ fn is_pure_callee(expr: &Expr, ctx: ExprCtx) -> bool {
33923392

33933393
Expr::Fn(FnExpr { function: f, .. })
33943394
if f.params.iter().all(|p| p.pat.is_ident())
3395-
&& f.body.is_some()
3396-
&& f.body.as_ref().unwrap().stmts.is_empty() =>
3395+
&& f.body.as_ref().is_some_and(|body| body.stmts.is_empty()) =>
33973396
{
33983397
true
33993398
}

0 commit comments

Comments
 (0)