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