Skip to main content

JavascriptParserPlugin

Trait JavascriptParserPlugin 

Source
pub trait JavascriptParserPlugin {
Show 54 methods // Provided methods fn implemented_hooks(&self) -> JavascriptParserPluginHooks { ... } fn pre_statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool> { ... } fn block_pre_statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool> { ... } fn top_level_await_expr( &self, _parser: &mut JavascriptParser<'_>, _expr: &AwaitExpr, ) { ... } fn top_level_for_of_await_stmt( &self, _parser: &mut JavascriptParser<'_>, _stmt: &ForOfStmt, ) { ... } fn can_rename( &self, _parser: &mut JavascriptParser<'_>, _str: &str, ) -> Option<bool> { ... } fn rename( &self, _parser: &mut JavascriptParser<'_>, _expr: &Expr, _str: &str, ) -> Option<bool> { ... } fn program( &self, _parser: &mut JavascriptParser<'_>, _ast: &Program, ) -> Option<bool> { ... } fn statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool> { ... } fn unused_statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool> { ... } fn module_declaration( &self, _parser: &mut JavascriptParser<'_>, _decl: &ModuleDecl, ) -> Option<bool> { ... } fn block_pre_module_declaration( &self, _parser: &mut JavascriptParser<'_>, _decl: &ModuleDecl, ) -> Option<bool> { ... } fn pre_declarator( &self, _parser: &mut JavascriptParser<'_>, _declarator: &VarDeclarator, _declaration: VariableDeclaration<'_>, ) -> Option<bool> { ... } fn evaluate<'a>( &self, _parser: &mut JavascriptParser<'_>, _expr: &'a Expr, ) -> Option<BasicEvaluatedExpression<'a>> { ... } fn evaluate_typeof<'a>( &self, _parser: &mut JavascriptParser<'_>, _expr: &'a UnaryExpr, _for_name: &str, ) -> Option<BasicEvaluatedExpression<'a>> { ... } fn evaluate_identifier( &self, _parser: &mut JavascriptParser<'_>, _for_name: &str, _start: u32, _end: u32, ) -> Option<BasicEvaluatedExpression<'static>> { ... } fn evaluate_call_expression<'a>( &self, _parser: &mut JavascriptParser<'_>, _name: &str, _expr: &'a CallExpr, ) -> Option<BasicEvaluatedExpression<'a>> { ... } fn evaluate_call_expression_member<'a>( &self, _parser: &mut JavascriptParser<'_>, _property: &str, _expr: &'a CallExpr, _param: BasicEvaluatedExpression<'a>, ) -> Option<BasicEvaluatedExpression<'a>> { ... } fn can_collect_destructuring_assignment_properties( &self, _parser: &mut JavascriptParser<'_>, _expr: &Expr, ) -> Option<bool> { ... } fn pattern( &self, _parser: &mut JavascriptParser<'_>, _ident: &Ident, _for_name: &str, ) -> Option<bool> { ... } fn call( &self, _parser: &mut JavascriptParser<'_>, _expr: &CallExpr, _for_name: &str, ) -> Option<bool> { ... } fn call_member_chain( &self, _parser: &mut JavascriptParser<'_>, _expr: &CallExpr, _for_name: &str, _members: &[Atom], _members_optionals: &[bool], _member_ranges: &[Span], ) -> Option<bool> { ... } fn member( &self, _parser: &mut JavascriptParser<'_>, _expr: &MemberExpr, _for_name: &str, ) -> Option<bool> { ... } fn member_chain( &self, _parser: &mut JavascriptParser<'_>, _expr: &MemberExpr, _for_name: &str, _members: &[Atom], _members_optionals: &[bool], _member_ranges: &[Span], ) -> Option<bool> { ... } fn unhandled_expression_member_chain( &self, _parser: &mut JavascriptParser<'_>, _root_info: &ExportedVariableInfo, _expr: &MemberExpr, ) -> Option<bool> { ... } fn member_chain_of_call_member_chain( &self, _parser: &mut JavascriptParser<'_>, _member_expr: &MemberExpr, _callee_members: &[Atom], _call_expr: &CallExpr, _members: &[Atom], _member_ranges: &[Span], _for_name: &str, ) -> Option<bool> { ... } fn call_member_chain_of_call_member_chain( &self, _parser: &mut JavascriptParser<'_>, _call_expr: &CallExpr, _callee_members: &[Atom], _inner_call_expr: &CallExpr, _members: &[Atom], _member_ranges: &[Span], _for_name: &str, ) -> Option<bool> { ... } fn typeof( &self, _parser: &mut JavascriptParser<'_>, _expr: &UnaryExpr, _for_name: &str, ) -> Option<bool> { ... } fn expression_logical_operator( &self, _parser: &mut JavascriptParser<'_>, _expr: &BinExpr, ) -> Option<bool> { ... } fn binary_expression( &self, _parser: &mut JavascriptParser<'_>, _expr: &BinExpr, ) -> Option<bool> { ... } fn statement_if( &self, _parser: &mut JavascriptParser<'_>, _expr: &IfStmt, ) -> Option<bool> { ... } fn class_extends_expression( &self, _parser: &mut JavascriptParser<'_>, _super_class: &Expr, _class_decl_or_expr: ClassDeclOrExpr<'_>, ) -> Option<bool> { ... } fn class_body_element( &self, _parser: &mut JavascriptParser<'_>, _element: &ClassMember, _class_decl_or_expr: ClassDeclOrExpr<'_>, ) -> Option<bool> { ... } fn class_body_value( &self, _parser: &mut JavascriptParser<'_>, _element: &ClassMember, _expr_span: Span, _class_decl_or_expr: ClassDeclOrExpr<'_>, ) -> Option<bool> { ... } fn declarator( &self, _parser: &mut JavascriptParser<'_>, _expr: &VarDeclarator, _stmt: VariableDeclaration<'_>, ) -> Option<bool> { ... } fn new_expression( &self, _parser: &mut JavascriptParser<'_>, _expr: &NewExpr, _for_name: &str, ) -> Option<bool> { ... } fn identifier( &self, _parser: &mut JavascriptParser<'_>, _ident: &Ident, _for_name: &str, ) -> Option<bool> { ... } fn this( &self, _parser: &mut JavascriptParser<'_>, _expr: &ThisExpr, _for_name: &str, ) -> Option<bool> { ... } fn assign( &self, _parser: &mut JavascriptParser<'_>, _expr: &AssignExpr, _for_name: &str, ) -> Option<bool> { ... } fn assign_member_chain( &self, _parser: &mut JavascriptParser<'_>, _expr: &AssignExpr, _members: &[Atom], _for_name: &str, ) -> Option<bool> { ... } fn import_call( &self, _parser: &mut JavascriptParser<'_>, _expr: &CallExpr, _import_then: Option<&CallExpr>, _members: Option<(&[Atom], bool)>, ) -> Option<bool> { ... } fn meta_property( &self, _parser: &mut JavascriptParser<'_>, _root_name: &Atom, _span: Span, ) -> Option<bool> { ... } fn import( &self, _parser: &mut JavascriptParser<'_>, _statement: &ImportDecl, _source: &str, ) -> Option<bool> { ... } fn import_specifier( &self, _parser: &mut JavascriptParser<'_>, _statement: &ImportDecl, _source: &Atom, _export_name: Option<&Atom>, _identifier_name: &Atom, ) -> Option<bool> { ... } fn export_import( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportImport<'_>, _source: &Atom, ) -> Option<bool> { ... } fn export( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportLocal<'_>, ) -> Option<bool> { ... } fn export_import_specifier( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportImport<'_>, _source: &Atom, _local_id: Option<&Atom>, _export_name: Option<&Atom>, _export_name_span: Option<Span>, ) -> Option<bool> { ... } fn export_specifier( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportLocal<'_>, _local_id: &Atom, _export_name: &Atom, _export_name_span: Span, ) -> Option<bool> { ... } fn export_expression( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportDefaultDeclaration<'_>, _expr: ExportDefaultExpression<'_>, ) -> Option<bool> { ... } fn optional_chaining( &self, _parser: &mut JavascriptParser<'_>, _expr: &OptChainExpr, ) -> Option<bool> { ... } fn expression_conditional_operation( &self, _parser: &mut JavascriptParser<'_>, _expr: &CondExpr, ) -> Option<bool> { ... } fn finish(&self, _parser: &mut JavascriptParser<'_>) -> Option<bool> { ... } fn is_pure( &self, _parser: &mut JavascriptParser<'_>, _expr: &Expr, ) -> Option<bool> { ... } fn import_meta_property_in_destructuring( &self, _parser: &mut JavascriptParser<'_>, _property: &DestructuringAssignmentProperty, ) -> Option<String> { ... }
}

Provided Methods§

Source

fn implemented_hooks(&self) -> JavascriptParserPluginHooks

Used by the parser drive to precompute which hook paths this plugin actually implements.

§Why this exists (performance)

JavaScriptParserPluginDrive needs to call many hook methods while walking the AST. Calling every hook on every plugin would be very expensive.

Instead, rspack precomputes a hook mask for each plugin at construction time:

  • Each plugin reports which hooks it actually implements via this method.
  • The drive groups plugins by hook up-front.
  • During parsing, the drive only iterates plugins that declared the current hook.

This cuts a large amount of useless dynamic dispatch at runtime.

§How to implement

Do NOT implement this method manually.

Use the proc-macro attribute #[rspack_plugin_javascript::implemented_javascript_parser_hooks] (or #[rspack_macros::implemented_javascript_parser_hooks] inside the workspace). The macro inspects the impl JavascriptParserPlugin for ... block and generates an efficient implemented_hooks implementation automatically.

Source

fn pre_statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool>

Return:

  • Some(true) signifies the termination of the current statement’s visit during the pre-walk phase.
  • Other return values imply that the walk operation ought to continue
Source

fn block_pre_statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool>

Source

fn top_level_await_expr( &self, _parser: &mut JavascriptParser<'_>, _expr: &AwaitExpr, )

The return value will have no effect.

Source

fn top_level_for_of_await_stmt( &self, _parser: &mut JavascriptParser<'_>, _stmt: &ForOfStmt, )

The return value will have no effect.

Source

fn can_rename( &self, _parser: &mut JavascriptParser<'_>, _str: &str, ) -> Option<bool>

Source

fn rename( &self, _parser: &mut JavascriptParser<'_>, _expr: &Expr, _str: &str, ) -> Option<bool>

Source

fn program( &self, _parser: &mut JavascriptParser<'_>, _ast: &Program, ) -> Option<bool>

Source

fn statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool>

Source

fn unused_statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool>

Called for statements after a terminating point (when only function declarations should still be processed). Plugins may eliminate or transform such unused statements.

Return:

  • Some(true) means the statement is fully handled and should be skipped
  • Other values mean the parser should still walk the statement
Source

fn module_declaration( &self, _parser: &mut JavascriptParser<'_>, _decl: &ModuleDecl, ) -> Option<bool>

Source

fn block_pre_module_declaration( &self, _parser: &mut JavascriptParser<'_>, _decl: &ModuleDecl, ) -> Option<bool>

Return: None means continue this ModuleDecl Others means skip this.

This is similar hooks.block_pre_statement in webpack

Source

fn pre_declarator( &self, _parser: &mut JavascriptParser<'_>, _declarator: &VarDeclarator, _declaration: VariableDeclaration<'_>, ) -> Option<bool>

Source

fn evaluate<'a>( &self, _parser: &mut JavascriptParser<'_>, _expr: &'a Expr, ) -> Option<BasicEvaluatedExpression<'a>>

Source

fn evaluate_typeof<'a>( &self, _parser: &mut JavascriptParser<'_>, _expr: &'a UnaryExpr, _for_name: &str, ) -> Option<BasicEvaluatedExpression<'a>>

Source

fn evaluate_identifier( &self, _parser: &mut JavascriptParser<'_>, _for_name: &str, _start: u32, _end: u32, ) -> Option<BasicEvaluatedExpression<'static>>

Source

fn evaluate_call_expression<'a>( &self, _parser: &mut JavascriptParser<'_>, _name: &str, _expr: &'a CallExpr, ) -> Option<BasicEvaluatedExpression<'a>>

Evaluate CallExpression when callee is an Identifier (e.g. String(), Number()). Mirrors webpack’s hooks.evaluateCallExpression.

Source

fn evaluate_call_expression_member<'a>( &self, _parser: &mut JavascriptParser<'_>, _property: &str, _expr: &'a CallExpr, _param: BasicEvaluatedExpression<'a>, ) -> Option<BasicEvaluatedExpression<'a>>

Source

fn can_collect_destructuring_assignment_properties( &self, _parser: &mut JavascriptParser<'_>, _expr: &Expr, ) -> Option<bool>

Source

fn pattern( &self, _parser: &mut JavascriptParser<'_>, _ident: &Ident, _for_name: &str, ) -> Option<bool>

Source

fn call( &self, _parser: &mut JavascriptParser<'_>, _expr: &CallExpr, _for_name: &str, ) -> Option<bool>

Source

fn call_member_chain( &self, _parser: &mut JavascriptParser<'_>, _expr: &CallExpr, _for_name: &str, _members: &[Atom], _members_optionals: &[bool], _member_ranges: &[Span], ) -> Option<bool>

Source

fn member( &self, _parser: &mut JavascriptParser<'_>, _expr: &MemberExpr, _for_name: &str, ) -> Option<bool>

Source

fn member_chain( &self, _parser: &mut JavascriptParser<'_>, _expr: &MemberExpr, _for_name: &str, _members: &[Atom], _members_optionals: &[bool], _member_ranges: &[Span], ) -> Option<bool>

Source

fn unhandled_expression_member_chain( &self, _parser: &mut JavascriptParser<'_>, _root_info: &ExportedVariableInfo, _expr: &MemberExpr, ) -> Option<bool>

Source

fn member_chain_of_call_member_chain( &self, _parser: &mut JavascriptParser<'_>, _member_expr: &MemberExpr, _callee_members: &[Atom], _call_expr: &CallExpr, _members: &[Atom], _member_ranges: &[Span], _for_name: &str, ) -> Option<bool>

Source

fn call_member_chain_of_call_member_chain( &self, _parser: &mut JavascriptParser<'_>, _call_expr: &CallExpr, _callee_members: &[Atom], _inner_call_expr: &CallExpr, _members: &[Atom], _member_ranges: &[Span], _for_name: &str, ) -> Option<bool>

Source

fn typeof( &self, _parser: &mut JavascriptParser<'_>, _expr: &UnaryExpr, _for_name: &str, ) -> Option<bool>

Source

fn expression_logical_operator( &self, _parser: &mut JavascriptParser<'_>, _expr: &BinExpr, ) -> Option<bool>

Return:

  • None means should walk left and right;
  • Some(true) means should walk right;
  • Some(false) means nothing need to do.
Source

fn binary_expression( &self, _parser: &mut JavascriptParser<'_>, _expr: &BinExpr, ) -> Option<bool>

Return:

  • None means should walk left and right;
Source

fn statement_if( &self, _parser: &mut JavascriptParser<'_>, _expr: &IfStmt, ) -> Option<bool>

Return:

  • None means need walk stmt.test, stmt.cons and stmt.alt;
  • Some(true) means only need walk stmt.cons;
  • Some(false) means only need walk stmt.alt;
Source

fn class_extends_expression( &self, _parser: &mut JavascriptParser<'_>, _super_class: &Expr, _class_decl_or_expr: ClassDeclOrExpr<'_>, ) -> Option<bool>

Source

fn class_body_element( &self, _parser: &mut JavascriptParser<'_>, _element: &ClassMember, _class_decl_or_expr: ClassDeclOrExpr<'_>, ) -> Option<bool>

Source

fn class_body_value( &self, _parser: &mut JavascriptParser<'_>, _element: &ClassMember, _expr_span: Span, _class_decl_or_expr: ClassDeclOrExpr<'_>, ) -> Option<bool>

Source

fn declarator( &self, _parser: &mut JavascriptParser<'_>, _expr: &VarDeclarator, _stmt: VariableDeclaration<'_>, ) -> Option<bool>

Source

fn new_expression( &self, _parser: &mut JavascriptParser<'_>, _expr: &NewExpr, _for_name: &str, ) -> Option<bool>

Source

fn identifier( &self, _parser: &mut JavascriptParser<'_>, _ident: &Ident, _for_name: &str, ) -> Option<bool>

Source

fn this( &self, _parser: &mut JavascriptParser<'_>, _expr: &ThisExpr, _for_name: &str, ) -> Option<bool>

Source

fn assign( &self, _parser: &mut JavascriptParser<'_>, _expr: &AssignExpr, _for_name: &str, ) -> Option<bool>

Source

fn assign_member_chain( &self, _parser: &mut JavascriptParser<'_>, _expr: &AssignExpr, _members: &[Atom], _for_name: &str, ) -> Option<bool>

Source

fn import_call( &self, _parser: &mut JavascriptParser<'_>, _expr: &CallExpr, _import_then: Option<&CallExpr>, _members: Option<(&[Atom], bool)>, ) -> Option<bool>

Source

fn meta_property( &self, _parser: &mut JavascriptParser<'_>, _root_name: &Atom, _span: Span, ) -> Option<bool>

Source

fn import( &self, _parser: &mut JavascriptParser<'_>, _statement: &ImportDecl, _source: &str, ) -> Option<bool>

Source

fn import_specifier( &self, _parser: &mut JavascriptParser<'_>, _statement: &ImportDecl, _source: &Atom, _export_name: Option<&Atom>, _identifier_name: &Atom, ) -> Option<bool>

Source

fn export_import( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportImport<'_>, _source: &Atom, ) -> Option<bool>

Source

fn export( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportLocal<'_>, ) -> Option<bool>

Source

fn export_import_specifier( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportImport<'_>, _source: &Atom, _local_id: Option<&Atom>, _export_name: Option<&Atom>, _export_name_span: Option<Span>, ) -> Option<bool>

Source

fn export_specifier( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportLocal<'_>, _local_id: &Atom, _export_name: &Atom, _export_name_span: Span, ) -> Option<bool>

Source

fn export_expression( &self, _parser: &mut JavascriptParser<'_>, _statement: ExportDefaultDeclaration<'_>, _expr: ExportDefaultExpression<'_>, ) -> Option<bool>

Source

fn optional_chaining( &self, _parser: &mut JavascriptParser<'_>, _expr: &OptChainExpr, ) -> Option<bool>

Source

fn expression_conditional_operation( &self, _parser: &mut JavascriptParser<'_>, _expr: &CondExpr, ) -> Option<bool>

Source

fn finish(&self, _parser: &mut JavascriptParser<'_>) -> Option<bool>

Source

fn is_pure( &self, _parser: &mut JavascriptParser<'_>, _expr: &Expr, ) -> Option<bool>

Source

fn import_meta_property_in_destructuring( &self, _parser: &mut JavascriptParser<'_>, _property: &DestructuringAssignmentProperty, ) -> Option<String>

This method is used to interop with other plugins. It will be called in ImportMetaPlugin when processing destructuring of import.meta

Implementors§