Skip to content

Commit ad85cc4

Browse files
committed
feat(traverse): introduce TraverseCtx<'a, State>
part of #11742
1 parent 2f25ca6 commit ad85cc4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+2135
-1244
lines changed

crates/oxc_minifier/src/compressor.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use oxc_traverse::ReusableTraverseCtx;
55

66
use crate::{
77
CompressOptions,
8+
ctx::MinifierState,
89
peephole::{
910
DeadCodeElimination, LatePeepholeOptimizations, Normalize, NormalizeOptions,
1011
PeepholeOptimizations,
@@ -27,7 +28,8 @@ impl<'a> Compressor<'a> {
2728
}
2829

2930
pub fn build_with_scoping(self, scoping: Scoping, program: &mut Program<'a>) {
30-
let mut ctx = ReusableTraverseCtx::new(scoping, self.allocator);
31+
let state = MinifierState::default();
32+
let mut ctx = ReusableTraverseCtx::new(state, scoping, self.allocator);
3133
let normalize_options =
3234
NormalizeOptions { convert_while_to_fors: true, convert_const_to_let: true };
3335
Normalize::new(normalize_options, self.options).build(program, &mut ctx);
@@ -42,7 +44,8 @@ impl<'a> Compressor<'a> {
4244
}
4345

4446
pub fn dead_code_elimination_with_scoping(self, scoping: Scoping, program: &mut Program<'a>) {
45-
let mut ctx = ReusableTraverseCtx::new(scoping, self.allocator);
47+
let state = MinifierState::default();
48+
let mut ctx = ReusableTraverseCtx::new(state, scoping, self.allocator);
4649
let normalize_options =
4750
NormalizeOptions { convert_while_to_fors: false, convert_const_to_let: false };
4851
Normalize::new(normalize_options, self.options).build(program, &mut ctx);

crates/oxc_minifier/src/ctx.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::ops::Deref;
1+
use std::{marker::PhantomData, ops::Deref};
22

33
use oxc_ast::{AstBuilder, ast::*};
44
use oxc_ecmascript::constant_evaluation::{
@@ -7,7 +7,13 @@ use oxc_ecmascript::constant_evaluation::{
77
use oxc_ecmascript::side_effects::{MayHaveSideEffects, PropertyReadSideEffects};
88
use oxc_semantic::{IsGlobalReference, Scoping};
99
use oxc_span::format_atom;
10-
use oxc_traverse::TraverseCtx;
10+
11+
#[derive(Default)]
12+
pub struct MinifierState<'a> {
13+
data: PhantomData<&'a ()>,
14+
}
15+
16+
pub type TraverseCtx<'a> = oxc_traverse::TraverseCtx<'a, MinifierState<'a>>;
1117

1218
#[derive(Clone, Copy)]
1319
pub struct Ctx<'a, 'b>(pub &'b TraverseCtx<'a>);

crates/oxc_minifier/src/peephole/mod.rs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ use oxc_allocator::Vec;
2525
use oxc_ast::ast::*;
2626
use oxc_data_structures::stack::NonEmptyStack;
2727
use oxc_syntax::{es_target::ESTarget, scope::ScopeId};
28-
use oxc_traverse::{ReusableTraverseCtx, Traverse, TraverseCtx, traverse_mut_with_ctx};
28+
use oxc_traverse::{ReusableTraverseCtx, Traverse, traverse_mut_with_ctx};
2929

30-
use crate::{ctx::Ctx, options::CompressOptionsKeepNames};
30+
use crate::{
31+
ctx::{Ctx, MinifierState, TraverseCtx},
32+
options::CompressOptionsKeepNames,
33+
};
3134

3235
pub use self::normalize::{Normalize, NormalizeOptions};
3336

@@ -64,11 +67,19 @@ impl<'a> PeepholeOptimizations {
6467
}
6568
}
6669

67-
pub fn build(&mut self, program: &mut Program<'a>, ctx: &mut ReusableTraverseCtx<'a>) {
70+
pub fn build(
71+
&mut self,
72+
program: &mut Program<'a>,
73+
ctx: &mut ReusableTraverseCtx<'a, MinifierState<'a>>,
74+
) {
6875
traverse_mut_with_ctx(self, program, ctx);
6976
}
7077

71-
pub fn run_in_loop(&mut self, program: &mut Program<'a>, ctx: &mut ReusableTraverseCtx<'a>) {
78+
pub fn run_in_loop(
79+
&mut self,
80+
program: &mut Program<'a>,
81+
ctx: &mut ReusableTraverseCtx<'a, MinifierState<'a>>,
82+
) {
7283
loop {
7384
self.build(program, ctx);
7485
if self.functions_changed.is_empty() {
@@ -137,7 +148,7 @@ impl<'a> PeepholeOptimizations {
137148
}
138149
}
139150

140-
impl<'a> Traverse<'a> for PeepholeOptimizations {
151+
impl<'a> Traverse<'a, MinifierState<'a>> for PeepholeOptimizations {
141152
fn enter_program(&mut self, program: &mut Program<'a>, _ctx: &mut TraverseCtx<'a>) {
142153
self.enter_program_or_function(program.scope_id());
143154
}
@@ -391,12 +402,16 @@ impl<'a> LatePeepholeOptimizations {
391402
Self { target }
392403
}
393404

394-
pub fn build(&mut self, program: &mut Program<'a>, ctx: &mut ReusableTraverseCtx<'a>) {
405+
pub fn build(
406+
&mut self,
407+
program: &mut Program<'a>,
408+
ctx: &mut ReusableTraverseCtx<'a, MinifierState<'a>>,
409+
) {
395410
traverse_mut_with_ctx(self, program, ctx);
396411
}
397412
}
398413

399-
impl<'a> Traverse<'a> for LatePeepholeOptimizations {
414+
impl<'a> Traverse<'a, MinifierState<'a>> for LatePeepholeOptimizations {
400415
fn exit_member_expression(
401416
&mut self,
402417
expr: &mut MemberExpression<'a>,
@@ -440,12 +455,16 @@ impl<'a> DeadCodeElimination {
440455
}
441456
}
442457

443-
pub fn build(&mut self, program: &mut Program<'a>, ctx: &mut ReusableTraverseCtx<'a>) {
458+
pub fn build(
459+
&mut self,
460+
program: &mut Program<'a>,
461+
ctx: &mut ReusableTraverseCtx<'a, MinifierState<'a>>,
462+
) {
444463
traverse_mut_with_ctx(self, program, ctx);
445464
}
446465
}
447466

448-
impl<'a> Traverse<'a> for DeadCodeElimination {
467+
impl<'a> Traverse<'a, MinifierState<'a>> for DeadCodeElimination {
449468
fn exit_statement(&mut self, stmt: &mut Statement<'a>, ctx: &mut TraverseCtx<'a>) {
450469
let mut state = State::default();
451470
self.inner.remove_dead_code_exit_statement(stmt, &mut state, Ctx(ctx));

crates/oxc_minifier/src/peephole/normalize.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ use oxc_ecmascript::constant_evaluation::{DetermineValueType, ValueType};
44
use oxc_semantic::IsGlobalReference;
55
use oxc_span::GetSpan;
66
use oxc_syntax::scope::ScopeFlags;
7-
use oxc_traverse::{Ancestor, ReusableTraverseCtx, Traverse, TraverseCtx, traverse_mut_with_ctx};
7+
use oxc_traverse::{Ancestor, ReusableTraverseCtx, Traverse, traverse_mut_with_ctx};
88

9-
use crate::{CompressOptions, ctx::Ctx};
9+
use crate::{
10+
CompressOptions,
11+
ctx::{Ctx, MinifierState, TraverseCtx},
12+
};
1013

1114
#[derive(Default)]
1215
pub struct NormalizeOptions {
@@ -39,12 +42,16 @@ pub struct Normalize {
3942
}
4043

4144
impl<'a> Normalize {
42-
pub fn build(&mut self, program: &mut Program<'a>, ctx: &mut ReusableTraverseCtx<'a>) {
45+
pub fn build(
46+
&mut self,
47+
program: &mut Program<'a>,
48+
ctx: &mut ReusableTraverseCtx<'a, MinifierState<'a>>,
49+
) {
4350
traverse_mut_with_ctx(self, program, ctx);
4451
}
4552
}
4653

47-
impl<'a> Traverse<'a> for Normalize {
54+
impl<'a> Traverse<'a, MinifierState<'a>> for Normalize {
4855
fn exit_statements(&mut self, stmts: &mut Vec<'a, Statement<'a>>, _ctx: &mut TraverseCtx<'a>) {
4956
stmts.retain(|stmt| {
5057
!(matches!(stmt, Statement::EmptyStatement(_))

crates/oxc_transformer/src/common/arrow_function_converter.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ use oxc_syntax::{
101101
scope::{ScopeFlags, ScopeId},
102102
symbol::SymbolFlags,
103103
};
104-
use oxc_traverse::{Ancestor, BoundIdentifier, Traverse, TraverseCtx};
104+
use oxc_traverse::{Ancestor, BoundIdentifier, Traverse};
105105

106106
use crate::{EnvOptions, utils::ast_builder::wrap_expression_in_arrow_function_iife};
107+
use crate::{context::TraverseCtx, state::TransformState};
107108

108109
type FxIndexMap<K, V> = IndexMap<K, V, FxBuildHasher>;
109110

@@ -172,7 +173,7 @@ impl ArrowFunctionConverter<'_> {
172173
}
173174
}
174175

175-
impl<'a> Traverse<'a> for ArrowFunctionConverter<'a> {
176+
impl<'a> Traverse<'a, TransformState<'a>> for ArrowFunctionConverter<'a> {
176177
// Note: No visitors for `TSModuleBlock` because `this` is not legal in TS module blocks.
177178
// <https://www.typescriptlang.org/play/?#code/HYQwtgpgzgDiDGEAEAxA9mpBvAsAKCSXjWCgBckANJAXiQAoBKWgPiTIAsBLKAbnwC++fGDQATAK4AbZACEQAJ2z5CxUhWp0mrdtz6D8QA>
178179

crates/oxc_transformer/src/common/computed_key.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
33
use oxc_ast::ast::Expression;
44
use oxc_semantic::SymbolFlags;
5-
use oxc_traverse::TraverseCtx;
65

7-
use crate::{TransformCtx, utils::ast_builder::create_assignment};
6+
use crate::{
7+
context::{TransformCtx, TraverseCtx},
8+
utils::ast_builder::create_assignment,
9+
};
810

911
impl<'a> TransformCtx<'a> {
1012
/// Check if temp var is required for `key`.

crates/oxc_transformer/src/common/duplicate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ use oxc_allocator::CloneIn;
99
use oxc_ast::ast::{AssignmentOperator, Expression};
1010
use oxc_span::SPAN;
1111
use oxc_syntax::reference::ReferenceFlags;
12-
use oxc_traverse::{BoundIdentifier, TraverseCtx};
12+
use oxc_traverse::BoundIdentifier;
1313

14-
use crate::TransformCtx;
14+
use crate::context::{TransformCtx, TraverseCtx};
1515

1616
impl<'a> TransformCtx<'a> {
1717
/// Duplicate expression to be used twice.

crates/oxc_transformer/src/common/helper_loader.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ use oxc_ast::{
7777
};
7878
use oxc_semantic::{ReferenceFlags, SymbolFlags};
7979
use oxc_span::{Atom, SPAN, Span};
80-
use oxc_traverse::{BoundIdentifier, TraverseCtx};
80+
use oxc_traverse::BoundIdentifier;
8181

82-
use crate::TransformCtx;
82+
use crate::context::{TransformCtx, TraverseCtx};
8383

8484
/// Defines the mode for loading helper functions.
8585
#[derive(Default, Clone, Copy, Debug, Deserialize)]

crates/oxc_transformer/src/common/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
use arrow_function_converter::ArrowFunctionConverter;
44
use oxc_allocator::Vec as ArenaVec;
55
use oxc_ast::ast::*;
6-
use oxc_traverse::{Traverse, TraverseCtx};
6+
use oxc_traverse::Traverse;
77

8-
use crate::{EnvOptions, TransformCtx};
8+
use crate::{
9+
EnvOptions,
10+
context::{TransformCtx, TraverseCtx},
11+
state::TransformState,
12+
};
913

1014
pub mod arrow_function_converter;
1115
mod computed_key;
@@ -41,7 +45,7 @@ impl<'a, 'ctx> Common<'a, 'ctx> {
4145
}
4246
}
4347

44-
impl<'a> Traverse<'a> for Common<'a, '_> {
48+
impl<'a> Traverse<'a, TransformState<'a>> for Common<'a, '_> {
4549
fn exit_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
4650
self.module_imports.exit_program(program, ctx);
4751
self.var_declarations.exit_program(program, ctx);

crates/oxc_transformer/src/common/module_imports.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,12 @@ use oxc_ast::{NONE, ast::*};
4040
use oxc_semantic::ReferenceFlags;
4141
use oxc_span::{Atom, SPAN};
4242
use oxc_syntax::symbol::SymbolId;
43-
use oxc_traverse::{BoundIdentifier, Traverse, TraverseCtx};
43+
use oxc_traverse::{BoundIdentifier, Traverse};
4444

45-
use crate::TransformCtx;
45+
use crate::{
46+
context::{TransformCtx, TraverseCtx},
47+
state::TransformState,
48+
};
4649

4750
pub struct ModuleImports<'a, 'ctx> {
4851
ctx: &'ctx TransformCtx<'a>,
@@ -54,7 +57,7 @@ impl<'a, 'ctx> ModuleImports<'a, 'ctx> {
5457
}
5558
}
5659

57-
impl<'a> Traverse<'a> for ModuleImports<'a, '_> {
60+
impl<'a> Traverse<'a, TransformState<'a>> for ModuleImports<'a, '_> {
5861
fn exit_program(&mut self, _program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) {
5962
self.ctx.module_imports.insert_into_program(self.ctx, ctx);
6063
}

0 commit comments

Comments
 (0)