diff --git a/crates/oxc_parser/src/diagnostics.rs b/crates/oxc_parser/src/diagnostics.rs index 0371ea27a6bfd..9783f989b4cc8 100644 --- a/crates/oxc_parser/src/diagnostics.rs +++ b/crates/oxc_parser/src/diagnostics.rs @@ -306,6 +306,11 @@ pub fn optional_accessor_property(span: Span) -> OxcDiagnostic { ts_error("1276", "An 'accessor' property cannot be declared optional.").with_label(span) } +#[cold] +pub fn constructor_accessor(span: Span) -> OxcDiagnostic { + OxcDiagnostic::error("Classes may not have a field named 'constructor'").with_label(span) +} + #[cold] pub fn optional_definite_property(span: Span) -> OxcDiagnostic { // NOTE: could not find an error code when tsc parses this; its parser panics. diff --git a/crates/oxc_parser/src/js/class.rs b/crates/oxc_parser/src/js/class.rs index 1a7fe68ae7f44..4d34935562dba 100644 --- a/crates/oxc_parser/src/js/class.rs +++ b/crates/oxc_parser/src/js/class.rs @@ -1,7 +1,7 @@ use oxc_allocator::{Box, Vec}; use oxc_ast::ast::*; use oxc_ecmascript::PropName; -use oxc_span::Span; +use oxc_span::{GetSpan, Span}; use crate::{ Context, ParserImpl, StatementContext, diagnostics, @@ -522,6 +522,9 @@ impl<'a> ParserImpl<'a> { if let Some(optional_span) = optional_span { self.error(diagnostics::optional_accessor_property(optional_span)); } + if name.is_specific_string_literal("constructor") && !computed { + self.error(diagnostics::constructor_accessor(name.span())); + } return self.parse_class_accessor_property( span, name, computed, definite, modifiers, decorators, ); diff --git a/tasks/coverage/misc/fail/oxc-14014.ts b/tasks/coverage/misc/fail/oxc-14014.ts new file mode 100644 index 0000000000000..7d182b45dd4d9 --- /dev/null +++ b/tasks/coverage/misc/fail/oxc-14014.ts @@ -0,0 +1,6 @@ +class Bar { + accessor 'constructor' +} +abstract class Baz { + accessor 'constructor' +} diff --git a/tasks/coverage/snapshots/parser_misc.snap b/tasks/coverage/snapshots/parser_misc.snap index 70dcd2a07d9a5..7146273a8066c 100644 --- a/tasks/coverage/snapshots/parser_misc.snap +++ b/tasks/coverage/snapshots/parser_misc.snap @@ -1,7 +1,7 @@ parser_misc Summary: AST Parsed : 49/49 (100.00%) Positive Passed: 49/49 (100.00%) -Negative Passed: 90/90 (100.00%) +Negative Passed: 91/91 (100.00%) × Cannot assign to 'arguments' in strict mode ╭─[misc/fail/arguments-eval.ts:1:10] @@ -2851,6 +2851,22 @@ Negative Passed: 90/90 (100.00%) · ── ╰──── + × Classes may not have a field named 'constructor' + ╭─[misc/fail/oxc-14014.ts:2:12] + 1 │ class Bar { + 2 │ accessor 'constructor' + · ───────────── + 3 │ } + ╰──── + + × Classes may not have a field named 'constructor' + ╭─[misc/fail/oxc-14014.ts:5:12] + 4 │ abstract class Baz { + 5 │ accessor 'constructor' + · ───────────── + 6 │ } + ╰──── + × Unexpected token ╭─[misc/fail/oxc-169.js:2:1] 1 │ 1<(V=82<