1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use super::Context;
use super::LintRule;
use swc_common::Span;
pub struct BanUntaggedIgnore;
impl LintRule for BanUntaggedIgnore {
fn new() -> Box<Self> {
Box::new(BanUntaggedIgnore)
}
fn tags(&self) -> &[&'static str] {
&["recommended"]
}
fn code(&self) -> &'static str {
"ban-untagged-ignore"
}
fn lint_module(
&self,
context: &mut Context,
_module: &swc_ecmascript::ast::Module,
) {
let violated_spans: Vec<Span> = context
.ignore_directives
.borrow()
.iter()
.filter_map(|d| {
if d.codes.is_empty() {
Some(d.span)
} else {
None
}
})
.collect();
for span in violated_spans {
context.add_diagnostic_with_hint(
span,
"ban-untagged-ignore",
"Ignore directive requires lint rule name(s)",
"Add one or more lint rule names. E.g. // deno-lint-ignore adjacent-overload-signatures",
)
}
}
fn docs(&self) -> &'static str {
r#"Requires `deno-lint-ignore` to be annotated with one or more rule names.
Ignoring all rules can mask unexpected or future problems. Therefore you need to explicitly specify which rule(s) are to be ignored.
### Valid:
```typescript
// deno-lint-ignore no-dupe-args
export function duplicateArgumentsFn(a, b, a) { }
```
### Invalid:
```typescript
// deno-lint-ignore
export function duplicateArgumentsFn(a, b, a) { }
```"#
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_util::*;
#[test]
fn ban_ts_ignore() {
assert_lint_err_on_line::<BanUntaggedIgnore>(
r#"
// deno-lint-ignore
function foo() {
// pass
}
"#,
2,
0,
);
assert_lint_ok::<BanUntaggedIgnore>(
r#"
// deno-lint-ignore some-code some-code-2
function bar() {
// pass
}
"#,
);
}
}