diff --git a/crates/oxc_parser/src/diagnostics.rs b/crates/oxc_parser/src/diagnostics.rs index 178427b10ab20..87f65d51aca24 100644 --- a/crates/oxc_parser/src/diagnostics.rs +++ b/crates/oxc_parser/src/diagnostics.rs @@ -1121,6 +1121,11 @@ pub fn parameter_modifiers_in_ts( .with_allowed_modifier_help(allowed) } +#[cold] +pub fn implements_clause_in_ts(span: Span) -> OxcDiagnostic { + ts_error("8005", "'implements' clauses can only be used in TypeScript files.").with_label(span) +} + #[cold] pub fn implementation_in_ambient(span: Span) -> OxcDiagnostic { ts_error("1183", "An implementation cannot be declared in ambient contexts.").with_label(span) diff --git a/crates/oxc_parser/src/js/class.rs b/crates/oxc_parser/src/js/class.rs index 33d4b4600d3fa..ad96b967ad983 100644 --- a/crates/oxc_parser/src/js/class.rs +++ b/crates/oxc_parser/src/js/class.rs @@ -146,6 +146,9 @@ impl<'a, C: Config> ParserImpl<'a, C> { )); } let implements_kw_span = self.cur_token().span(); + if !self.is_ts { + self.error(diagnostics::implements_clause_in_ts(implements_kw_span)); + } if let Some((_, implements)) = implements.as_mut() { implements.extend(self.parse_ts_implements_clause()); } else { diff --git a/tasks/coverage/snapshots/parser_typescript.snap b/tasks/coverage/snapshots/parser_typescript.snap index c8b49013ca6ca..12853113038e9 100644 --- a/tasks/coverage/snapshots/parser_typescript.snap +++ b/tasks/coverage/snapshots/parser_typescript.snap @@ -3,7 +3,7 @@ commit: 34725489 parser_typescript Summary: AST Parsed : 9831/9834 (99.97%) Positive Passed: 9820/9834 (99.86%) -Negative Passed: 1527/2578 (59.23%) +Negative Passed: 1528/2578 (59.27%) Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/FunctionDeclaration3.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/FunctionDeclaration4.ts @@ -530,8 +530,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/jsFileCompil Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/jsFileCompilationDuplicateFunctionImplementationFileOrderReversed.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/jsFileCompilationHeritageClauseSyntaxOfClass.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/jsFileCompilationOptionalClassElementSyntaxOfClass.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/jsFileCompilationPublicMethodSyntaxOfClass.ts @@ -7370,6 +7368,12 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc ╰──── help: Add a function body (`{}`). + × TS(8005): 'implements' clauses can only be used in TypeScript files. + ╭─[typescript/tests/cases/compiler/jsFileCompilationHeritageClauseSyntaxOfClass.ts:1:9] + 1 │ class C implements D { } + · ────────── + ╰──── + × TS(8002): 'import ... =' can only be used in TypeScript files. ╭─[typescript/tests/cases/compiler/jsFileCompilationImportEqualsSyntax.ts:1:1] 1 │ import a = b;