mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
feat(ast): derive GetAddress on all enum types (#7472)
Implement `GetAddress` on all AST enums where all variants are boxed. Part of #7339.
This commit is contained in:
parent
d7d073578d
commit
eb70219821
13 changed files with 921 additions and 84 deletions
2
.github/.generated_ast_watch_list.yml
vendored
2
.github/.generated_ast_watch_list.yml
vendored
|
|
@ -15,6 +15,8 @@ src:
|
||||||
- 'crates/oxc_ast/src/generated/derive_clone_in.rs'
|
- 'crates/oxc_ast/src/generated/derive_clone_in.rs'
|
||||||
- 'crates/oxc_regular_expression/src/generated/derive_clone_in.rs'
|
- 'crates/oxc_regular_expression/src/generated/derive_clone_in.rs'
|
||||||
- 'crates/oxc_syntax/src/generated/derive_clone_in.rs'
|
- 'crates/oxc_syntax/src/generated/derive_clone_in.rs'
|
||||||
|
- 'crates/oxc_ast/src/generated/derive_get_address.rs'
|
||||||
|
- 'crates/oxc_regular_expression/src/generated/derive_get_address.rs'
|
||||||
- 'crates/oxc_ast/src/generated/derive_get_span.rs'
|
- 'crates/oxc_ast/src/generated/derive_get_span.rs'
|
||||||
- 'crates/oxc_ast/src/generated/derive_get_span_mut.rs'
|
- 'crates/oxc_ast/src/generated/derive_get_span_mut.rs'
|
||||||
- 'crates/oxc_ast/src/generated/derive_content_eq.rs'
|
- 'crates/oxc_ast/src/generated/derive_content_eq.rs'
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
use oxc_allocator::{Box, CloneIn, Vec};
|
use oxc_allocator::{Box, CloneIn, GetAddress, Vec};
|
||||||
use oxc_ast_macros::ast;
|
use oxc_ast_macros::ast;
|
||||||
use oxc_estree::ESTree;
|
use oxc_estree::ESTree;
|
||||||
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, GetSpanMut, SourceType, Span};
|
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, GetSpanMut, SourceType, Span};
|
||||||
|
|
@ -53,7 +53,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum Expression<'a> {
|
pub enum Expression<'a> {
|
||||||
/// See [`BooleanLiteral`] for AST node details.
|
/// See [`BooleanLiteral`] for AST node details.
|
||||||
BooleanLiteral(Box<'a, BooleanLiteral>) = 0,
|
BooleanLiteral(Box<'a, BooleanLiteral>) = 0,
|
||||||
|
|
@ -346,7 +346,7 @@ pub struct ObjectExpression<'a> {
|
||||||
/// Represents a property in an object literal.
|
/// Represents a property in an object literal.
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ObjectPropertyKind<'a> {
|
pub enum ObjectPropertyKind<'a> {
|
||||||
/// `a: 1` in `const obj = { a: 1 };`
|
/// `a: 1` in `const obj = { a: 1 };`
|
||||||
ObjectProperty(Box<'a, ObjectProperty<'a>>) = 0,
|
ObjectProperty(Box<'a, ObjectProperty<'a>>) = 0,
|
||||||
|
|
@ -378,7 +378,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum PropertyKey<'a> {
|
pub enum PropertyKey<'a> {
|
||||||
/// `a` in `const obj = { a: 1 }; obj.a;`
|
/// `a` in `const obj = { a: 1 }; obj.a;`
|
||||||
StaticIdentifier(Box<'a, IdentifierName<'a>>) = 64,
|
StaticIdentifier(Box<'a, IdentifierName<'a>>) = 64,
|
||||||
|
|
@ -462,7 +462,7 @@ pub struct TemplateElementValue<'a> {
|
||||||
/// <https://tc39.es/ecma262/#prod-MemberExpression>
|
/// <https://tc39.es/ecma262/#prod-MemberExpression>
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum MemberExpression<'a> {
|
pub enum MemberExpression<'a> {
|
||||||
/// `ar[0]` in `const ar = [1, 2]; ar[0];`
|
/// `ar[0]` in `const ar = [1, 2]; ar[0];`
|
||||||
ComputedMemberExpression(Box<'a, ComputedMemberExpression<'a>>) = 48,
|
ComputedMemberExpression(Box<'a, ComputedMemberExpression<'a>>) = 48,
|
||||||
|
|
@ -605,7 +605,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum Argument<'a> {
|
pub enum Argument<'a> {
|
||||||
/// `...[1, 2]` in `const arr = [...[1, 2]];`
|
/// `...[1, 2]` in `const arr = [...[1, 2]];`
|
||||||
SpreadElement(Box<'a, SpreadElement<'a>>) = 64,
|
SpreadElement(Box<'a, SpreadElement<'a>>) = 64,
|
||||||
|
|
@ -713,7 +713,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum AssignmentTarget<'a> {
|
pub enum AssignmentTarget<'a> {
|
||||||
// `SimpleAssignmentTarget` variants added here by `inherit_variants!` macro
|
// `SimpleAssignmentTarget` variants added here by `inherit_variants!` macro
|
||||||
@inherit SimpleAssignmentTarget
|
@inherit SimpleAssignmentTarget
|
||||||
|
|
@ -730,7 +730,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum SimpleAssignmentTarget<'a> {
|
pub enum SimpleAssignmentTarget<'a> {
|
||||||
AssignmentTargetIdentifier(Box<'a, IdentifierReference<'a>>) = 0,
|
AssignmentTargetIdentifier(Box<'a, IdentifierReference<'a>>) = 0,
|
||||||
TSAsExpression(Box<'a, TSAsExpression<'a>>) = 1,
|
TSAsExpression(Box<'a, TSAsExpression<'a>>) = 1,
|
||||||
|
|
@ -783,7 +783,7 @@ pub use match_simple_assignment_target;
|
||||||
|
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum AssignmentTargetPattern<'a> {
|
pub enum AssignmentTargetPattern<'a> {
|
||||||
ArrayAssignmentTarget(Box<'a, ArrayAssignmentTarget<'a>>) = 8,
|
ArrayAssignmentTarget(Box<'a, ArrayAssignmentTarget<'a>>) = 8,
|
||||||
ObjectAssignmentTarget(Box<'a, ObjectAssignmentTarget<'a>>) = 9,
|
ObjectAssignmentTarget(Box<'a, ObjectAssignmentTarget<'a>>) = 9,
|
||||||
|
|
@ -847,7 +847,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum AssignmentTargetMaybeDefault<'a> {
|
pub enum AssignmentTargetMaybeDefault<'a> {
|
||||||
AssignmentTargetWithDefault(Box<'a, AssignmentTargetWithDefault<'a>>) = 16,
|
AssignmentTargetWithDefault(Box<'a, AssignmentTargetWithDefault<'a>>) = 16,
|
||||||
// `AssignmentTarget` variants added here by `inherit_variants!` macro
|
// `AssignmentTarget` variants added here by `inherit_variants!` macro
|
||||||
|
|
@ -866,7 +866,7 @@ pub struct AssignmentTargetWithDefault<'a> {
|
||||||
|
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum AssignmentTargetProperty<'a> {
|
pub enum AssignmentTargetProperty<'a> {
|
||||||
AssignmentTargetPropertyIdentifier(Box<'a, AssignmentTargetPropertyIdentifier<'a>>) = 0,
|
AssignmentTargetPropertyIdentifier(Box<'a, AssignmentTargetPropertyIdentifier<'a>>) = 0,
|
||||||
AssignmentTargetPropertyProperty(Box<'a, AssignmentTargetPropertyProperty<'a>>) = 1,
|
AssignmentTargetPropertyProperty(Box<'a, AssignmentTargetPropertyProperty<'a>>) = 1,
|
||||||
|
|
@ -947,7 +947,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ChainElement<'a> {
|
pub enum ChainElement<'a> {
|
||||||
CallExpression(Box<'a, CallExpression<'a>>) = 0,
|
CallExpression(Box<'a, CallExpression<'a>>) = 0,
|
||||||
/// `foo?.baz!` or `foo?.[bar]!`
|
/// `foo?.baz!` or `foo?.[bar]!`
|
||||||
|
|
@ -977,7 +977,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum Statement<'a> {
|
pub enum Statement<'a> {
|
||||||
// Statements
|
// Statements
|
||||||
BlockStatement(Box<'a, BlockStatement<'a>>) = 0,
|
BlockStatement(Box<'a, BlockStatement<'a>>) = 0,
|
||||||
|
|
@ -1048,7 +1048,7 @@ pub struct BlockStatement<'a> {
|
||||||
/// Declarations and the Variable Statement
|
/// Declarations and the Variable Statement
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum Declaration<'a> {
|
pub enum Declaration<'a> {
|
||||||
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 32,
|
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 32,
|
||||||
#[visit(args(flags = ScopeFlags::Function))]
|
#[visit(args(flags = ScopeFlags::Function))]
|
||||||
|
|
@ -1197,7 +1197,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ForStatementInit<'a> {
|
pub enum ForStatementInit<'a> {
|
||||||
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 64,
|
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 64,
|
||||||
// `Expression` variants added here by `inherit_variants!` macro
|
// `Expression` variants added here by `inherit_variants!` macro
|
||||||
|
|
@ -1228,7 +1228,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ForStatementLeft<'a> {
|
pub enum ForStatementLeft<'a> {
|
||||||
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 16,
|
VariableDeclaration(Box<'a, VariableDeclaration<'a>>) = 16,
|
||||||
// `AssignmentTarget` variants added here by `inherit_variants!` macro
|
// `AssignmentTarget` variants added here by `inherit_variants!` macro
|
||||||
|
|
@ -1451,7 +1451,7 @@ pub struct BindingPattern<'a> {
|
||||||
|
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum BindingPatternKind<'a> {
|
pub enum BindingPatternKind<'a> {
|
||||||
/// `const a = 1`
|
/// `const a = 1`
|
||||||
BindingIdentifier(Box<'a, BindingIdentifier<'a>>) = 0,
|
BindingIdentifier(Box<'a, BindingIdentifier<'a>>) = 0,
|
||||||
|
|
@ -1855,7 +1855,7 @@ pub struct ClassBody<'a> {
|
||||||
/// ```
|
/// ```
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ClassElement<'a> {
|
pub enum ClassElement<'a> {
|
||||||
StaticBlock(Box<'a, StaticBlock<'a>>) = 0,
|
StaticBlock(Box<'a, StaticBlock<'a>>) = 0,
|
||||||
/// Class Methods
|
/// Class Methods
|
||||||
|
|
@ -2086,7 +2086,7 @@ pub struct StaticBlock<'a> {
|
||||||
/// ```
|
/// ```
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ModuleDeclaration<'a> {
|
pub enum ModuleDeclaration<'a> {
|
||||||
/// `import hello from './world.js';`
|
/// `import hello from './world.js';`
|
||||||
/// `import * as t from './world.js';`
|
/// `import * as t from './world.js';`
|
||||||
|
|
@ -2208,7 +2208,7 @@ pub struct ImportDeclaration<'a> {
|
||||||
|
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ImportDeclarationSpecifier<'a> {
|
pub enum ImportDeclarationSpecifier<'a> {
|
||||||
/// import {imported} from "source"
|
/// import {imported} from "source"
|
||||||
/// import {imported as local} from "source"
|
/// import {imported as local} from "source"
|
||||||
|
|
@ -2398,7 +2398,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum ExportDefaultDeclarationKind<'a> {
|
pub enum ExportDefaultDeclarationKind<'a> {
|
||||||
#[visit(args(flags = ScopeFlags::Function))]
|
#[visit(args(flags = ScopeFlags::Function))]
|
||||||
FunctionDeclaration(Box<'a, Function<'a>>) = 64,
|
FunctionDeclaration(Box<'a, Function<'a>>) = 64,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
// They are purely markers for codegen used in `tasks/ast_tools` and `crates/oxc_traverse/scripts`. See docs in those crates.
|
// They are purely markers for codegen used in `tasks/ast_tools` and `crates/oxc_traverse/scripts`. See docs in those crates.
|
||||||
// Read [`macro@oxc_ast_macros::ast`] for more information.
|
// Read [`macro@oxc_ast_macros::ast`] for more information.
|
||||||
|
|
||||||
use oxc_allocator::{Box, CloneIn, Vec};
|
use oxc_allocator::{Box, CloneIn, GetAddress, Vec};
|
||||||
use oxc_ast_macros::ast;
|
use oxc_ast_macros::ast;
|
||||||
use oxc_estree::ESTree;
|
use oxc_estree::ESTree;
|
||||||
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, GetSpanMut, Span};
|
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, GetSpanMut, Span};
|
||||||
|
|
@ -146,7 +146,7 @@ pub struct JSXClosingFragment {
|
||||||
/// JSX Element Name
|
/// JSX Element Name
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash)]
|
||||||
pub enum JSXElementName<'a> {
|
pub enum JSXElementName<'a> {
|
||||||
/// `<div />`
|
/// `<div />`
|
||||||
Identifier(Box<'a, JSXIdentifier<'a>>) = 0,
|
Identifier(Box<'a, JSXIdentifier<'a>>) = 0,
|
||||||
|
|
@ -224,7 +224,7 @@ pub struct JSXMemberExpression<'a> {
|
||||||
/// ```
|
/// ```
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash)]
|
||||||
pub enum JSXMemberExpressionObject<'a> {
|
pub enum JSXMemberExpressionObject<'a> {
|
||||||
/// `<Apple.Orange />`
|
/// `<Apple.Orange />`
|
||||||
IdentifierReference(Box<'a, IdentifierReference<'a>>) = 0,
|
IdentifierReference(Box<'a, IdentifierReference<'a>>) = 0,
|
||||||
|
|
@ -303,7 +303,7 @@ pub struct JSXEmptyExpression {
|
||||||
/// ```
|
/// ```
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum JSXAttributeItem<'a> {
|
pub enum JSXAttributeItem<'a> {
|
||||||
/// A `key="value"` attribute
|
/// A `key="value"` attribute
|
||||||
Attribute(Box<'a, JSXAttribute<'a>>) = 0,
|
Attribute(Box<'a, JSXAttribute<'a>>) = 0,
|
||||||
|
|
@ -370,7 +370,7 @@ pub struct JSXSpreadAttribute<'a> {
|
||||||
/// ```
|
/// ```
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum JSXAttributeName<'a> {
|
pub enum JSXAttributeName<'a> {
|
||||||
/// An attribute name without a namespace prefix, e.g. `foo` in `foo="bar"`.
|
/// An attribute name without a namespace prefix, e.g. `foo` in `foo="bar"`.
|
||||||
Identifier(Box<'a, JSXIdentifier<'a>>) = 0,
|
Identifier(Box<'a, JSXIdentifier<'a>>) = 0,
|
||||||
|
|
@ -398,7 +398,7 @@ pub enum JSXAttributeName<'a> {
|
||||||
/// ```
|
/// ```
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum JSXAttributeValue<'a> {
|
pub enum JSXAttributeValue<'a> {
|
||||||
/// `<Component foo="bar" />`
|
/// `<Component foo="bar" />`
|
||||||
StringLiteral(Box<'a, StringLiteral<'a>>) = 0,
|
StringLiteral(Box<'a, StringLiteral<'a>>) = 0,
|
||||||
|
|
@ -432,7 +432,7 @@ pub struct JSXIdentifier<'a> {
|
||||||
/// Part of a [`JSXElement`].
|
/// Part of a [`JSXElement`].
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum JSXChild<'a> {
|
pub enum JSXChild<'a> {
|
||||||
/// `<Foo>Some Text</Foo>`
|
/// `<Foo>Some Text</Foo>`
|
||||||
Text(Box<'a, JSXText<'a>>) = 0,
|
Text(Box<'a, JSXText<'a>>) = 0,
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
use oxc_allocator::{Box, CloneIn, Vec};
|
use oxc_allocator::{Box, CloneIn, GetAddress, Vec};
|
||||||
use oxc_ast_macros::ast;
|
use oxc_ast_macros::ast;
|
||||||
use oxc_estree::ESTree;
|
use oxc_estree::ESTree;
|
||||||
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, GetSpanMut, Span};
|
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, GetSpanMut, Span};
|
||||||
|
|
@ -105,7 +105,7 @@ pub struct TSEnumMember<'a> {
|
||||||
/// TS Enum Member Name
|
/// TS Enum Member Name
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSEnumMemberName<'a> {
|
pub enum TSEnumMemberName<'a> {
|
||||||
Identifier(Box<'a, IdentifierName<'a>>) = 0,
|
Identifier(Box<'a, IdentifierName<'a>>) = 0,
|
||||||
String(Box<'a, StringLiteral<'a>>) = 1,
|
String(Box<'a, StringLiteral<'a>>) = 1,
|
||||||
|
|
@ -158,7 +158,7 @@ pub struct TSLiteralType<'a> {
|
||||||
/// A literal in a [`TSLiteralType`].
|
/// A literal in a [`TSLiteralType`].
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSLiteral<'a> {
|
pub enum TSLiteral<'a> {
|
||||||
BooleanLiteral(Box<'a, BooleanLiteral>) = 0,
|
BooleanLiteral(Box<'a, BooleanLiteral>) = 0,
|
||||||
NullLiteral(Box<'a, NullLiteral>) = 1,
|
NullLiteral(Box<'a, NullLiteral>) = 1,
|
||||||
|
|
@ -183,7 +183,7 @@ pub enum TSLiteral<'a> {
|
||||||
/// ```
|
/// ```
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSType<'a> {
|
pub enum TSType<'a> {
|
||||||
// Keyword
|
// Keyword
|
||||||
TSAnyKeyword(Box<'a, TSAnyKeyword>) = 0,
|
TSAnyKeyword(Box<'a, TSAnyKeyword>) = 0,
|
||||||
|
|
@ -512,7 +512,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSTupleElement<'a> {
|
pub enum TSTupleElement<'a> {
|
||||||
// Discriminants start at 64, so that `TSTupleElement::is_ts_type` is a single
|
// Discriminants start at 64, so that `TSTupleElement::is_ts_type` is a single
|
||||||
// bitwise AND operation on the discriminant (`discriminant & 63 != 0`).
|
// bitwise AND operation on the discriminant (`discriminant & 63 != 0`).
|
||||||
|
|
@ -732,7 +732,7 @@ pub struct TSTypeReference<'a> {
|
||||||
/// NamespaceName . IdentifierReference
|
/// NamespaceName . IdentifierReference
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSTypeName<'a> {
|
pub enum TSTypeName<'a> {
|
||||||
IdentifierReference(Box<'a, IdentifierReference<'a>>) = 0,
|
IdentifierReference(Box<'a, IdentifierReference<'a>>) = 0,
|
||||||
QualifiedName(Box<'a, TSQualifiedName<'a>>) = 1,
|
QualifiedName(Box<'a, TSQualifiedName<'a>>) = 1,
|
||||||
|
|
@ -943,7 +943,7 @@ pub struct TSPropertySignature<'a> {
|
||||||
|
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSSignature<'a> {
|
pub enum TSSignature<'a> {
|
||||||
TSIndexSignature(Box<'a, TSIndexSignature<'a>>) = 0,
|
TSIndexSignature(Box<'a, TSIndexSignature<'a>>) = 0,
|
||||||
TSPropertySignature(Box<'a, TSPropertySignature<'a>>) = 1,
|
TSPropertySignature(Box<'a, TSPropertySignature<'a>>) = 1,
|
||||||
|
|
@ -1206,7 +1206,7 @@ pub enum TSModuleDeclarationName<'a> {
|
||||||
|
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSModuleDeclarationBody<'a> {
|
pub enum TSModuleDeclarationBody<'a> {
|
||||||
TSModuleDeclaration(Box<'a, TSModuleDeclaration<'a>>) = 0,
|
TSModuleDeclaration(Box<'a, TSModuleDeclaration<'a>>) = 0,
|
||||||
TSModuleBlock(Box<'a, TSModuleBlock<'a>>) = 1,
|
TSModuleBlock(Box<'a, TSModuleBlock<'a>>) = 1,
|
||||||
|
|
@ -1280,7 +1280,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSTypeQueryExprName<'a> {
|
pub enum TSTypeQueryExprName<'a> {
|
||||||
TSImportType(Box<'a, TSImportType<'a>>) = 2,
|
TSImportType(Box<'a, TSImportType<'a>>) = 2,
|
||||||
// `TSTypeName` variants added here by `inherit_variants!` macro
|
// `TSTypeName` variants added here by `inherit_variants!` macro
|
||||||
|
|
@ -1532,7 +1532,7 @@ inherit_variants! {
|
||||||
/// [`ast` module docs]: `super`
|
/// [`ast` module docs]: `super`
|
||||||
#[ast(visit)]
|
#[ast(visit)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, GetSpan, GetSpanMut, GetAddress, ContentEq, ContentHash, ESTree)]
|
||||||
pub enum TSModuleReference<'a> {
|
pub enum TSModuleReference<'a> {
|
||||||
ExternalModuleReference(Box<'a, TSExternalModuleReference<'a>>) = 2,
|
ExternalModuleReference(Box<'a, TSExternalModuleReference<'a>>) = 2,
|
||||||
// `TSTypeName` variants added here by `inherit_variants!` macro
|
// `TSTypeName` variants added here by `inherit_variants!` macro
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
use std::{borrow::Cow, fmt};
|
use std::{borrow::Cow, fmt};
|
||||||
|
|
||||||
use oxc_allocator::{Address, Box, FromIn, GetAddress, Vec};
|
use oxc_allocator::{Box, FromIn, Vec};
|
||||||
use oxc_span::{Atom, GetSpan, Span};
|
use oxc_span::{Atom, GetSpan, Span};
|
||||||
use oxc_syntax::{operator::UnaryOperator, scope::ScopeFlags, symbol::SymbolId};
|
use oxc_syntax::{operator::UnaryOperator, scope::ScopeFlags, symbol::SymbolId};
|
||||||
|
|
||||||
|
|
@ -737,47 +737,6 @@ impl<'a> FromIn<'a, Expression<'a>> for Statement<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> GetAddress for Statement<'a> {
|
|
||||||
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
|
||||||
#[inline]
|
|
||||||
fn address(&self) -> Address {
|
|
||||||
match self {
|
|
||||||
Statement::BlockStatement(s) => s.address(),
|
|
||||||
Statement::BreakStatement(s) => s.address(),
|
|
||||||
Statement::ContinueStatement(s) => s.address(),
|
|
||||||
Statement::DebuggerStatement(s) => s.address(),
|
|
||||||
Statement::DoWhileStatement(s) => s.address(),
|
|
||||||
Statement::EmptyStatement(s) => s.address(),
|
|
||||||
Statement::ExpressionStatement(s) => s.address(),
|
|
||||||
Statement::ForInStatement(s) => s.address(),
|
|
||||||
Statement::ForOfStatement(s) => s.address(),
|
|
||||||
Statement::ForStatement(s) => s.address(),
|
|
||||||
Statement::IfStatement(s) => s.address(),
|
|
||||||
Statement::LabeledStatement(s) => s.address(),
|
|
||||||
Statement::ReturnStatement(s) => s.address(),
|
|
||||||
Statement::SwitchStatement(s) => s.address(),
|
|
||||||
Statement::ThrowStatement(s) => s.address(),
|
|
||||||
Statement::TryStatement(s) => s.address(),
|
|
||||||
Statement::WhileStatement(s) => s.address(),
|
|
||||||
Statement::WithStatement(s) => s.address(),
|
|
||||||
Statement::VariableDeclaration(s) => s.address(),
|
|
||||||
Statement::FunctionDeclaration(s) => s.address(),
|
|
||||||
Statement::ClassDeclaration(s) => s.address(),
|
|
||||||
Statement::TSTypeAliasDeclaration(s) => s.address(),
|
|
||||||
Statement::TSInterfaceDeclaration(s) => s.address(),
|
|
||||||
Statement::TSEnumDeclaration(s) => s.address(),
|
|
||||||
Statement::TSModuleDeclaration(s) => s.address(),
|
|
||||||
Statement::TSImportEqualsDeclaration(s) => s.address(),
|
|
||||||
Statement::ImportDeclaration(s) => s.address(),
|
|
||||||
Statement::ExportAllDeclaration(s) => s.address(),
|
|
||||||
Statement::ExportDefaultDeclaration(s) => s.address(),
|
|
||||||
Statement::ExportNamedDeclaration(s) => s.address(),
|
|
||||||
Statement::TSExportAssignment(s) => s.address(),
|
|
||||||
Statement::TSNamespaceExportDeclaration(s) => s.address(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Directive<'a> {
|
impl<'a> Directive<'a> {
|
||||||
/// A Use Strict Directive is an ExpressionStatement in a Directive Prologue whose StringLiteral is either of the exact code point sequences "use strict" or 'use strict'.
|
/// A Use Strict Directive is an ExpressionStatement in a Directive Prologue whose StringLiteral is either of the exact code point sequences "use strict" or 'use strict'.
|
||||||
/// A Use Strict Directive may not contain an EscapeSequence or LineContinuation.
|
/// A Use Strict Directive may not contain an EscapeSequence or LineContinuation.
|
||||||
|
|
|
||||||
784
crates/oxc_ast/src/generated/derive_get_address.rs
Normal file
784
crates/oxc_ast/src/generated/derive_get_address.rs
Normal file
|
|
@ -0,0 +1,784 @@
|
||||||
|
// Auto-generated code, DO NOT EDIT DIRECTLY!
|
||||||
|
// To edit this generated file you have to edit `tasks/ast_tools/src/derives/get_address.rs`
|
||||||
|
|
||||||
|
#![allow(clippy::match_same_arms)]
|
||||||
|
|
||||||
|
use oxc_allocator::{Address, GetAddress};
|
||||||
|
|
||||||
|
use crate::ast::js::*;
|
||||||
|
|
||||||
|
use crate::ast::jsx::*;
|
||||||
|
|
||||||
|
use crate::ast::ts::*;
|
||||||
|
|
||||||
|
impl<'a> GetAddress for Expression<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::BooleanLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NullLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NumericLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::BigIntLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::RegExpLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::StringLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TemplateLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::MetaProperty(it) => GetAddress::address(it),
|
||||||
|
Self::Super(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrowFunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AwaitExpression(it) => GetAddress::address(it),
|
||||||
|
Self::BinaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::CallExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ChainExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ClassExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ConditionalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::FunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ImportExpression(it) => GetAddress::address(it),
|
||||||
|
Self::LogicalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::NewExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ParenthesizedExpression(it) => GetAddress::address(it),
|
||||||
|
Self::SequenceExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TaggedTemplateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ThisExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UnaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UpdateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::YieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateInExpression(it) => GetAddress::address(it),
|
||||||
|
Self::JSXElement(it) => GetAddress::address(it),
|
||||||
|
Self::JSXFragment(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ObjectPropertyKind<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::ObjectProperty(it) => GetAddress::address(it),
|
||||||
|
Self::SpreadProperty(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for PropertyKey<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::StaticIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::BooleanLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NullLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NumericLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::BigIntLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::RegExpLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::StringLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TemplateLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::MetaProperty(it) => GetAddress::address(it),
|
||||||
|
Self::Super(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrowFunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AwaitExpression(it) => GetAddress::address(it),
|
||||||
|
Self::BinaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::CallExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ChainExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ClassExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ConditionalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::FunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ImportExpression(it) => GetAddress::address(it),
|
||||||
|
Self::LogicalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::NewExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ParenthesizedExpression(it) => GetAddress::address(it),
|
||||||
|
Self::SequenceExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TaggedTemplateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ThisExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UnaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UpdateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::YieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateInExpression(it) => GetAddress::address(it),
|
||||||
|
Self::JSXElement(it) => GetAddress::address(it),
|
||||||
|
Self::JSXFragment(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for MemberExpression<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for Argument<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::SpreadElement(it) => GetAddress::address(it),
|
||||||
|
Self::BooleanLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NullLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NumericLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::BigIntLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::RegExpLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::StringLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TemplateLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::MetaProperty(it) => GetAddress::address(it),
|
||||||
|
Self::Super(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrowFunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AwaitExpression(it) => GetAddress::address(it),
|
||||||
|
Self::BinaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::CallExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ChainExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ClassExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ConditionalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::FunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ImportExpression(it) => GetAddress::address(it),
|
||||||
|
Self::LogicalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::NewExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ParenthesizedExpression(it) => GetAddress::address(it),
|
||||||
|
Self::SequenceExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TaggedTemplateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ThisExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UnaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UpdateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::YieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateInExpression(it) => GetAddress::address(it),
|
||||||
|
Self::JSXElement(it) => GetAddress::address(it),
|
||||||
|
Self::JSXFragment(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for AssignmentTarget<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::AssignmentTargetIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for SimpleAssignmentTarget<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::AssignmentTargetIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for AssignmentTargetPattern<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::ArrayAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for AssignmentTargetMaybeDefault<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::AssignmentTargetWithDefault(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentTargetIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for AssignmentTargetProperty<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::AssignmentTargetPropertyIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentTargetPropertyProperty(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ChainElement<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::CallExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for Statement<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::BlockStatement(it) => GetAddress::address(it),
|
||||||
|
Self::BreakStatement(it) => GetAddress::address(it),
|
||||||
|
Self::ContinueStatement(it) => GetAddress::address(it),
|
||||||
|
Self::DebuggerStatement(it) => GetAddress::address(it),
|
||||||
|
Self::DoWhileStatement(it) => GetAddress::address(it),
|
||||||
|
Self::EmptyStatement(it) => GetAddress::address(it),
|
||||||
|
Self::ExpressionStatement(it) => GetAddress::address(it),
|
||||||
|
Self::ForInStatement(it) => GetAddress::address(it),
|
||||||
|
Self::ForOfStatement(it) => GetAddress::address(it),
|
||||||
|
Self::ForStatement(it) => GetAddress::address(it),
|
||||||
|
Self::IfStatement(it) => GetAddress::address(it),
|
||||||
|
Self::LabeledStatement(it) => GetAddress::address(it),
|
||||||
|
Self::ReturnStatement(it) => GetAddress::address(it),
|
||||||
|
Self::SwitchStatement(it) => GetAddress::address(it),
|
||||||
|
Self::ThrowStatement(it) => GetAddress::address(it),
|
||||||
|
Self::TryStatement(it) => GetAddress::address(it),
|
||||||
|
Self::WhileStatement(it) => GetAddress::address(it),
|
||||||
|
Self::WithStatement(it) => GetAddress::address(it),
|
||||||
|
Self::VariableDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::FunctionDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ClassDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAliasDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSInterfaceDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSEnumDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSModuleDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSImportEqualsDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ImportDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ExportAllDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ExportDefaultDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ExportNamedDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSExportAssignment(it) => GetAddress::address(it),
|
||||||
|
Self::TSNamespaceExportDeclaration(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for Declaration<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::VariableDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::FunctionDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ClassDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAliasDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSInterfaceDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSEnumDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSModuleDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSImportEqualsDeclaration(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ForStatementInit<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::VariableDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::BooleanLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NullLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NumericLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::BigIntLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::RegExpLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::StringLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TemplateLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::MetaProperty(it) => GetAddress::address(it),
|
||||||
|
Self::Super(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrowFunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AwaitExpression(it) => GetAddress::address(it),
|
||||||
|
Self::BinaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::CallExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ChainExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ClassExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ConditionalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::FunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ImportExpression(it) => GetAddress::address(it),
|
||||||
|
Self::LogicalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::NewExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ParenthesizedExpression(it) => GetAddress::address(it),
|
||||||
|
Self::SequenceExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TaggedTemplateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ThisExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UnaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UpdateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::YieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateInExpression(it) => GetAddress::address(it),
|
||||||
|
Self::JSXElement(it) => GetAddress::address(it),
|
||||||
|
Self::JSXFragment(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ForStatementLeft<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::VariableDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentTargetIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectAssignmentTarget(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for BindingPatternKind<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::BindingIdentifier(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectPattern(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayPattern(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentPattern(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ClassElement<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::StaticBlock(it) => GetAddress::address(it),
|
||||||
|
Self::MethodDefinition(it) => GetAddress::address(it),
|
||||||
|
Self::PropertyDefinition(it) => GetAddress::address(it),
|
||||||
|
Self::AccessorProperty(it) => GetAddress::address(it),
|
||||||
|
Self::TSIndexSignature(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ModuleDeclaration<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::ImportDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ExportAllDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ExportDefaultDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ExportNamedDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSExportAssignment(it) => GetAddress::address(it),
|
||||||
|
Self::TSNamespaceExportDeclaration(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ImportDeclarationSpecifier<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::ImportSpecifier(it) => GetAddress::address(it),
|
||||||
|
Self::ImportDefaultSpecifier(it) => GetAddress::address(it),
|
||||||
|
Self::ImportNamespaceSpecifier(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for ExportDefaultDeclarationKind<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::FunctionDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::ClassDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSInterfaceDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::BooleanLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NullLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NumericLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::BigIntLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::RegExpLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::StringLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TemplateLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::MetaProperty(it) => GetAddress::address(it),
|
||||||
|
Self::Super(it) => GetAddress::address(it),
|
||||||
|
Self::ArrayExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ArrowFunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AssignmentExpression(it) => GetAddress::address(it),
|
||||||
|
Self::AwaitExpression(it) => GetAddress::address(it),
|
||||||
|
Self::BinaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::CallExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ChainExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ClassExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ConditionalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::FunctionExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ImportExpression(it) => GetAddress::address(it),
|
||||||
|
Self::LogicalExpression(it) => GetAddress::address(it),
|
||||||
|
Self::NewExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ObjectExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ParenthesizedExpression(it) => GetAddress::address(it),
|
||||||
|
Self::SequenceExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TaggedTemplateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ThisExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UnaryExpression(it) => GetAddress::address(it),
|
||||||
|
Self::UpdateExpression(it) => GetAddress::address(it),
|
||||||
|
Self::YieldExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateInExpression(it) => GetAddress::address(it),
|
||||||
|
Self::JSXElement(it) => GetAddress::address(it),
|
||||||
|
Self::JSXFragment(it) => GetAddress::address(it),
|
||||||
|
Self::TSAsExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSSatisfiesExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeAssertion(it) => GetAddress::address(it),
|
||||||
|
Self::TSNonNullExpression(it) => GetAddress::address(it),
|
||||||
|
Self::TSInstantiationExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ComputedMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::StaticMemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::PrivateFieldExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSEnumMemberName<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::String(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSLiteral<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::BooleanLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NullLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::NumericLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::BigIntLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::RegExpLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::StringLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TemplateLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::UnaryExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSType<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::TSAnyKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSBigIntKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSBooleanKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSIntrinsicKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSNeverKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSNullKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSNumberKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSObjectKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSStringKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSSymbolKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSUndefinedKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSUnknownKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSVoidKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSArrayType(it) => GetAddress::address(it),
|
||||||
|
Self::TSConditionalType(it) => GetAddress::address(it),
|
||||||
|
Self::TSConstructorType(it) => GetAddress::address(it),
|
||||||
|
Self::TSFunctionType(it) => GetAddress::address(it),
|
||||||
|
Self::TSImportType(it) => GetAddress::address(it),
|
||||||
|
Self::TSIndexedAccessType(it) => GetAddress::address(it),
|
||||||
|
Self::TSInferType(it) => GetAddress::address(it),
|
||||||
|
Self::TSIntersectionType(it) => GetAddress::address(it),
|
||||||
|
Self::TSLiteralType(it) => GetAddress::address(it),
|
||||||
|
Self::TSMappedType(it) => GetAddress::address(it),
|
||||||
|
Self::TSNamedTupleMember(it) => GetAddress::address(it),
|
||||||
|
Self::TSQualifiedName(it) => GetAddress::address(it),
|
||||||
|
Self::TSTemplateLiteralType(it) => GetAddress::address(it),
|
||||||
|
Self::TSThisType(it) => GetAddress::address(it),
|
||||||
|
Self::TSTupleType(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeOperatorType(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypePredicate(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeQuery(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeReference(it) => GetAddress::address(it),
|
||||||
|
Self::TSUnionType(it) => GetAddress::address(it),
|
||||||
|
Self::TSParenthesizedType(it) => GetAddress::address(it),
|
||||||
|
Self::JSDocNullableType(it) => GetAddress::address(it),
|
||||||
|
Self::JSDocNonNullableType(it) => GetAddress::address(it),
|
||||||
|
Self::JSDocUnknownType(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSTupleElement<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::TSOptionalType(it) => GetAddress::address(it),
|
||||||
|
Self::TSRestType(it) => GetAddress::address(it),
|
||||||
|
Self::TSAnyKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSBigIntKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSBooleanKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSIntrinsicKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSNeverKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSNullKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSNumberKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSObjectKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSStringKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSSymbolKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSUndefinedKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSUnknownKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSVoidKeyword(it) => GetAddress::address(it),
|
||||||
|
Self::TSArrayType(it) => GetAddress::address(it),
|
||||||
|
Self::TSConditionalType(it) => GetAddress::address(it),
|
||||||
|
Self::TSConstructorType(it) => GetAddress::address(it),
|
||||||
|
Self::TSFunctionType(it) => GetAddress::address(it),
|
||||||
|
Self::TSImportType(it) => GetAddress::address(it),
|
||||||
|
Self::TSIndexedAccessType(it) => GetAddress::address(it),
|
||||||
|
Self::TSInferType(it) => GetAddress::address(it),
|
||||||
|
Self::TSIntersectionType(it) => GetAddress::address(it),
|
||||||
|
Self::TSLiteralType(it) => GetAddress::address(it),
|
||||||
|
Self::TSMappedType(it) => GetAddress::address(it),
|
||||||
|
Self::TSNamedTupleMember(it) => GetAddress::address(it),
|
||||||
|
Self::TSQualifiedName(it) => GetAddress::address(it),
|
||||||
|
Self::TSTemplateLiteralType(it) => GetAddress::address(it),
|
||||||
|
Self::TSThisType(it) => GetAddress::address(it),
|
||||||
|
Self::TSTupleType(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeOperatorType(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypePredicate(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeQuery(it) => GetAddress::address(it),
|
||||||
|
Self::TSTypeReference(it) => GetAddress::address(it),
|
||||||
|
Self::TSUnionType(it) => GetAddress::address(it),
|
||||||
|
Self::TSParenthesizedType(it) => GetAddress::address(it),
|
||||||
|
Self::JSDocNullableType(it) => GetAddress::address(it),
|
||||||
|
Self::JSDocNonNullableType(it) => GetAddress::address(it),
|
||||||
|
Self::JSDocUnknownType(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSTypeName<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::IdentifierReference(it) => GetAddress::address(it),
|
||||||
|
Self::QualifiedName(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSSignature<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::TSIndexSignature(it) => GetAddress::address(it),
|
||||||
|
Self::TSPropertySignature(it) => GetAddress::address(it),
|
||||||
|
Self::TSCallSignatureDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSConstructSignatureDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSMethodSignature(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSModuleDeclarationBody<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::TSModuleDeclaration(it) => GetAddress::address(it),
|
||||||
|
Self::TSModuleBlock(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSTypeQueryExprName<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::TSImportType(it) => GetAddress::address(it),
|
||||||
|
Self::IdentifierReference(it) => GetAddress::address(it),
|
||||||
|
Self::QualifiedName(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for TSModuleReference<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::ExternalModuleReference(it) => GetAddress::address(it),
|
||||||
|
Self::IdentifierReference(it) => GetAddress::address(it),
|
||||||
|
Self::QualifiedName(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for JSXElementName<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::IdentifierReference(it) => GetAddress::address(it),
|
||||||
|
Self::NamespacedName(it) => GetAddress::address(it),
|
||||||
|
Self::MemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ThisExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for JSXMemberExpressionObject<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::IdentifierReference(it) => GetAddress::address(it),
|
||||||
|
Self::MemberExpression(it) => GetAddress::address(it),
|
||||||
|
Self::ThisExpression(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for JSXAttributeItem<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::Attribute(it) => GetAddress::address(it),
|
||||||
|
Self::SpreadAttribute(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for JSXAttributeName<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::Identifier(it) => GetAddress::address(it),
|
||||||
|
Self::NamespacedName(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for JSXAttributeValue<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::StringLiteral(it) => GetAddress::address(it),
|
||||||
|
Self::ExpressionContainer(it) => GetAddress::address(it),
|
||||||
|
Self::Element(it) => GetAddress::address(it),
|
||||||
|
Self::Fragment(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> GetAddress for JSXChild<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::Text(it) => GetAddress::address(it),
|
||||||
|
Self::Element(it) => GetAddress::address(it),
|
||||||
|
Self::Fragment(it) => GetAddress::address(it),
|
||||||
|
Self::ExpressionContainer(it) => GetAddress::address(it),
|
||||||
|
Self::Spread(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -65,6 +65,7 @@ mod generated {
|
||||||
pub mod derive_content_hash;
|
pub mod derive_content_hash;
|
||||||
#[cfg(feature = "serialize")]
|
#[cfg(feature = "serialize")]
|
||||||
pub mod derive_estree;
|
pub mod derive_estree;
|
||||||
|
pub mod derive_get_address;
|
||||||
pub mod derive_get_span;
|
pub mod derive_get_span;
|
||||||
pub mod derive_get_span_mut;
|
pub mod derive_get_span_mut;
|
||||||
pub mod get_id;
|
pub mod get_id;
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,8 @@ fn abs_trait(
|
||||||
(quote!(::oxc_span::GetSpan), TokenStream::default())
|
(quote!(::oxc_span::GetSpan), TokenStream::default())
|
||||||
} else if ident == "GetSpanMut" {
|
} else if ident == "GetSpanMut" {
|
||||||
(quote!(::oxc_span::GetSpanMut), TokenStream::default())
|
(quote!(::oxc_span::GetSpanMut), TokenStream::default())
|
||||||
|
} else if ident == "GetAddress" {
|
||||||
|
(quote!(::oxc_allocator::GetAddress), TokenStream::default())
|
||||||
} else if ident == "ContentEq" {
|
} else if ident == "ContentEq" {
|
||||||
(quote!(::oxc_span::cmp::ContentEq), TokenStream::default())
|
(quote!(::oxc_span::cmp::ContentEq), TokenStream::default())
|
||||||
} else if ident == "ContentHash" {
|
} else if ident == "ContentHash" {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use oxc_allocator::{Box, CloneIn, Vec};
|
use oxc_allocator::{Box, CloneIn, GetAddress, Vec};
|
||||||
use oxc_ast_macros::ast;
|
use oxc_ast_macros::ast;
|
||||||
use oxc_estree::ESTree;
|
use oxc_estree::ESTree;
|
||||||
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, Span};
|
use oxc_span::{cmp::ContentEq, hash::ContentHash, Atom, GetSpan, Span};
|
||||||
|
|
@ -229,7 +229,7 @@ pub enum CharacterClassContentsKind {
|
||||||
|
|
||||||
#[ast]
|
#[ast]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[generate_derive(CloneIn, ContentEq, ContentHash, ESTree)]
|
#[generate_derive(CloneIn, ContentEq, ContentHash, GetAddress, ESTree)]
|
||||||
pub enum CharacterClassContents<'a> {
|
pub enum CharacterClassContents<'a> {
|
||||||
CharacterClassRange(Box<'a, CharacterClassRange>) = 0,
|
CharacterClassRange(Box<'a, CharacterClassRange>) = 0,
|
||||||
CharacterClassEscape(Box<'a, CharacterClassEscape>) = 1,
|
CharacterClassEscape(Box<'a, CharacterClassEscape>) = 1,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Auto-generated code, DO NOT EDIT DIRECTLY!
|
||||||
|
// To edit this generated file you have to edit `tasks/ast_tools/src/derives/get_address.rs`
|
||||||
|
|
||||||
|
#![allow(clippy::match_same_arms)]
|
||||||
|
|
||||||
|
use oxc_allocator::{Address, GetAddress};
|
||||||
|
|
||||||
|
use crate::ast::*;
|
||||||
|
|
||||||
|
impl<'a> GetAddress for CharacterClassContents<'a> {
|
||||||
|
// `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
Self::CharacterClassRange(it) => GetAddress::address(it),
|
||||||
|
Self::CharacterClassEscape(it) => GetAddress::address(it),
|
||||||
|
Self::UnicodePropertyEscape(it) => GetAddress::address(it),
|
||||||
|
Self::Character(it) => GetAddress::address(it),
|
||||||
|
Self::NestedCharacterClass(it) => GetAddress::address(it),
|
||||||
|
Self::ClassStringDisjunction(it) => GetAddress::address(it),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
63
tasks/ast_tools/src/derives/get_address.rs
Normal file
63
tasks/ast_tools/src/derives/get_address.rs
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
use proc_macro2::TokenStream;
|
||||||
|
use quote::quote;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
schema::{EnumDef, Schema, ToType, TypeDef},
|
||||||
|
util::TypeWrapper,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::{define_derive, Derive};
|
||||||
|
|
||||||
|
pub struct DeriveGetAddress;
|
||||||
|
|
||||||
|
define_derive!(DeriveGetAddress);
|
||||||
|
|
||||||
|
impl Derive for DeriveGetAddress {
|
||||||
|
fn trait_name() -> &'static str {
|
||||||
|
"GetAddress"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn prelude() -> TokenStream {
|
||||||
|
quote! {
|
||||||
|
#![allow(clippy::match_same_arms)]
|
||||||
|
|
||||||
|
///@@line_break
|
||||||
|
use oxc_allocator::{Address, GetAddress};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn derive(&mut self, def: &TypeDef, _schema: &Schema) -> TokenStream {
|
||||||
|
if let TypeDef::Enum(enum_def) = def {
|
||||||
|
derive_enum(enum_def)
|
||||||
|
} else {
|
||||||
|
panic!("`GetAddress` can only be implemented with `#[generate_derive]` on enums");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn derive_enum(def: &EnumDef) -> TokenStream {
|
||||||
|
let target_type = def.to_type();
|
||||||
|
|
||||||
|
let matches = def.all_variants().map(|variant| {
|
||||||
|
assert!(
|
||||||
|
variant.fields.len() == 1
|
||||||
|
&& variant.fields[0].typ.analysis().wrapper == TypeWrapper::Box,
|
||||||
|
"`GetAddress` can only be derived on enums where all variants are boxed"
|
||||||
|
);
|
||||||
|
|
||||||
|
let ident = variant.ident();
|
||||||
|
quote!(Self::#ident(it) => GetAddress::address(it))
|
||||||
|
});
|
||||||
|
|
||||||
|
quote! {
|
||||||
|
impl<'a> GetAddress for #target_type {
|
||||||
|
///@ `#[inline]` because compiler should boil this down to a single assembly instruction
|
||||||
|
#[inline]
|
||||||
|
fn address(&self) -> Address {
|
||||||
|
match self {
|
||||||
|
#(#matches),*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,12 +15,14 @@ mod clone_in;
|
||||||
mod content_eq;
|
mod content_eq;
|
||||||
mod content_hash;
|
mod content_hash;
|
||||||
mod estree;
|
mod estree;
|
||||||
|
mod get_address;
|
||||||
mod get_span;
|
mod get_span;
|
||||||
|
|
||||||
pub use clone_in::DeriveCloneIn;
|
pub use clone_in::DeriveCloneIn;
|
||||||
pub use content_eq::DeriveContentEq;
|
pub use content_eq::DeriveContentEq;
|
||||||
pub use content_hash::DeriveContentHash;
|
pub use content_hash::DeriveContentHash;
|
||||||
pub use estree::DeriveESTree;
|
pub use estree::DeriveESTree;
|
||||||
|
pub use get_address::DeriveGetAddress;
|
||||||
pub use get_span::{DeriveGetSpan, DeriveGetSpanMut};
|
pub use get_span::{DeriveGetSpan, DeriveGetSpanMut};
|
||||||
|
|
||||||
pub trait Derive {
|
pub trait Derive {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ mod schema;
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
use derives::{
|
use derives::{
|
||||||
DeriveCloneIn, DeriveContentEq, DeriveContentHash, DeriveESTree, DeriveGetSpan,
|
DeriveCloneIn, DeriveContentEq, DeriveContentHash, DeriveESTree, DeriveGetAddress,
|
||||||
DeriveGetSpanMut,
|
DeriveGetSpan, DeriveGetSpanMut,
|
||||||
};
|
};
|
||||||
use generators::{
|
use generators::{
|
||||||
AssertLayouts, AstBuilderGenerator, AstKindGenerator, Generator, GetIdGenerator,
|
AssertLayouts, AstBuilderGenerator, AstKindGenerator, Generator, GetIdGenerator,
|
||||||
|
|
@ -76,6 +76,7 @@ fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
|
||||||
.pass(Linker)
|
.pass(Linker)
|
||||||
.pass(CalcLayout)
|
.pass(CalcLayout)
|
||||||
.generate(DeriveCloneIn)
|
.generate(DeriveCloneIn)
|
||||||
|
.generate(DeriveGetAddress)
|
||||||
.generate(DeriveGetSpan)
|
.generate(DeriveGetSpan)
|
||||||
.generate(DeriveGetSpanMut)
|
.generate(DeriveGetSpanMut)
|
||||||
.generate(DeriveContentEq)
|
.generate(DeriveContentEq)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue