diff --git a/crates/oxc_linter/src/disable_directives.rs b/crates/oxc_linter/src/disable_directives.rs index c4b0fc32147b5..b5a71f486948b 100644 --- a/crates/oxc_linter/src/disable_directives.rs +++ b/crates/oxc_linter/src/disable_directives.rs @@ -10,6 +10,7 @@ enum DisabledRule<'a> { } /// A comment which disables one or more specific rules +#[derive(Debug)] pub struct DisableRuleComment<'a> { /// Span of the comment pub span: Span, diff --git a/crates/oxc_linter/src/rules/eslint/max_lines.rs b/crates/oxc_linter/src/rules/eslint/max_lines.rs index 9aae4a5925380..f62f2fe9fe920 100644 --- a/crates/oxc_linter/src/rules/eslint/max_lines.rs +++ b/crates/oxc_linter/src/rules/eslint/max_lines.rs @@ -78,6 +78,7 @@ impl Rule for MaxLines { } } + #[allow(clippy::cast_possible_truncation)] fn run_once(&self, ctx: &LintContext) { let comment_lines = if self.skip_comments { let mut comment_lines: usize = 0; @@ -125,7 +126,9 @@ impl Rule for MaxLines { }; if lines_in_file.saturating_sub(blank_lines).saturating_sub(comment_lines) > self.max { - ctx.diagnostic(max_lines_diagnostic(lines_in_file, self.max, Span::new(0, 0))); + // Point to end of the file for `eslint-disable max-lines` to work. + let end = ctx.source_text().len().saturating_sub(1) as u32; + ctx.diagnostic(max_lines_diagnostic(lines_in_file, self.max, Span::new(end, end))); } } } @@ -192,6 +195,13 @@ fn test() { long comment*/", Some(serde_json::json!([{ "max": 2, "skipComments": true, "skipBlankLines": true }])), ), + ( + "/* eslint-disable max-lines */ + + ; + ", + Some(serde_json::json!([{ "max": 1 }])), + ), ]; let fail = vec![ diff --git a/crates/oxc_linter/src/snapshots/max_lines.snap b/crates/oxc_linter/src/snapshots/max_lines.snap index 3fe7de5322ab7..4c5d3d57a59f2 100644 --- a/crates/oxc_linter/src/snapshots/max_lines.snap +++ b/crates/oxc_linter/src/snapshots/max_lines.snap @@ -2,66 +2,66 @@ source: crates/oxc_linter/src/tester.rs --- ⚠ eslint(max-lines): File has too many lines (3). - ╭─[max_lines.tsx:1:1] - 1 │ var xyz; - · ▲ + ╭─[max_lines.tsx:3:8] 2 │ var xyz; + 3 │ var xyz; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (4). - ╭─[max_lines.tsx:1:1] - 1 │ /* a multiline comment - · ▲ - 2 │ that goes to many lines*/ + ╭─[max_lines.tsx:4:7] + 3 │ var xy; + 4 │ var xy; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (3). - ╭─[max_lines.tsx:1:1] - 1 │ //a single line comment - · ▲ + ╭─[max_lines.tsx:3:7] 2 │ var xy; + 3 │ var xy; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (5). - ╭─[max_lines.tsx:1:1] - 1 │ var x; - · ▲ - 2 │ + ╭─[max_lines.tsx:5:9] + 4 │ + 5 │ var y; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (8). - ╭─[max_lines.tsx:1:1] - 1 │ //a single line comment - · ▲ - 2 │ var xy; + ╭─[max_lines.tsx:8:18] + 7 │ really really + 8 │ long comment*/ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (3). - ╭─[max_lines.tsx:1:1] - 1 │ var x; // inline comment - · ▲ + ╭─[max_lines.tsx:3:9] 2 │ var y; + 3 │ var z; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (4). - ╭─[max_lines.tsx:1:1] - 1 │ var x; /* inline comment - · ▲ - 2 │ spanning multiple lines */ + ╭─[max_lines.tsx:4:9] + 3 │ var y; + 4 │ var z; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (8). - ╭─[max_lines.tsx:1:1] - 1 │ //a single line comment - · ▲ - 2 │ var xy; + ╭─[max_lines.tsx:8:18] + 7 │ really really + 8 │ long comment*/ + · ▲ ╰──── help: Maximum allowed is 2. @@ -78,10 +78,10 @@ source: crates/oxc_linter/src/tester.rs help: Maximum allowed is 0. ⚠ eslint(max-lines): File has too many lines (2). - ╭─[max_lines.tsx:1:1] + ╭─[max_lines.tsx:2:3] 1 │ - · ▲ 2 │ + · ▲ ╰──── help: Maximum allowed is 0. @@ -93,147 +93,145 @@ source: crates/oxc_linter/src/tester.rs help: Maximum allowed is 0. ⚠ eslint(max-lines): File has too many lines (2). - ╭─[max_lines.tsx:1:1] + ╭─[max_lines.tsx:2:3] 1 │ A - · ▲ 2 │ + · ▲ ╰──── help: Maximum allowed is 0. ⚠ eslint(max-lines): File has too many lines (2). - ╭─[max_lines.tsx:1:1] + ╭─[max_lines.tsx:2:4] 1 │ A - · ▲ 2 │ + · ▲ ╰──── help: Maximum allowed is 0. ⚠ eslint(max-lines): File has too many lines (2). - ╭─[max_lines.tsx:1:1] + ╭─[max_lines.tsx:2:4] 1 │ A - · ▲ 2 │ + · ▲ ╰──── help: Maximum allowed is 1. ⚠ eslint(max-lines): File has too many lines (3). - ╭─[max_lines.tsx:1:1] - 1 │ A - · ▲ + ╭─[max_lines.tsx:3:3] 2 │ + 3 │ + · ▲ ╰──── help: Maximum allowed is 1. ⚠ eslint(max-lines): File has too many lines (4). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ var x + ╭─[max_lines.tsx:4:14] + 3 │ var c; + 4 │ console.log + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (3). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a', - · ▲ + ╭─[max_lines.tsx:3:6] 2 │ c, + 3 │ x; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (4). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a', - · ▲ - 2 │ c, + ╭─[max_lines.tsx:4:3] + 3 │ x; + 4 │ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (6). - ╭─[max_lines.tsx:1:1] - 1 │ - · ▲ - 2 │ - 3 │ var a = 'a', + ╭─[max_lines.tsx:6:3] + 5 │ x; + 6 │ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (6). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ var x + ╭─[max_lines.tsx:6:14] + 5 │ // some block + 6 │ // comments + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (5). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ var x + ╭─[max_lines.tsx:5:23] + 4 │ console.log + 5 │ /* block comments */ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (6). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ var x + ╭─[max_lines.tsx:6:3] + 5 │ /* block comments */ + 6 │ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (7). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ var x + ╭─[max_lines.tsx:7:15] + 6 │ + 7 │ comments */ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (4). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ + ╭─[max_lines.tsx:4:13] + 3 │ + 4 │ // comment + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (8). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ var x + ╭─[max_lines.tsx:8:3] + 7 │ + 8 │ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (8). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ + ╭─[max_lines.tsx:8:3] + 7 │ + 8 │ + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (6). - ╭─[max_lines.tsx:1:1] - 1 │ var a = 'a'; - · ▲ - 2 │ // + ╭─[max_lines.tsx:6:5] + 5 │ console.log + 6 │ // + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (9). - ╭─[max_lines.tsx:1:1] - 1 │ // hello world - · ▲ - 2 │ /*hello + ╭─[max_lines.tsx:9:5] + 8 │ e, + 9 │ f; + · ▲ ╰──── help: Maximum allowed is 2. ⚠ eslint(max-lines): File has too many lines (11). - ╭─[max_lines.tsx:1:1] - 1 │ - · ▲ - 2 │ var x = ''; - 3 │ - ╰──── + ╭─[max_lines.tsx:11:13] + 10 │ + 11 │ // comment + · ▲ + ╰──── help: Maximum allowed is 2.