From daba0a7c2acf59441c81a89517f11811e41274de Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Wed, 7 May 2025 11:51:23 +0000 Subject: [PATCH] refactor(estree): remove regular expression types from ESTree AST (#10855) `Pattern` and other types in `oxc_regular_expression` are not part of ESTree AST. Don't implement `ESTree`, and don't generate raw transfer deserializers for these types. None of that code is actually used. This reduces the scope of ESTree serialization. --- .github/generated/ast_changes_watch_list.yml | 1 - Cargo.lock | 1 - crates/oxc_ast/Cargo.toml | 1 - crates/oxc_regular_expression/Cargo.toml | 9 - crates/oxc_regular_expression/src/ast.rs | 55 ++- .../src/generated/derive_estree.rs | 341 ------------------ crates/oxc_regular_expression/src/lib.rs | 2 - napi/parser/generated/deserialize/js.js | 335 ----------------- napi/parser/generated/deserialize/ts.js | 335 ----------------- npm/oxc-types/types.d.ts | 180 --------- 10 files changed, 27 insertions(+), 1233 deletions(-) delete mode 100644 crates/oxc_regular_expression/src/generated/derive_estree.rs diff --git a/.github/generated/ast_changes_watch_list.yml b/.github/generated/ast_changes_watch_list.yml index 6cbfc24cb52d7..b671c40bc73f7 100644 --- a/.github/generated/ast_changes_watch_list.yml +++ b/.github/generated/ast_changes_watch_list.yml @@ -31,7 +31,6 @@ src: - 'crates/oxc_regular_expression/src/generated/assert_layouts.rs' - 'crates/oxc_regular_expression/src/generated/derive_clone_in.rs' - 'crates/oxc_regular_expression/src/generated/derive_content_eq.rs' - - 'crates/oxc_regular_expression/src/generated/derive_estree.rs' - 'crates/oxc_regular_expression/src/generated/derive_get_address.rs' - 'crates/oxc_span/src/generated/assert_layouts.rs' - 'crates/oxc_span/src/generated/derive_dummy.rs' diff --git a/Cargo.lock b/Cargo.lock index 4e3f12223a0c5..29c1400efda1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2047,7 +2047,6 @@ dependencies = [ "oxc_allocator", "oxc_ast_macros", "oxc_diagnostics", - "oxc_estree", "oxc_span", "phf", "rustc-hash", diff --git a/crates/oxc_ast/Cargo.toml b/crates/oxc_ast/Cargo.toml index 3762e0420ea4f..ad9d07f5f99e9 100644 --- a/crates/oxc_ast/Cargo.toml +++ b/crates/oxc_ast/Cargo.toml @@ -34,7 +34,6 @@ cow-utils = { workspace = true } default = [] serialize = [ "oxc_allocator/serialize", - "oxc_regular_expression/serialize", "oxc_span/serialize", "oxc_syntax/serialize", "oxc_estree/serialize", diff --git a/crates/oxc_regular_expression/Cargo.toml b/crates/oxc_regular_expression/Cargo.toml index 309309a9bc51d..e5438c7a3ca06 100644 --- a/crates/oxc_regular_expression/Cargo.toml +++ b/crates/oxc_regular_expression/Cargo.toml @@ -23,17 +23,8 @@ doctest = false oxc_allocator = { workspace = true } oxc_ast_macros = { workspace = true } oxc_diagnostics = { workspace = true } -oxc_estree = { workspace = true } oxc_span = { workspace = true } phf = { workspace = true, features = ["macros"] } rustc-hash = { workspace = true } unicode-id-start = { workspace = true } - -[features] -default = [] -serialize = [ - "oxc_allocator/serialize", - "oxc_span/serialize", - "oxc_estree/serialize", -] diff --git a/crates/oxc_regular_expression/src/ast.rs b/crates/oxc_regular_expression/src/ast.rs index 778ffb3fea30b..fb38e7e7e10a2 100644 --- a/crates/oxc_regular_expression/src/ast.rs +++ b/crates/oxc_regular_expression/src/ast.rs @@ -1,12 +1,11 @@ use oxc_allocator::{Box, CloneIn, GetAddress, Vec}; use oxc_ast_macros::ast; -use oxc_estree::ESTree; use oxc_span::{Atom, ContentEq, Span}; /// The root of the `PatternParser` result. #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Pattern<'a> { pub span: Span, pub body: Disjunction<'a>, @@ -15,7 +14,7 @@ pub struct Pattern<'a> { /// Pile of [`Alternative`]s separated by `|`. #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Disjunction<'a> { pub span: Span, pub body: Vec<'a, Alternative<'a>>, @@ -24,7 +23,7 @@ pub struct Disjunction<'a> { /// Single unit of `|` separated alternatives. #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Alternative<'a> { pub span: Span, pub body: Vec<'a, Term<'a>>, @@ -33,7 +32,7 @@ pub struct Alternative<'a> { /// Single unit of [`Alternative`], containing various kinds. #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub enum Term<'a> { // Assertion, QuantifiableAssertion BoundaryAssertion(Box<'a, BoundaryAssertion>) = 0, @@ -56,7 +55,7 @@ pub enum Term<'a> { /// e.g. `^`, `$`, `\b`, `\B` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct BoundaryAssertion { pub span: Span, pub kind: BoundaryAssertionKind, @@ -64,7 +63,7 @@ pub struct BoundaryAssertion { #[ast] #[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub enum BoundaryAssertionKind { Start = 0, End = 1, @@ -76,7 +75,7 @@ pub enum BoundaryAssertionKind { /// e.g. `(?=...)`, `(?!...)`, `(?<=...)`, `(? { pub span: Span, pub kind: LookAroundAssertionKind, @@ -85,7 +84,7 @@ pub struct LookAroundAssertion<'a> { #[ast] #[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub enum LookAroundAssertionKind { Lookahead = 0, NegativeLookahead = 1, @@ -97,7 +96,7 @@ pub enum LookAroundAssertionKind { /// e.g. `a*`, `b+`, `c?`, `d{3}`, `e{4,}`, `f{5,6}` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Quantifier<'a> { pub span: Span, pub min: u64, @@ -110,7 +109,7 @@ pub struct Quantifier<'a> { /// Single character. #[ast] #[derive(Debug, Clone, Copy)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Character { /// This will be invalid position when `UnicodeMode` is disabled and `value` is a surrogate pair. pub span: Span, @@ -121,7 +120,7 @@ pub struct Character { #[ast] #[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub enum CharacterKind { ControlLetter = 0, HexadecimalEscape = 1, @@ -140,7 +139,7 @@ pub enum CharacterKind { /// e.g. `\d`, `\D`, `\s`, `\S`, `\w`, `\W` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct CharacterClassEscape { pub span: Span, pub kind: CharacterClassEscapeKind, @@ -148,7 +147,7 @@ pub struct CharacterClassEscape { #[ast] #[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub enum CharacterClassEscapeKind { D = 0, NegativeD = 1, @@ -162,7 +161,7 @@ pub enum CharacterClassEscapeKind { /// e.g. `\p{ASCII}`, `\P{ASCII}`, `\p{sc=Hiragana}`, `\P{sc=Hiragana}` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct UnicodePropertyEscape<'a> { pub span: Span, pub negative: bool, @@ -175,7 +174,7 @@ pub struct UnicodePropertyEscape<'a> { /// The `.`. #[ast] #[derive(Debug, Clone, Copy)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Dot { pub span: Span, } @@ -184,7 +183,7 @@ pub struct Dot { /// e.g. `[a-z]`, `[^A-Z]`, `[abc]`, `[a&&b&&c]`, `[[a-z]--x--y]` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct CharacterClass<'a> { pub span: Span, pub negative: bool, @@ -198,7 +197,7 @@ pub struct CharacterClass<'a> { #[ast] #[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub enum CharacterClassContentsKind { Union = 0, /// `UnicodeSetsMode` only. @@ -209,7 +208,7 @@ pub enum CharacterClassContentsKind { #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, GetAddress, ESTree)] +#[generate_derive(CloneIn, ContentEq, GetAddress)] pub enum CharacterClassContents<'a> { CharacterClassRange(Box<'a, CharacterClassRange>) = 0, CharacterClassEscape(Box<'a, CharacterClassEscape>) = 1, @@ -225,7 +224,7 @@ pub enum CharacterClassContents<'a> { /// e.g. `a-z`, `A-Z`, `0-9` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct CharacterClassRange { pub span: Span, pub min: Character, @@ -235,7 +234,7 @@ pub struct CharacterClassRange { /// `|` separated string of characters wrapped by `\q{}`. #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct ClassStringDisjunction<'a> { pub span: Span, /// `true` if body is empty or contains [`ClassString`] which `strings` is `true`. @@ -246,7 +245,7 @@ pub struct ClassStringDisjunction<'a> { /// Single unit of [`ClassStringDisjunction`]. #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct ClassString<'a> { pub span: Span, /// `true` if body is empty or contain 2 more characters. @@ -258,7 +257,7 @@ pub struct ClassString<'a> { /// e.g. `(...)`, `(?...)` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct CapturingGroup<'a> { pub span: Span, /// Group name to be referenced by [`NamedReference`]. @@ -270,7 +269,7 @@ pub struct CapturingGroup<'a> { /// e.g. `(?:...)` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct IgnoreGroup<'a> { pub span: Span, pub modifiers: Option, @@ -281,7 +280,7 @@ pub struct IgnoreGroup<'a> { /// e.g. `i` in `(?i:...)`, `-s` in `(?-s:...)` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Modifiers { pub span: Span, pub enabling: Option, @@ -291,7 +290,7 @@ pub struct Modifiers { /// Each part of modifier in [`Modifiers`]. #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct Modifier { pub ignore_case: bool, pub multiline: bool, @@ -302,7 +301,7 @@ pub struct Modifier { /// e.g. `\1`, `\2`, `\3` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct IndexedReference { pub span: Span, pub index: u32, @@ -312,7 +311,7 @@ pub struct IndexedReference { /// e.g. `\k` #[ast] #[derive(Debug)] -#[generate_derive(CloneIn, ContentEq, ESTree)] +#[generate_derive(CloneIn, ContentEq)] pub struct NamedReference<'a> { pub span: Span, pub name: Atom<'a>, diff --git a/crates/oxc_regular_expression/src/generated/derive_estree.rs b/crates/oxc_regular_expression/src/generated/derive_estree.rs deleted file mode 100644 index b94e13dd268b6..0000000000000 --- a/crates/oxc_regular_expression/src/generated/derive_estree.rs +++ /dev/null @@ -1,341 +0,0 @@ -// Auto-generated code, DO NOT EDIT DIRECTLY! -// To edit this generated file you have to edit `tasks/ast_tools/src/derives/estree.rs`. - -#![allow(unused_imports, clippy::match_same_arms, clippy::semicolon_if_nothing_returned)] - -use oxc_estree::{ - ESTree, FlatStructSerializer, JsonSafeString, Serializer, StructSerializer, - ser::{AppendTo, AppendToConcat}, -}; - -use crate::ast::*; - -impl ESTree for Pattern<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Pattern")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for Disjunction<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Disjunction")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for Alternative<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Alternative")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for Term<'_> { - fn serialize(&self, serializer: S) { - match self { - Self::BoundaryAssertion(it) => it.serialize(serializer), - Self::LookAroundAssertion(it) => it.serialize(serializer), - Self::Quantifier(it) => it.serialize(serializer), - Self::Character(it) => it.serialize(serializer), - Self::Dot(it) => it.serialize(serializer), - Self::CharacterClassEscape(it) => it.serialize(serializer), - Self::UnicodePropertyEscape(it) => it.serialize(serializer), - Self::CharacterClass(it) => it.serialize(serializer), - Self::CapturingGroup(it) => it.serialize(serializer), - Self::IgnoreGroup(it) => it.serialize(serializer), - Self::IndexedReference(it) => it.serialize(serializer), - Self::NamedReference(it) => it.serialize(serializer), - } - } -} - -impl ESTree for BoundaryAssertion { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("BoundaryAssertion")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("kind", &self.kind); - state.end(); - } -} - -impl ESTree for BoundaryAssertionKind { - fn serialize(&self, serializer: S) { - match self { - Self::Start => JsonSafeString("start").serialize(serializer), - Self::End => JsonSafeString("end").serialize(serializer), - Self::Boundary => JsonSafeString("boundary").serialize(serializer), - Self::NegativeBoundary => JsonSafeString("negativeBoundary").serialize(serializer), - } - } -} - -impl ESTree for LookAroundAssertion<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("LookAroundAssertion")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("kind", &self.kind); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for LookAroundAssertionKind { - fn serialize(&self, serializer: S) { - match self { - Self::Lookahead => JsonSafeString("lookahead").serialize(serializer), - Self::NegativeLookahead => JsonSafeString("negativeLookahead").serialize(serializer), - Self::Lookbehind => JsonSafeString("lookbehind").serialize(serializer), - Self::NegativeLookbehind => JsonSafeString("negativeLookbehind").serialize(serializer), - } - } -} - -impl ESTree for Quantifier<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Quantifier")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("min", &self.min); - state.serialize_field("max", &self.max); - state.serialize_field("greedy", &self.greedy); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for Character { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Character")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("kind", &self.kind); - state.serialize_field("value", &self.value); - state.end(); - } -} - -impl ESTree for CharacterKind { - fn serialize(&self, serializer: S) { - match self { - Self::ControlLetter => JsonSafeString("controlLetter").serialize(serializer), - Self::HexadecimalEscape => JsonSafeString("hexadecimalEscape").serialize(serializer), - Self::Identifier => JsonSafeString("identifier").serialize(serializer), - Self::Null => JsonSafeString("null").serialize(serializer), - Self::Octal1 => JsonSafeString("octal1").serialize(serializer), - Self::Octal2 => JsonSafeString("octal2").serialize(serializer), - Self::Octal3 => JsonSafeString("octal3").serialize(serializer), - Self::SingleEscape => JsonSafeString("singleEscape").serialize(serializer), - Self::Symbol => JsonSafeString("symbol").serialize(serializer), - Self::UnicodeEscape => JsonSafeString("unicodeEscape").serialize(serializer), - } - } -} - -impl ESTree for CharacterClassEscape { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("CharacterClassEscape")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("kind", &self.kind); - state.end(); - } -} - -impl ESTree for CharacterClassEscapeKind { - fn serialize(&self, serializer: S) { - match self { - Self::D => JsonSafeString("d").serialize(serializer), - Self::NegativeD => JsonSafeString("negativeD").serialize(serializer), - Self::S => JsonSafeString("s").serialize(serializer), - Self::NegativeS => JsonSafeString("negativeS").serialize(serializer), - Self::W => JsonSafeString("w").serialize(serializer), - Self::NegativeW => JsonSafeString("negativeW").serialize(serializer), - } - } -} - -impl ESTree for UnicodePropertyEscape<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("UnicodePropertyEscape")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("negative", &self.negative); - state.serialize_field("strings", &self.strings); - state.serialize_field("name", &self.name); - state.serialize_field("value", &self.value); - state.end(); - } -} - -impl ESTree for Dot { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Dot")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.end(); - } -} - -impl ESTree for CharacterClass<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("CharacterClass")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("negative", &self.negative); - state.serialize_field("strings", &self.strings); - state.serialize_field("kind", &self.kind); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for CharacterClassContentsKind { - fn serialize(&self, serializer: S) { - match self { - Self::Union => JsonSafeString("union").serialize(serializer), - Self::Intersection => JsonSafeString("intersection").serialize(serializer), - Self::Subtraction => JsonSafeString("subtraction").serialize(serializer), - } - } -} - -impl ESTree for CharacterClassContents<'_> { - fn serialize(&self, serializer: S) { - match self { - Self::CharacterClassRange(it) => it.serialize(serializer), - Self::CharacterClassEscape(it) => it.serialize(serializer), - Self::UnicodePropertyEscape(it) => it.serialize(serializer), - Self::Character(it) => it.serialize(serializer), - Self::NestedCharacterClass(it) => it.serialize(serializer), - Self::ClassStringDisjunction(it) => it.serialize(serializer), - } - } -} - -impl ESTree for CharacterClassRange { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("CharacterClassRange")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("min", &self.min); - state.serialize_field("max", &self.max); - state.end(); - } -} - -impl ESTree for ClassStringDisjunction<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("ClassStringDisjunction")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("strings", &self.strings); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for ClassString<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("ClassString")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("strings", &self.strings); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for CapturingGroup<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("CapturingGroup")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("name", &self.name); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for IgnoreGroup<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("IgnoreGroup")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("modifiers", &self.modifiers); - state.serialize_field("body", &self.body); - state.end(); - } -} - -impl ESTree for Modifiers { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Modifiers")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("enabling", &self.enabling); - state.serialize_field("disabling", &self.disabling); - state.end(); - } -} - -impl ESTree for Modifier { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("Modifier")); - state.serialize_field("ignoreCase", &self.ignore_case); - state.serialize_field("multiline", &self.multiline); - state.serialize_field("sticky", &self.sticky); - state.end(); - } -} - -impl ESTree for IndexedReference { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("IndexedReference")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("index", &self.index); - state.end(); - } -} - -impl ESTree for NamedReference<'_> { - fn serialize(&self, serializer: S) { - let mut state = serializer.serialize_struct(); - state.serialize_field("type", &JsonSafeString("NamedReference")); - state.serialize_field("start", &self.span.start); - state.serialize_field("end", &self.span.end); - state.serialize_field("name", &self.name); - state.end(); - } -} diff --git a/crates/oxc_regular_expression/src/lib.rs b/crates/oxc_regular_expression/src/lib.rs index 61c1234b83d75..637305de443bb 100644 --- a/crates/oxc_regular_expression/src/lib.rs +++ b/crates/oxc_regular_expression/src/lib.rs @@ -11,8 +11,6 @@ mod generated { pub mod assert_layouts; mod derive_clone_in; mod derive_content_eq; - #[cfg(feature = "serialize")] - mod derive_estree; } pub mod ast; diff --git a/napi/parser/generated/deserialize/js.js b/napi/parser/generated/deserialize/js.js index 15c59b8305b57..a9c9d798a65fa 100644 --- a/napi/parser/generated/deserialize/js.js +++ b/napi/parser/generated/deserialize/js.js @@ -2117,202 +2117,6 @@ function deserializeSourceType(pos) { }; } -function deserializePattern(pos) { - return { - type: 'Pattern', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - body: deserializeDisjunction(pos + 8), - }; -} - -function deserializeDisjunction(pos) { - return { - type: 'Disjunction', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - body: deserializeVecAlternative(pos + 8), - }; -} - -function deserializeAlternative(pos) { - return { - type: 'Alternative', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - body: deserializeVecTerm(pos + 8), - }; -} - -function deserializeBoundaryAssertion(pos) { - return { - type: 'BoundaryAssertion', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeBoundaryAssertionKind(pos + 8), - }; -} - -function deserializeLookAroundAssertion(pos) { - return { - type: 'LookAroundAssertion', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeLookAroundAssertionKind(pos + 8), - body: deserializeDisjunction(pos + 16), - }; -} - -function deserializeQuantifier(pos) { - return { - type: 'Quantifier', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - min: deserializeU64(pos + 8), - max: deserializeOptionU64(pos + 16), - greedy: deserializeBool(pos + 32), - body: deserializeTerm(pos + 40), - }; -} - -function deserializeCharacter(pos) { - return { - type: 'Character', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeCharacterKind(pos + 8), - value: deserializeU32(pos + 12), - }; -} - -function deserializeCharacterClassEscape(pos) { - return { - type: 'CharacterClassEscape', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeCharacterClassEscapeKind(pos + 8), - }; -} - -function deserializeUnicodePropertyEscape(pos) { - return { - type: 'UnicodePropertyEscape', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - negative: deserializeBool(pos + 8), - strings: deserializeBool(pos + 9), - name: deserializeStr(pos + 16), - value: deserializeOptionStr(pos + 32), - }; -} - -function deserializeDot(pos) { - return { - type: 'Dot', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - }; -} - -function deserializeCharacterClass(pos) { - return { - type: 'CharacterClass', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - negative: deserializeBool(pos + 8), - strings: deserializeBool(pos + 9), - kind: deserializeCharacterClassContentsKind(pos + 10), - body: deserializeVecCharacterClassContents(pos + 16), - }; -} - -function deserializeCharacterClassRange(pos) { - return { - type: 'CharacterClassRange', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - min: deserializeCharacter(pos + 8), - max: deserializeCharacter(pos + 24), - }; -} - -function deserializeClassStringDisjunction(pos) { - return { - type: 'ClassStringDisjunction', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - strings: deserializeBool(pos + 8), - body: deserializeVecClassString(pos + 16), - }; -} - -function deserializeClassString(pos) { - return { - type: 'ClassString', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - strings: deserializeBool(pos + 8), - body: deserializeVecCharacter(pos + 16), - }; -} - -function deserializeCapturingGroup(pos) { - return { - type: 'CapturingGroup', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - name: deserializeOptionStr(pos + 8), - body: deserializeDisjunction(pos + 24), - }; -} - -function deserializeIgnoreGroup(pos) { - return { - type: 'IgnoreGroup', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - modifiers: deserializeOptionModifiers(pos + 8), - body: deserializeDisjunction(pos + 24), - }; -} - -function deserializeModifiers(pos) { - return { - type: 'Modifiers', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - enabling: deserializeOptionModifier(pos + 8), - disabling: deserializeOptionModifier(pos + 11), - }; -} - -function deserializeModifier(pos) { - return { - type: 'Modifier', - ignoreCase: deserializeBool(pos), - multiline: deserializeBool(pos + 1), - sticky: deserializeBool(pos + 2), - }; -} - -function deserializeIndexedReference(pos) { - return { - type: 'IndexedReference', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - index: deserializeU32(pos + 8), - }; -} - -function deserializeNamedReference(pos) { - return { - type: 'NamedReference', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - name: deserializeStr(pos + 8), - }; -} - function deserializeRawTransferData(pos) { return { program: deserializeProgram(pos), @@ -4195,145 +3999,6 @@ function deserializeModuleKind(pos) { } } -function deserializeTerm(pos) { - switch (uint8[pos]) { - case 0: - return deserializeBoxBoundaryAssertion(pos + 8); - case 1: - return deserializeBoxLookAroundAssertion(pos + 8); - case 2: - return deserializeBoxQuantifier(pos + 8); - case 3: - return deserializeBoxCharacter(pos + 8); - case 4: - return deserializeDot(pos + 8); - case 5: - return deserializeBoxCharacterClassEscape(pos + 8); - case 6: - return deserializeBoxUnicodePropertyEscape(pos + 8); - case 7: - return deserializeBoxCharacterClass(pos + 8); - case 8: - return deserializeBoxCapturingGroup(pos + 8); - case 9: - return deserializeBoxIgnoreGroup(pos + 8); - case 10: - return deserializeBoxIndexedReference(pos + 8); - case 11: - return deserializeBoxNamedReference(pos + 8); - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for Term`); - } -} - -function deserializeBoundaryAssertionKind(pos) { - switch (uint8[pos]) { - case 0: - return 'start'; - case 1: - return 'end'; - case 2: - return 'boundary'; - case 3: - return 'negativeBoundary'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for BoundaryAssertionKind`); - } -} - -function deserializeLookAroundAssertionKind(pos) { - switch (uint8[pos]) { - case 0: - return 'lookahead'; - case 1: - return 'negativeLookahead'; - case 2: - return 'lookbehind'; - case 3: - return 'negativeLookbehind'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for LookAroundAssertionKind`); - } -} - -function deserializeCharacterKind(pos) { - switch (uint8[pos]) { - case 0: - return 'controlLetter'; - case 1: - return 'hexadecimalEscape'; - case 2: - return 'identifier'; - case 3: - return 'null'; - case 4: - return 'octal1'; - case 5: - return 'octal2'; - case 6: - return 'octal3'; - case 7: - return 'singleEscape'; - case 8: - return 'symbol'; - case 9: - return 'unicodeEscape'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterKind`); - } -} - -function deserializeCharacterClassEscapeKind(pos) { - switch (uint8[pos]) { - case 0: - return 'd'; - case 1: - return 'negativeD'; - case 2: - return 's'; - case 3: - return 'negativeS'; - case 4: - return 'w'; - case 5: - return 'negativeW'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterClassEscapeKind`); - } -} - -function deserializeCharacterClassContentsKind(pos) { - switch (uint8[pos]) { - case 0: - return 'union'; - case 1: - return 'intersection'; - case 2: - return 'subtraction'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterClassContentsKind`); - } -} - -function deserializeCharacterClassContents(pos) { - switch (uint8[pos]) { - case 0: - return deserializeBoxCharacterClassRange(pos + 8); - case 1: - return deserializeBoxCharacterClassEscape(pos + 8); - case 2: - return deserializeBoxUnicodePropertyEscape(pos + 8); - case 3: - return deserializeBoxCharacter(pos + 8); - case 4: - return deserializeBoxCharacterClass(pos + 8); - case 5: - return deserializeBoxClassStringDisjunction(pos + 8); - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterClassContents`); - } -} - function deserializeErrorSeverity(pos) { switch (uint8[pos]) { case 0: diff --git a/napi/parser/generated/deserialize/ts.js b/napi/parser/generated/deserialize/ts.js index 43e1b3ece7912..7da60e6a01733 100644 --- a/napi/parser/generated/deserialize/ts.js +++ b/napi/parser/generated/deserialize/ts.js @@ -2269,202 +2269,6 @@ function deserializeSourceType(pos) { }; } -function deserializePattern(pos) { - return { - type: 'Pattern', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - body: deserializeDisjunction(pos + 8), - }; -} - -function deserializeDisjunction(pos) { - return { - type: 'Disjunction', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - body: deserializeVecAlternative(pos + 8), - }; -} - -function deserializeAlternative(pos) { - return { - type: 'Alternative', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - body: deserializeVecTerm(pos + 8), - }; -} - -function deserializeBoundaryAssertion(pos) { - return { - type: 'BoundaryAssertion', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeBoundaryAssertionKind(pos + 8), - }; -} - -function deserializeLookAroundAssertion(pos) { - return { - type: 'LookAroundAssertion', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeLookAroundAssertionKind(pos + 8), - body: deserializeDisjunction(pos + 16), - }; -} - -function deserializeQuantifier(pos) { - return { - type: 'Quantifier', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - min: deserializeU64(pos + 8), - max: deserializeOptionU64(pos + 16), - greedy: deserializeBool(pos + 32), - body: deserializeTerm(pos + 40), - }; -} - -function deserializeCharacter(pos) { - return { - type: 'Character', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeCharacterKind(pos + 8), - value: deserializeU32(pos + 12), - }; -} - -function deserializeCharacterClassEscape(pos) { - return { - type: 'CharacterClassEscape', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - kind: deserializeCharacterClassEscapeKind(pos + 8), - }; -} - -function deserializeUnicodePropertyEscape(pos) { - return { - type: 'UnicodePropertyEscape', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - negative: deserializeBool(pos + 8), - strings: deserializeBool(pos + 9), - name: deserializeStr(pos + 16), - value: deserializeOptionStr(pos + 32), - }; -} - -function deserializeDot(pos) { - return { - type: 'Dot', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - }; -} - -function deserializeCharacterClass(pos) { - return { - type: 'CharacterClass', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - negative: deserializeBool(pos + 8), - strings: deserializeBool(pos + 9), - kind: deserializeCharacterClassContentsKind(pos + 10), - body: deserializeVecCharacterClassContents(pos + 16), - }; -} - -function deserializeCharacterClassRange(pos) { - return { - type: 'CharacterClassRange', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - min: deserializeCharacter(pos + 8), - max: deserializeCharacter(pos + 24), - }; -} - -function deserializeClassStringDisjunction(pos) { - return { - type: 'ClassStringDisjunction', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - strings: deserializeBool(pos + 8), - body: deserializeVecClassString(pos + 16), - }; -} - -function deserializeClassString(pos) { - return { - type: 'ClassString', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - strings: deserializeBool(pos + 8), - body: deserializeVecCharacter(pos + 16), - }; -} - -function deserializeCapturingGroup(pos) { - return { - type: 'CapturingGroup', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - name: deserializeOptionStr(pos + 8), - body: deserializeDisjunction(pos + 24), - }; -} - -function deserializeIgnoreGroup(pos) { - return { - type: 'IgnoreGroup', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - modifiers: deserializeOptionModifiers(pos + 8), - body: deserializeDisjunction(pos + 24), - }; -} - -function deserializeModifiers(pos) { - return { - type: 'Modifiers', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - enabling: deserializeOptionModifier(pos + 8), - disabling: deserializeOptionModifier(pos + 11), - }; -} - -function deserializeModifier(pos) { - return { - type: 'Modifier', - ignoreCase: deserializeBool(pos), - multiline: deserializeBool(pos + 1), - sticky: deserializeBool(pos + 2), - }; -} - -function deserializeIndexedReference(pos) { - return { - type: 'IndexedReference', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - index: deserializeU32(pos + 8), - }; -} - -function deserializeNamedReference(pos) { - return { - type: 'NamedReference', - start: deserializeU32(pos), - end: deserializeU32(pos + 4), - name: deserializeStr(pos + 8), - }; -} - function deserializeRawTransferData(pos) { return { program: deserializeProgram(pos), @@ -4347,145 +4151,6 @@ function deserializeModuleKind(pos) { } } -function deserializeTerm(pos) { - switch (uint8[pos]) { - case 0: - return deserializeBoxBoundaryAssertion(pos + 8); - case 1: - return deserializeBoxLookAroundAssertion(pos + 8); - case 2: - return deserializeBoxQuantifier(pos + 8); - case 3: - return deserializeBoxCharacter(pos + 8); - case 4: - return deserializeDot(pos + 8); - case 5: - return deserializeBoxCharacterClassEscape(pos + 8); - case 6: - return deserializeBoxUnicodePropertyEscape(pos + 8); - case 7: - return deserializeBoxCharacterClass(pos + 8); - case 8: - return deserializeBoxCapturingGroup(pos + 8); - case 9: - return deserializeBoxIgnoreGroup(pos + 8); - case 10: - return deserializeBoxIndexedReference(pos + 8); - case 11: - return deserializeBoxNamedReference(pos + 8); - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for Term`); - } -} - -function deserializeBoundaryAssertionKind(pos) { - switch (uint8[pos]) { - case 0: - return 'start'; - case 1: - return 'end'; - case 2: - return 'boundary'; - case 3: - return 'negativeBoundary'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for BoundaryAssertionKind`); - } -} - -function deserializeLookAroundAssertionKind(pos) { - switch (uint8[pos]) { - case 0: - return 'lookahead'; - case 1: - return 'negativeLookahead'; - case 2: - return 'lookbehind'; - case 3: - return 'negativeLookbehind'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for LookAroundAssertionKind`); - } -} - -function deserializeCharacterKind(pos) { - switch (uint8[pos]) { - case 0: - return 'controlLetter'; - case 1: - return 'hexadecimalEscape'; - case 2: - return 'identifier'; - case 3: - return 'null'; - case 4: - return 'octal1'; - case 5: - return 'octal2'; - case 6: - return 'octal3'; - case 7: - return 'singleEscape'; - case 8: - return 'symbol'; - case 9: - return 'unicodeEscape'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterKind`); - } -} - -function deserializeCharacterClassEscapeKind(pos) { - switch (uint8[pos]) { - case 0: - return 'd'; - case 1: - return 'negativeD'; - case 2: - return 's'; - case 3: - return 'negativeS'; - case 4: - return 'w'; - case 5: - return 'negativeW'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterClassEscapeKind`); - } -} - -function deserializeCharacterClassContentsKind(pos) { - switch (uint8[pos]) { - case 0: - return 'union'; - case 1: - return 'intersection'; - case 2: - return 'subtraction'; - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterClassContentsKind`); - } -} - -function deserializeCharacterClassContents(pos) { - switch (uint8[pos]) { - case 0: - return deserializeBoxCharacterClassRange(pos + 8); - case 1: - return deserializeBoxCharacterClassEscape(pos + 8); - case 2: - return deserializeBoxUnicodePropertyEscape(pos + 8); - case 3: - return deserializeBoxCharacter(pos + 8); - case 4: - return deserializeBoxCharacterClass(pos + 8); - case 5: - return deserializeBoxClassStringDisjunction(pos + 8); - default: - throw new Error(`Unexpected discriminant ${uint8[pos]} for CharacterClassContents`); - } -} - function deserializeErrorSeverity(pos) { switch (uint8[pos]) { case 0: diff --git a/npm/oxc-types/types.d.ts b/npm/oxc-types/types.d.ts index dbd6985ae9001..72a77cee6c568 100644 --- a/npm/oxc-types/types.d.ts +++ b/npm/oxc-types/types.d.ts @@ -1520,166 +1520,6 @@ export interface Span { export type ModuleKind = 'script' | 'module'; -export interface Pattern extends Span { - type: 'Pattern'; - body: Disjunction; -} - -export interface Disjunction extends Span { - type: 'Disjunction'; - body: Array; -} - -export interface Alternative extends Span { - type: 'Alternative'; - body: Array; -} - -export type Term = - | BoundaryAssertion - | LookAroundAssertion - | Quantifier - | Character - | Dot - | CharacterClassEscape - | UnicodePropertyEscape - | CharacterClass - | CapturingGroup - | IgnoreGroup - | IndexedReference - | NamedReference; - -export interface BoundaryAssertion extends Span { - type: 'BoundaryAssertion'; - kind: BoundaryAssertionKind; -} - -export type BoundaryAssertionKind = 'start' | 'end' | 'boundary' | 'negativeBoundary'; - -export interface LookAroundAssertion extends Span { - type: 'LookAroundAssertion'; - kind: LookAroundAssertionKind; - body: Disjunction; -} - -export type LookAroundAssertionKind = 'lookahead' | 'negativeLookahead' | 'lookbehind' | 'negativeLookbehind'; - -export interface Quantifier extends Span { - type: 'Quantifier'; - min: number; - max: number | null; - greedy: boolean; - body: Term; -} - -export interface Character extends Span { - type: 'Character'; - kind: CharacterKind; - value: number; -} - -export type CharacterKind = - | 'controlLetter' - | 'hexadecimalEscape' - | 'identifier' - | 'null' - | 'octal1' - | 'octal2' - | 'octal3' - | 'singleEscape' - | 'symbol' - | 'unicodeEscape'; - -export interface CharacterClassEscape extends Span { - type: 'CharacterClassEscape'; - kind: CharacterClassEscapeKind; -} - -export type CharacterClassEscapeKind = 'd' | 'negativeD' | 's' | 'negativeS' | 'w' | 'negativeW'; - -export interface UnicodePropertyEscape extends Span { - type: 'UnicodePropertyEscape'; - negative: boolean; - strings: boolean; - name: string; - value: string | null; -} - -export interface Dot extends Span { - type: 'Dot'; -} - -export interface CharacterClass extends Span { - type: 'CharacterClass'; - negative: boolean; - strings: boolean; - kind: CharacterClassContentsKind; - body: Array; -} - -export type CharacterClassContentsKind = 'union' | 'intersection' | 'subtraction'; - -export type CharacterClassContents = - | CharacterClassRange - | CharacterClassEscape - | UnicodePropertyEscape - | Character - | CharacterClass - | ClassStringDisjunction; - -export interface CharacterClassRange extends Span { - type: 'CharacterClassRange'; - min: Character; - max: Character; -} - -export interface ClassStringDisjunction extends Span { - type: 'ClassStringDisjunction'; - strings: boolean; - body: Array; -} - -export interface ClassString extends Span { - type: 'ClassString'; - strings: boolean; - body: Array; -} - -export interface CapturingGroup extends Span { - type: 'CapturingGroup'; - name: string | null; - body: Disjunction; -} - -export interface IgnoreGroup extends Span { - type: 'IgnoreGroup'; - modifiers: Modifiers | null; - body: Disjunction; -} - -export interface Modifiers extends Span { - type: 'Modifiers'; - enabling: Modifier | null; - disabling: Modifier | null; -} - -export interface Modifier { - type: 'Modifier'; - ignoreCase: boolean; - multiline: boolean; - sticky: boolean; -} - -export interface IndexedReference extends Span { - type: 'IndexedReference'; - index: number; -} - -export interface NamedReference extends Span { - type: 'NamedReference'; - name: string; -} - export type Node = | Program | IdentifierName @@ -1861,24 +1701,4 @@ export type Node = | JSDocNullableType | JSDocNonNullableType | JSDocUnknownType - | Pattern - | Disjunction - | Alternative - | BoundaryAssertion - | LookAroundAssertion - | Quantifier - | Character - | CharacterClassEscape - | UnicodePropertyEscape - | Dot - | CharacterClass - | CharacterClassRange - | ClassStringDisjunction - | ClassString - | CapturingGroup - | IgnoreGroup - | Modifiers - | Modifier - | IndexedReference - | NamedReference | FormalParameterRest;