Skip to content

Commit

Permalink
feat(es/lints): Mark catch params as binding patterns while checking …
Browse files Browse the repository at this point in the history
…duplicates (#3981)
  • Loading branch information
kdy1 authored Mar 12, 2022
1 parent 28bc1e2 commit f28134f
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
try {
} catch (foo) {
let foo;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: the name `foo` is defined multiple times

|
2 | } catch (foo) {
| --- previous definition of `foo` here
3 | let foo;
| ^^^ `foo` redefined here

47 changes: 30 additions & 17 deletions crates/swc_ecma_lints/src/rules/duplicate_bindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,23 +84,6 @@ impl DuplicateBindings {
impl Visit for DuplicateBindings {
noop_visit_type!();

fn visit_module(&mut self, m: &Module) {
m.visit_with(&mut TypeCollector {
type_bindings: &mut self.type_bindings,
});

self.is_module = true;
m.visit_children_with(self);
}

fn visit_script(&mut self, s: &Script) {
s.visit_with(&mut TypeCollector {
type_bindings: &mut self.type_bindings,
});

s.visit_children_with(self);
}

fn visit_assign_pat_prop(&mut self, p: &AssignPatProp) {
p.visit_children_with(self);

Expand All @@ -109,6 +92,19 @@ impl Visit for DuplicateBindings {
}
}

fn visit_catch_clause(&mut self, c: &CatchClause) {
let old_var_decl_kind = self.var_decl_kind.take();
let old_is_pat_decl = self.is_pat_decl;

self.var_decl_kind = Some(VarDeclKind::Var);
self.is_pat_decl = true;

c.visit_children_with(self);

self.is_pat_decl = old_is_pat_decl;
self.var_decl_kind = old_var_decl_kind;
}

fn visit_class_decl(&mut self, d: &ClassDecl) {
self.add(&d.ident, true);

Expand Down Expand Up @@ -160,6 +156,15 @@ impl Visit for DuplicateBindings {
}
}

fn visit_module(&mut self, m: &Module) {
m.visit_with(&mut TypeCollector {
type_bindings: &mut self.type_bindings,
});

self.is_module = true;
m.visit_children_with(self);
}

fn visit_pat(&mut self, p: &Pat) {
p.visit_children_with(self);

Expand All @@ -170,6 +175,14 @@ impl Visit for DuplicateBindings {
}
}

fn visit_script(&mut self, s: &Script) {
s.visit_with(&mut TypeCollector {
type_bindings: &mut self.type_bindings,
});

s.visit_children_with(self);
}

fn visit_var_decl(&mut self, d: &VarDecl) {
let old_var_decl_kind = self.var_decl_kind.take();
let old_is_pat_decl = self.is_pat_decl;
Expand Down
14 changes: 8 additions & 6 deletions crates/swc_ecma_lints/tests/fixture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use swc_common::{input::SourceFileInput, Mark, SyntaxContext};
use swc_ecma_ast::{EsVersion, Program};
use swc_ecma_lints::{
config::LintConfig,
rule::Rule,
rules::{all, LintParams},
};
use swc_ecma_parser::{lexer::Lexer, Parser, Syntax};
Expand Down Expand Up @@ -53,19 +54,20 @@ fn pass(input: PathBuf) {

let config = LintConfig::default();

let rules = all(LintParams {
let mut rules = all(LintParams {
program: &program,
lint_config: &config,
top_level_ctxt,
es_version,
source_map: cm,
});

HANDLER.set(handler, || {
if let Program::Module(m) = &program {
for mut rule in rules {
rule.lint_module(m);
}
HANDLER.set(handler, || match &program {
Program::Module(m) => {
rules.lint_module(m);
}
Program::Script(s) => {
rules.lint_script(s);
}
});

Expand Down

1 comment on commit f28134f

@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: f28134f Previous: 485dc54 Ratio
base_tr_fixer 23665 ns/iter (± 578) 26837 ns/iter (± 969) 0.88
base_tr_resolver_and_hygiene 128808 ns/iter (± 19923) 147068 ns/iter (± 32307) 0.88
codegen_es2015 27521 ns/iter (± 183) 32212 ns/iter (± 3984) 0.85
codegen_es2016 27388 ns/iter (± 256) 32099 ns/iter (± 5433) 0.85
codegen_es2017 27487 ns/iter (± 543) 32149 ns/iter (± 599) 0.85
codegen_es2018 27549 ns/iter (± 211) 32194 ns/iter (± 2497) 0.86
codegen_es2019 27448 ns/iter (± 257) 32067 ns/iter (± 1778) 0.86
codegen_es2020 27554 ns/iter (± 342) 32197 ns/iter (± 704) 0.86
codegen_es3 27499 ns/iter (± 192) 32186 ns/iter (± 3617) 0.85
codegen_es5 27472 ns/iter (± 211) 32662 ns/iter (± 4000) 0.84
full_es2015 139513847 ns/iter (± 4440078) 175182511 ns/iter (± 28278367) 0.80
full_es2016 137626020 ns/iter (± 23086229) 171469126 ns/iter (± 25350791) 0.80
full_es2017 137370664 ns/iter (± 25384570) 171845238 ns/iter (± 18395810) 0.80
full_es2018 135850570 ns/iter (± 24429513) 173652917 ns/iter (± 20656069) 0.78
full_es2019 135498085 ns/iter (± 24819108) 166230253 ns/iter (± 22247977) 0.82
full_es2020 125541855 ns/iter (± 20756760) 165181169 ns/iter (± 24307258) 0.76
full_es3 184167665 ns/iter (± 22631533) 225778955 ns/iter (± 27000937) 0.82
full_es5 174918232 ns/iter (± 23330527) 222745427 ns/iter (± 30374453) 0.79
parser 553565 ns/iter (± 19152) 663640 ns/iter (± 50888) 0.83
ser_ast_node 148 ns/iter (± 2) 179 ns/iter (± 18) 0.83
ser_serde 151 ns/iter (± 2) 184 ns/iter (± 2) 0.82
emit_colors 4949527 ns/iter (± 3456160) 12627024 ns/iter (± 9607593) 0.39
emit_large 124445851 ns/iter (± 185969138) 115443106 ns/iter (± 175912328) 1.08
base_clone 2643660 ns/iter (± 68731) 2752797 ns/iter (± 149478) 0.96
fold_span 4467815 ns/iter (± 150652) 5064514 ns/iter (± 721413) 0.88
fold_span_panic 4685691 ns/iter (± 120084) 5163550 ns/iter (± 565415) 0.91
visit_mut_span 3210272 ns/iter (± 217367) 3332560 ns/iter (± 315651) 0.96
visit_mut_span_panic 3073045 ns/iter (± 79718) 3555148 ns/iter (± 457561) 0.86
usage_builtin_type 15374347 ns/iter (± 9609023) 18062389 ns/iter (± 11345197) 0.85
usage_property 356196 ns/iter (± 2405) 429010 ns/iter (± 8059) 0.83
boxing_boxed 168 ns/iter (± 0) 204 ns/iter (± 0) 0.82
boxing_boxed_clone 92 ns/iter (± 0) 110 ns/iter (± 0) 0.84
boxing_unboxed 120 ns/iter (± 0) 135 ns/iter (± 0) 0.89
boxing_unboxed_clone 63 ns/iter (± 0) 75 ns/iter (± 0) 0.84
time_10 300 ns/iter (± 4) 363 ns/iter (± 5) 0.83
time_15 662 ns/iter (± 2) 762 ns/iter (± 12) 0.87
time_20 1432 ns/iter (± 9) 1352 ns/iter (± 23) 1.06
time_40 7002 ns/iter (± 24) 4954 ns/iter (± 81) 1.41
time_5 99 ns/iter (± 2) 120 ns/iter (± 1) 0.82
time_60 16656 ns/iter (± 56) 11008 ns/iter (± 165) 1.51
total 0 ns/iter (± 0) 0 ns/iter (± 0) NaN

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

Please sign in to comment.