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§
Sourcefn implemented_hooks(&self) -> JavascriptParserPluginHooks
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.
Sourcefn pre_statement(
&self,
_parser: &mut JavascriptParser<'_>,
_stmt: Statement<'_>,
) -> Option<bool>
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
fn block_pre_statement( &self, _parser: &mut JavascriptParser<'_>, _stmt: Statement<'_>, ) -> Option<bool>
Sourcefn top_level_await_expr(
&self,
_parser: &mut JavascriptParser<'_>,
_expr: &AwaitExpr,
)
fn top_level_await_expr( &self, _parser: &mut JavascriptParser<'_>, _expr: &AwaitExpr, )
The return value will have no effect.
Sourcefn top_level_for_of_await_stmt(
&self,
_parser: &mut JavascriptParser<'_>,
_stmt: &ForOfStmt,
)
fn top_level_for_of_await_stmt( &self, _parser: &mut JavascriptParser<'_>, _stmt: &ForOfStmt, )
The return value will have no effect.
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>
Sourcefn unused_statement(
&self,
_parser: &mut JavascriptParser<'_>,
_stmt: Statement<'_>,
) -> Option<bool>
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
fn module_declaration( &self, _parser: &mut JavascriptParser<'_>, _decl: &ModuleDecl, ) -> Option<bool>
Sourcefn block_pre_module_declaration(
&self,
_parser: &mut JavascriptParser<'_>,
_decl: &ModuleDecl,
) -> Option<bool>
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
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>>
Sourcefn evaluate_call_expression<'a>(
&self,
_parser: &mut JavascriptParser<'_>,
_name: &str,
_expr: &'a CallExpr,
) -> Option<BasicEvaluatedExpression<'a>>
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.
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>
Sourcefn expression_logical_operator(
&self,
_parser: &mut JavascriptParser<'_>,
_expr: &BinExpr,
) -> Option<bool>
fn expression_logical_operator( &self, _parser: &mut JavascriptParser<'_>, _expr: &BinExpr, ) -> Option<bool>
Return:
Nonemeans should walk left and right;Some(true)means should walk right;Some(false)means nothing need to do.
Sourcefn binary_expression(
&self,
_parser: &mut JavascriptParser<'_>,
_expr: &BinExpr,
) -> Option<bool>
fn binary_expression( &self, _parser: &mut JavascriptParser<'_>, _expr: &BinExpr, ) -> Option<bool>
Return:
Nonemeans should walk left and right;
Sourcefn statement_if(
&self,
_parser: &mut JavascriptParser<'_>,
_expr: &IfStmt,
) -> Option<bool>
fn statement_if( &self, _parser: &mut JavascriptParser<'_>, _expr: &IfStmt, ) -> Option<bool>
Return:
Nonemeans need walkstmt.test,stmt.consandstmt.alt;Some(true)means only need walkstmt.cons;Some(false)means only need walkstmt.alt;
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>
Sourcefn import_meta_property_in_destructuring(
&self,
_parser: &mut JavascriptParser<'_>,
_property: &DestructuringAssignmentProperty,
) -> Option<String>
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