swc_ecma_lints/rules/
mod.rs1use std::sync::Arc;
2
3use swc_common::{SourceMap, SyntaxContext};
4use swc_ecma_ast::*;
5
6use crate::{config::LintConfig, rule::Rule};
7
8mod const_assign;
9mod duplicate_bindings;
10mod duplicate_exports;
11mod no_dupe_args;
12mod utils;
13
14#[cfg(feature = "non_critical_lints")]
15#[path = ""]
16pub(crate) mod non_critical_lints {
17 pub mod constructor_super;
18 pub mod default_case_last;
19 pub mod default_param_last;
20 pub mod dot_notation;
21 pub mod eqeqeq;
22 pub mod no_alert;
23 pub mod no_await_in_loop;
24 pub mod no_bitwise;
25 pub mod no_compare_neg_zero;
26 pub mod no_cond_assign;
27 pub mod no_console;
28 pub mod no_debugger;
29 pub mod no_empty_function;
30 pub mod no_empty_pattern;
31 pub mod no_loop_func;
32 pub mod no_new;
33 pub mod no_new_object;
34 pub mod no_new_symbol;
35 pub mod no_obj_calls;
36 pub mod no_param_reassign;
37 pub mod no_prototype_builtins;
38 pub mod no_restricted_syntax;
39 pub mod no_sparse_arrays;
40 pub mod no_throw_literal;
41 pub mod no_use_before_define;
42 pub mod no_var;
43 pub mod prefer_const;
44 pub mod prefer_object_spread;
45 pub mod prefer_regex_literals;
46 pub mod quotes;
47 pub mod radix;
48 pub mod symbol_description;
49 pub mod use_is_nan;
50 pub mod valid_typeof;
51 pub mod yoda;
52}
53
54#[cfg(feature = "non_critical_lints")]
55use non_critical_lints::*;
56
57pub struct LintParams<'a> {
58 pub program: &'a Program,
59 pub lint_config: &'a LintConfig,
60 pub unresolved_ctxt: SyntaxContext,
61 pub top_level_ctxt: SyntaxContext,
62 pub es_version: EsVersion,
63 pub source_map: Arc<SourceMap>,
64}
65
66pub fn all(lint_params: LintParams) -> Vec<Box<dyn Rule>> {
67 let mut rules = vec![
68 const_assign::const_assign(),
69 duplicate_bindings::duplicate_bindings(),
70 duplicate_exports::duplicate_exports(),
71 no_dupe_args::no_dupe_args(),
72 ];
73
74 #[cfg(feature = "non_critical_lints")]
75 {
76 let LintParams {
77 program,
78 lint_config,
79 unresolved_ctxt,
80 top_level_ctxt: _,
81 es_version,
82 source_map,
83 } = lint_params;
84
85 rules.extend(no_use_before_define::no_use_before_define(
86 &lint_params.lint_config.no_use_before_define,
87 ));
88
89 rules.extend(no_console::no_console(
90 &lint_config.no_console,
91 unresolved_ctxt,
92 ));
93
94 rules.extend(no_alert::no_alert(
95 &lint_config.no_alert,
96 unresolved_ctxt,
97 es_version,
98 ));
99
100 rules.extend(no_debugger::no_debugger(&lint_config.no_debugger));
101
102 rules.extend(quotes::quotes(&lint_config.quotes));
103
104 rules.extend(prefer_regex_literals::prefer_regex_literals(
105 &lint_config.prefer_regex_literals,
106 unresolved_ctxt,
107 es_version,
108 ));
109
110 rules.extend(dot_notation::dot_notation(
111 program,
112 &lint_config.dot_notation,
113 ));
114
115 rules.extend(no_empty_function::no_empty_function(
116 &source_map,
117 &lint_config.no_empty_function,
118 ));
119
120 rules.extend(no_empty_pattern::no_empty_pattern(
121 &lint_config.no_empty_pattern,
122 ));
123
124 rules.extend(eqeqeq::eqeqeq(&lint_config.eqeqeq));
125
126 rules.extend(no_loop_func::no_loop_func(&lint_config.no_loop_func));
127
128 rules.extend(no_new::no_new(&lint_config.no_new));
129
130 rules.extend(no_restricted_syntax::no_restricted_syntax(
131 &lint_config.no_restricted_syntax,
132 ));
133
134 rules.extend(radix::radix(unresolved_ctxt, &lint_config.radix));
135
136 rules.extend(no_bitwise::no_bitwise(&lint_config.no_bitwise));
137
138 rules.extend(default_param_last::default_param_last(
139 &lint_config.default_param_last,
140 ));
141
142 rules.extend(yoda::yoda(&lint_config.yoda));
143
144 rules.extend(no_new_symbol::no_new_symbol(
145 unresolved_ctxt,
146 &lint_config.no_new_symbol,
147 ));
148
149 rules.extend(use_is_nan::use_is_nan(
150 unresolved_ctxt,
151 &lint_config.use_isnan,
152 ));
153
154 rules.extend(valid_typeof::valid_typeof(&lint_config.valid_typeof));
155
156 rules.extend(no_param_reassign::no_param_reassign(
157 &lint_config.no_param_reassign,
158 ));
159
160 rules.extend(symbol_description::symbol_description(
161 unresolved_ctxt,
162 &lint_config.symbol_description,
163 ));
164
165 rules.extend(no_obj_calls::no_obj_calls(
166 unresolved_ctxt,
167 &lint_config.no_obj_calls,
168 ));
169
170 rules.extend(no_throw_literal::no_throw_literal(
171 &lint_config.no_throw_literal,
172 ));
173
174 rules.extend(no_var::no_var(&lint_config.no_var));
175
176 rules.extend(prefer_const::prefer_const(&lint_config.prefer_const));
177
178 rules.extend(no_compare_neg_zero::no_compare_neg_zero(
179 &lint_config.no_compare_neg_zero,
180 ));
181
182 rules.extend(constructor_super::constructor_super(
183 &lint_config.constructor_super,
184 ));
185
186 rules.extend(no_sparse_arrays::no_sparse_arrays(
187 &lint_config.no_sparse_arrays,
188 ));
189
190 rules.extend(default_case_last::default_case_last(
191 &lint_config.default_case_last,
192 ));
193
194 rules.extend(no_await_in_loop::no_await_in_loop(
195 &lint_config.no_await_in_loop,
196 ));
197
198 rules.extend(no_cond_assign::no_cond_assign(&lint_config.no_cond_assign));
199
200 rules.extend(no_prototype_builtins::no_prototype_builtins(
201 &lint_config.no_prototype_builtins,
202 ));
203
204 rules.extend(no_new_object::no_new_object(
205 unresolved_ctxt,
206 &lint_config.no_new_object,
207 ));
208
209 rules.extend(prefer_object_spread::prefer_object_spread(
210 &lint_config.prefer_object_spread,
211 unresolved_ctxt,
212 es_version,
213 ));
214 }
215
216 rules
217}
218
219pub fn lint_pass<R>(r: R) -> impl Pass
220where
221 R: Rule,
222{
223 LintPass(r)
224}
225
226struct LintPass<R>(R)
227where
228 R: Rule;
229
230impl<R> Pass for LintPass<R>
231where
232 R: Rule,
233{
234 fn process(&mut self, program: &mut Program) {
235 match program {
236 Program::Module(m) => self.0.lint_module(m),
237 Program::Script(s) => self.0.lint_script(s),
238 }
239 }
240}