Skip to content

Commit 34951ed

Browse files
committed
fix(linter/plugins): filename option takes precedence over parserOptions.lang in RuleTester (#18643)
Fix `RuleTester`' s behavior when test case defines both `filename` and `parserOptions.lang`. `filename` takes precedence.
1 parent 28df160 commit 34951ed

File tree

3 files changed

+62
-13
lines changed

3 files changed

+62
-13
lines changed

apps/oxlint/conformance/src/rule_tester.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,19 @@ function modifyTestCase(test: TestCase): void {
194194
}
195195

196196
if (parserDetails !== null) {
197-
let { lang } = parserDetails;
198-
if (parserOptions.ecmaFeatures?.jsx === true) {
199-
if (lang === "ts") {
200-
lang = "tsx";
201-
} else if (lang === "js") {
202-
lang = "jsx";
197+
// If test case provides a filename, that takes precedence over the parser's default language.
198+
// Don't set `lang` option, to allow Rust-side code to determine language from file extension.
199+
if (test.filename == null) {
200+
let { lang } = parserDetails;
201+
if (parserOptions.ecmaFeatures?.jsx === true) {
202+
if (lang === "ts") {
203+
lang = "tsx";
204+
} else if (lang === "js") {
205+
lang = "jsx";
206+
}
203207
}
208+
parserOptions.lang = lang;
204209
}
205-
parserOptions.lang = lang;
206210

207211
// Store parser details in test case so tests using different parsers don't get detected as duplicates.
208212
// Store in stored test case so they appear in snapshot.

apps/oxlint/src-js/package/rule_tester.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ interface ParserOptions {
179179
ecmaFeatures?: EcmaFeatures;
180180
/**
181181
* Language variant to parse file as.
182+
*
183+
* If test case provides a filename, that takes precedence over `lang` option.
184+
* Language will be inferred from file extension.
182185
*/
183186
lang?: Language;
184187
/**
@@ -1090,12 +1093,14 @@ function getParseOptions(test: TestCase): ParseOptions {
10901093
// Handle `parserOptions.ignoreNonFatalErrors`
10911094
if (parserOptions.ignoreNonFatalErrors === true) parseOptions.ignoreNonFatalErrors = true;
10921095

1093-
// Handle `parserOptions.lang`
1094-
const { lang } = parserOptions;
1095-
if (lang != null) {
1096-
parseOptions.lang = lang;
1097-
} else if (parserOptions.ecmaFeatures?.jsx === true) {
1098-
parseOptions.lang = "jsx";
1096+
// Handle `parserOptions.lang`. `filename` takes precedence over `lang` if provided.
1097+
if (test.filename == null) {
1098+
const { lang } = parserOptions;
1099+
if (lang != null) {
1100+
parseOptions.lang = lang;
1101+
} else if (parserOptions.ecmaFeatures?.jsx === true) {
1102+
parseOptions.lang = "jsx";
1103+
}
10991104
}
11001105
}
11011106

apps/oxlint/test/rule_tester.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,6 +2205,46 @@ describe("RuleTester", () => {
22052205
]
22062206
`);
22072207
});
2208+
2209+
it("is overridden by `filename`", () => {
2210+
const tester = new RuleTester();
2211+
tester.run("no-foo", simpleRule, {
2212+
valid: [
2213+
{
2214+
code: "let x: number;",
2215+
filename: "foo.ts",
2216+
languageOptions: { parserOptions: { lang: "js" } },
2217+
},
2218+
{
2219+
code: "<div />",
2220+
filename: "foo.jsx",
2221+
languageOptions: { parserOptions: { lang: "ts" } },
2222+
},
2223+
],
2224+
invalid: [
2225+
{
2226+
code: "let x: number;",
2227+
filename: "foo.jsx",
2228+
languageOptions: { parserOptions: { lang: "ts" } },
2229+
errors: 1,
2230+
},
2231+
{
2232+
code: "<div />",
2233+
filename: "foo.ts",
2234+
languageOptions: { parserOptions: { lang: "jsx" } },
2235+
errors: 1,
2236+
},
2237+
],
2238+
});
2239+
expect(runCases()).toMatchInlineSnapshot(`
2240+
[
2241+
null,
2242+
null,
2243+
[Error: Parsing failed],
2244+
[Error: Parsing failed],
2245+
]
2246+
`);
2247+
});
22082248
});
22092249

22102250
describe("ecmaFeatures.jsx", () => {

0 commit comments

Comments
 (0)