Skip to content

Commit

Permalink
fix(es/lints): Allow duplicate function in non-top level (#5011)
Browse files Browse the repository at this point in the history
  • Loading branch information
Austaras committed Jun 21, 2022
1 parent 1e313c0 commit 4a422a0
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
28 changes: 26 additions & 2 deletions crates/swc_ecma_lints/src/rules/duplicate_bindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
use crate::rule::{visitor_rule, Rule};

pub fn duplicate_bindings() -> Box<dyn Rule> {
visitor_rule(DuplicateBindings::default())
visitor_rule(DuplicateBindings {
top_level: true,
..Default::default()
})
}

#[derive(Debug, Default, Clone, Copy)]
Expand All @@ -29,6 +32,8 @@ struct DuplicateBindings {
is_pat_decl: bool,

is_module: bool,

top_level: bool,
}

impl DuplicateBindings {
Expand Down Expand Up @@ -91,6 +96,13 @@ impl DuplicateBindings {
self.is_pat_decl = old_is_pat_decl;
self.var_decl_kind = old_var_decl_kind;
}

fn visit_with_fn_scope<V: VisitWith<Self>>(&mut self, e: &V) {
let top_level = self.top_level;
self.top_level = false;
e.visit_children_with(self);
self.top_level = top_level;
}
}

impl Visit for DuplicateBindings {
Expand All @@ -104,6 +116,18 @@ impl Visit for DuplicateBindings {
}
}

fn visit_function(&mut self, f: &Function) {
self.visit_with_fn_scope(f)
}

fn visit_arrow_expr(&mut self, a: &ArrowExpr) {
self.visit_with_fn_scope(a)
}

fn visit_class(&mut self, c: &Class) {
self.visit_with_fn_scope(c)
}

fn visit_catch_clause(&mut self, c: &CatchClause) {
self.visit_with_kind(c, Some(VarDeclKind::Var))
}
Expand All @@ -129,7 +153,7 @@ impl Visit for DuplicateBindings {

fn visit_fn_decl(&mut self, d: &FnDecl) {
if d.function.body.is_some() {
self.add(&d.ident, self.is_module);
self.add(&d.ident, self.is_module && self.top_level);
}

d.visit_children_with(self);
Expand Down
9 changes: 9 additions & 0 deletions crates/swc_ecma_lints/tests/pass/issue-4907/1/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export function promisify(original) {
if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) {
var fn = original[kCustomPromisifiedSymbol];
return fn;
}

function fn() {
}
}

1 comment on commit 4a422a0

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 4a422a0 Previous: fd73895 Ratio
es/full/minify/libraries/antd 1708789869 ns/iter (± 66706653) 1722201457 ns/iter (± 29378899) 0.99
es/full/minify/libraries/d3 441122774 ns/iter (± 25164750) 432234706 ns/iter (± 13611482) 1.02
es/full/minify/libraries/echarts 1737623395 ns/iter (± 65310755) 1670693409 ns/iter (± 48664742) 1.04
es/full/minify/libraries/jquery 98497566 ns/iter (± 10143867) 93748307 ns/iter (± 7275269) 1.05
es/full/minify/libraries/lodash 132109572 ns/iter (± 5948853) 122099433 ns/iter (± 4598892) 1.08
es/full/minify/libraries/moment 58031772 ns/iter (± 4007249) 52190763 ns/iter (± 997997) 1.11
es/full/minify/libraries/react 18962161 ns/iter (± 1806726) 17271603 ns/iter (± 277058) 1.10
es/full/minify/libraries/terser 627341239 ns/iter (± 43144083) 610229525 ns/iter (± 10711538) 1.03
es/full/minify/libraries/three 565764889 ns/iter (± 12966934) 565738433 ns/iter (± 14450860) 1.00
es/full/minify/libraries/typescript 3796407181 ns/iter (± 362431071) 3531752680 ns/iter (± 48553770) 1.07
es/full/minify/libraries/victory 724103006 ns/iter (± 28035784) 715409073 ns/iter (± 11668534) 1.01
es/full/minify/libraries/vue 134714491 ns/iter (± 9146621) 152493357 ns/iter (± 12340751) 0.88
es/full/codegen/es3 31853 ns/iter (± 2639) 31948 ns/iter (± 846) 1.00
es/full/codegen/es5 31761 ns/iter (± 851) 32082 ns/iter (± 950) 0.99
es/full/codegen/es2015 31900 ns/iter (± 1460) 32091 ns/iter (± 3492) 0.99
es/full/codegen/es2016 31767 ns/iter (± 931) 32209 ns/iter (± 649) 0.99
es/full/codegen/es2017 31739 ns/iter (± 3059) 32097 ns/iter (± 572) 0.99
es/full/codegen/es2018 31847 ns/iter (± 657) 32076 ns/iter (± 667) 0.99
es/full/codegen/es2019 31787 ns/iter (± 886) 32005 ns/iter (± 639) 0.99
es/full/codegen/es2020 31828 ns/iter (± 601) 31951 ns/iter (± 696) 1.00
es/full/all/es3 190140710 ns/iter (± 10072930) 184897655 ns/iter (± 6609962) 1.03
es/full/all/es5 170226469 ns/iter (± 8790592) 176175604 ns/iter (± 9226067) 0.97
es/full/all/es2015 140274924 ns/iter (± 5373236) 141187979 ns/iter (± 4148023) 0.99
es/full/all/es2016 138269077 ns/iter (± 5982364) 139207696 ns/iter (± 3890810) 0.99
es/full/all/es2017 141955626 ns/iter (± 11337551) 138898106 ns/iter (± 3217956) 1.02
es/full/all/es2018 140671711 ns/iter (± 6276477) 137287596 ns/iter (± 3681922) 1.02
es/full/all/es2019 140889805 ns/iter (± 5607908) 138247359 ns/iter (± 4164279) 1.02
es/full/all/es2020 134256345 ns/iter (± 4870264) 130564266 ns/iter (± 4247863) 1.03
es/full/parser 705360 ns/iter (± 18211) 712483 ns/iter (± 20912) 0.99
es/full/base/fixer 29151 ns/iter (± 1023) 29478 ns/iter (± 865) 0.99
es/full/base/resolver_and_hygiene 87705 ns/iter (± 3015) 87527 ns/iter (± 1660) 1.00
serialization of ast node 206 ns/iter (± 2) 208 ns/iter (± 2) 0.99
serialization of serde 232 ns/iter (± 1) 219 ns/iter (± 4) 1.06

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.