File tree Expand file tree Collapse file tree 3 files changed +62
-13
lines changed
Expand file tree Collapse file tree 3 files changed +62
-13
lines changed Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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" , ( ) => {
You can’t perform that action at this time.
0 commit comments