swc_ecma_lints/rules/
mod.rs

1use 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}