fix(parser): report new.target and import.meta syntax errors in the parser#23003
Merged
Merged
Conversation
Merging this PR will not alter performance
Comparing Footnotes
|
Member
Author
Merge activity
|
…he parser (#23003) ## What Move the `MetaProperty` early-error checks from the semantic checker (`oxc_semantic`) into the parser: - **`new.target` outside a valid context** — e.g. at the top level, in a top-level arrow, or in a computed class-member key. - **`import.meta` outside a module** — i.e. in script / CommonJS code. Consumers that only run the parser (without `SemanticBuilder`) now get these diagnostics. ## How - `new.target` validity is tracked with a new inherited `Context::NewTarget` flag (widening `Context` from `u8` to `u16`). The flag is *added* by three constructs — a regular (non-arrow) function's parameters + body, a class static block, and a class field initializer — and *inherited* through arrow functions and class bodies. This naturally models the spec rule, including cases like `function g(){ class D { [new.target](){} } }` (valid, inherits `g`'s context). - `import.meta` reuses the existing `error_on_script` deferral, so in unambiguous source `visit_import_meta` marks the file a module and the deferred error is discarded. - `check_meta_property` and its now-unused diagnostics are removed from `oxc_semantic`. ## Spec correctness Verified all cases against V8 (Node v24). One behavior change vs. the old semantic checker: a computed class **field** key such as `class C { [new.target] = 1 }` at the top level is now correctly a **SyntaxError**, matching V8 — the old checker accepted it due to a coarse `PropertyDefinition` AST-ancestor match. | Source | V8 | this PR | | --- | --- | --- | | `new.target;` | SyntaxError | error | | `function f(){ new.target; }` | ok | ok | | `() => new.target;` | SyntaxError | error | | `class C { x = new.target; }` | ok | ok | | `class C { static { new.target; } }` | ok | ok | | `class C { [new.target] = 1; }` | SyntaxError | error | | `class C { [new.target](){} }` | SyntaxError | error | | `function g(){ class D { [new.target](){} } }` | ok | ok | | `import.meta` in script | SyntaxError | error | | `import.meta` in module | ok | ok | Parser & semantic conformance remain 100% positive / 100% negative on test262; all unit tests pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
f1f9a4d to
1295882
Compare
Boshen
added a commit
that referenced
this pull request
Jun 8, 2026
### 💥 BREAKING CHANGES - ee4dc73 ast: [**BREAKING**] Add `#[non_exhaustive]` to AST nodes (#23046) (overlookmotel) - 4c35362 ast: [**BREAKING**] Add `AstBuilder::template_element_escape_raw` and `template_element_escape_raw_with_lone_surrogates` methods (#23047) (overlookmotel) ### 🚀 Features - b846ab2 react_compiler: Integrate the Rust port of the React Compiler (#22942) (Boshen) - 5b8dd68 parser: Report TS1255 for invalid class definite assertions (#22917) (camc314) - 85efabf semantic: Make building the class table optional, off by default (#22862) (Boshen) ### 🐛 Bug Fixes - 556acdc codegen: Parenthesize TS-cast assignment targets (#23112) (Boshen) - 37169ff codegen: Don't emit space between postfix `--` and `>` when minifying (#23036) (Boshen) - a4b1bf7 codegen: Drop redundant whitespace in minified TypeScript output (#23038) (Boshen) - cf53285 parser: Report reserved type-declaration names in the parser (#23035) (Boshen) - 4e44969 ast: Fix UB in `escape_template_element_raw` (#23052) (overlookmotel) - c543154 parser: Report comma operator in JSX expression in the parser (#23030) (Boshen) - 325c94f codegen: Tighten conditional-type and constructor-type whitespace when minifying (#23033) (Boshen) - 95dd3a2 parser: Report `import type` alias to a non-external reference in the parser (#23032) (Boshen) - 90180b8 codegen: Drop space after `:` in function return type when minifying (#23028) (Boshen) - 6da876e parser: Report `abstract` private class field in the parser (#23029) (Boshen) - 28467ce codegen: Don't emit space before a postfix update operand when minifying (#23027) (Boshen) - cb29926 codegen: Drop redundant space after `export default` when minifying (#23024) (Boshen) - 62965ae codegen: Drop redundant space after `else` when minifying (#23025) (Boshen) - 989230a parser: Report compound assignment to non-simple target in the parser (#23022) (Boshen) - 06f367c parser: Report `super.#field` private access in the parser (#23014) (Boshen) - 184edef codegen: Print space before `const`/`declare` enum modifier (#23013) (Boshen) - 4d722e0 parser: Report duplicate switch `default` clause in the parser (#23012) (Boshen) - 597ed85 codegen: Parenthesize `let`/`async` for-of head target (#23008) (Boshen) - 8b631bf codegen: Remove stray space before mapped type value colon (#23010) (Boshen) - c08407e codegen: Don't over-parenthesize `in` inside an arrow in a for-init (#23009) (Boshen) - 600cd6f codegen: Parenthesize lower-precedence `TSInstantiationExpression` operand (#23007) (Boshen) - 187e1a5 codegen: Don't leak space after comment-only JSX expression container (#23006) (Boshen) - 294c473 codegen: Don't over-parenthesize `TSTypeAssertion` operand (#23004) (Boshen) - 786d96f codegen: Give `TSTypeAssertion` unary precedence (#23002) (Boshen) - 1295882 parser: Report `new.target` and `import.meta` syntax errors in the parser (#23003) (Boshen) - d727b6b codegen: Parenthesize `await` expression as base of `**` (#23001) (Boshen) - 67dfa08 codegen: Keep parentheses around `new` callees containing a call (#22997) (Boshen) - 17e7cf3 parser: Disallow unerasable `as`/`satisfies` assertions (#22986) (Boshen) - beb46d3 parser: Commit to module goal on decorated exports (#22941) (Boshen) - 49e63f7 isolated-declarations: Require annotations for satisfies initializers (#22898) (camc314) - 8c93601 isolated-declarations: Allow unknown enum initializer in non-const enum (#22900) (camc314) ### ⚡ Performance - 7d89909 parser: Peek instead of lookahead for yield disambiguation (#23071) (Boshen) - bf872f0 parser: Skip arrow lookahead for a parenthesized literal (#23070) (Boshen) - d19fc54 parser: Guard type-argument speculation behind an angle-token check (#23069) (Boshen) - 8eb5507 parser: Skip redundant member-rest re-scan on call entry (#23068) (Boshen) - 883dfc1 parser: Skip parse_call_expression_rest when no call follows (#23063) (Boshen) - b171153 parser: Peek before the await-using lookahead (#23059) (Boshen) - 56f21bd parser: Use peek_token for the TS `asserts` type predicate (#23058) (Boshen) - 68805ac parser: Use peek_token instead of checkpoint/rewind for single-token decisions (#23056) (Boshen) - 1f9d8eb ast: `AstBuilder::template_element_escape_raw` avoid allocation if no escape required (#23053) (overlookmotel) - 502b04d semantic: Move cold function redeclaration handling into `#[cold]` function (#22973) (overlookmotel) ### 📚 Documentation - 275d318 napi/minifier: Point `target` to oxc docs (#23102) (camc314) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Move the
MetaPropertyearly-error checks from the semantic checker (oxc_semantic) into the parser:new.targetoutside a valid context — e.g. at the top level, in a top-level arrow, or in a computed class-member key.import.metaoutside a module — i.e. in script / CommonJS code.Consumers that only run the parser (without
SemanticBuilder) now get these diagnostics.How
new.targetvalidity is tracked with a new inheritedContext::NewTargetflag (wideningContextfromu8tou16). The flag is added by three constructs — a regular (non-arrow) function's parameters + body, a class static block, and a class field initializer — and inherited through arrow functions and class bodies. This naturally models the spec rule, including cases likefunction g(){ class D { [new.target](){} } }(valid, inheritsg's context).import.metareuses the existingerror_on_scriptdeferral, so in unambiguous sourcevisit_import_metamarks the file a module and the deferred error is discarded.check_meta_propertyand its now-unused diagnostics are removed fromoxc_semantic.Spec correctness
Verified all cases against V8 (Node v24). One behavior change vs. the old semantic checker: a computed class field key such as
class C { [new.target] = 1 }at the top level is now correctly a SyntaxError, matching V8 — the old checker accepted it due to a coarsePropertyDefinitionAST-ancestor match.new.target;function f(){ new.target; }() => new.target;class C { x = new.target; }class C { static { new.target; } }class C { [new.target] = 1; }class C { [new.target](){} }function g(){ class D { [new.target](){} } }import.metain scriptimport.metain moduleParser & semantic conformance remain 100% positive / 100% negative on test262; all unit tests pass.
🤖 Generated with Claude Code