Skip to content

Commit 0c9b3a0

Browse files
committed
chore: split ConsumableTrait
1 parent 0b5fcb7 commit 0c9b3a0

16 files changed

+109
-49
lines changed

crates/tree_shaker/src/entity/arguments.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ use super::{
22
consumed_object, Entity, EntityTrait, EnumeratedProperties, IteratedElements, ObjectPrototype,
33
TypeofResult,
44
};
5-
use crate::{analyzer::Analyzer, consumable::Consumable, use_consumed_flag};
5+
use crate::{
6+
analyzer::Analyzer,
7+
consumable::{Consumable, ConsumableTrait},
8+
use_consumed_flag,
9+
};
610
use std::cell::Cell;
711

812
#[derive(Debug, Default)]
@@ -11,15 +15,17 @@ pub struct ArgumentsEntity<'a> {
1115
pub arguments: Vec<(bool, Entity<'a>)>,
1216
}
1317

14-
impl<'a> EntityTrait<'a> for ArgumentsEntity<'a> {
15-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
18+
impl<'a> ConsumableTrait<'a> for ArgumentsEntity<'a> {
19+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
1620
use_consumed_flag!(self);
1721

1822
for (_, entity) in &self.arguments {
1923
entity.consume(analyzer);
2024
}
2125
}
26+
}
2227

28+
impl<'a> EntityTrait<'a> for ArgumentsEntity<'a> {
2329
fn unknown_mutate(&'a self, analyzer: &mut Analyzer<'a>, dep: Consumable<'a>) {
2430
if self.consumed.get() {
2531
return consumed_object::unknown_mutate(analyzer, dep);

crates/tree_shaker/src/entity/array.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::{
44
};
55
use crate::{
66
analyzer::Analyzer,
7-
consumable::{Consumable, ConsumableCollector},
7+
consumable::{Consumable, ConsumableCollector, ConsumableTrait},
88
scope::CfScopeId,
99
use_consumed_flag,
1010
};
@@ -33,8 +33,8 @@ impl<'a> fmt::Debug for ArrayEntity<'a> {
3333
}
3434
}
3535

36-
impl<'a> EntityTrait<'a> for ArrayEntity<'a> {
37-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
36+
impl<'a> ConsumableTrait<'a> for ArrayEntity<'a> {
37+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
3838
use_consumed_flag!(self);
3939

4040
analyzer.mark_object_consumed(self.cf_scope, self.object_id);
@@ -44,7 +44,9 @@ impl<'a> EntityTrait<'a> for ArrayEntity<'a> {
4444
analyzer.consume(self.elements.take());
4545
analyzer.consume(self.rest.take());
4646
}
47+
}
4748

49+
impl<'a> EntityTrait<'a> for ArrayEntity<'a> {
4850
fn unknown_mutate(&'a self, analyzer: &mut Analyzer<'a>, dep: Consumable<'a>) {
4951
if self.consumed.get() {
5052
return consumed_object::unknown_mutate(analyzer, dep);

crates/tree_shaker/src/entity/builtin_fn.rs

+23-8
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ use super::{
22
consumed_object, never::NeverEntity, Entity, EntityFactory, EntityTrait, EnumeratedProperties,
33
IteratedElements, ObjectEntity, ObjectPrototype, TypeofResult,
44
};
5-
use crate::{analyzer::Analyzer, consumable::Consumable};
5+
use crate::{
6+
analyzer::Analyzer,
7+
consumable::{Consumable, ConsumableTrait},
8+
};
69
use std::fmt::Debug;
710

8-
pub trait BuiltinFnEntity<'a>: Debug {
11+
trait BuiltinFnEntity<'a>: ConsumableTrait<'a> {
912
#[cfg(feature = "flame")]
1013
fn name(&self) -> &'static str;
1114
fn object(&self) -> Option<&'a ObjectEntity<'a>> {
@@ -21,12 +24,6 @@ pub trait BuiltinFnEntity<'a>: Debug {
2124
}
2225

2326
impl<'a, T: BuiltinFnEntity<'a>> EntityTrait<'a> for T {
24-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
25-
if let Some(object) = self.object() {
26-
object.consume(analyzer);
27-
}
28-
}
29-
3027
fn unknown_mutate(&'a self, _analyzer: &mut Analyzer<'a>, _dep: Consumable<'a>) {
3128
// No effect
3229
}
@@ -194,6 +191,16 @@ impl<'a, F: BuiltinFnImplementation<'a> + 'a> Debug for ImplementedBuiltinFnEnti
194191
}
195192
}
196193

194+
impl<'a, F: BuiltinFnImplementation<'a> + 'a> ConsumableTrait<'a>
195+
for ImplementedBuiltinFnEntity<'a, F>
196+
{
197+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
198+
if let Some(object) = self.object() {
199+
object.consume(analyzer);
200+
}
201+
}
202+
}
203+
197204
impl<'a, F: BuiltinFnImplementation<'a> + 'a> BuiltinFnEntity<'a>
198205
for ImplementedBuiltinFnEntity<'a, F>
199206
{
@@ -238,6 +245,14 @@ pub struct PureBuiltinFnEntity<'a> {
238245
return_value: fn(&EntityFactory<'a>) -> Entity<'a>,
239246
}
240247

248+
impl<'a> ConsumableTrait<'a> for PureBuiltinFnEntity<'a> {
249+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
250+
if let Some(object) = self.object() {
251+
object.consume(analyzer);
252+
}
253+
}
254+
}
255+
241256
impl<'a> BuiltinFnEntity<'a> for PureBuiltinFnEntity<'a> {
242257
#[cfg(feature = "flame")]
243258
fn name(&self) -> &'static str {

crates/tree_shaker/src/entity/class.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub struct ClassEntity<'a> {
1717
}
1818

1919
impl<'a> EntityTrait<'a> for ClassEntity<'a> {
20-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
20+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
2121
use_consumed_flag!(self);
2222

2323
self.statics.consume(analyzer);

crates/tree_shaker/src/entity/function.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ use super::{
44
};
55
use crate::{
66
analyzer::Analyzer,
7-
consumable::Consumable,
7+
consumable::{Consumable, ConsumableTrait},
88
scope::VariableScopeId,
99
utils::{CalleeInfo, CalleeNode},
1010
};
1111
use oxc::span::GetSpan;
1212
use std::{cell::Cell, rc::Rc};
1313

14-
#[derive(Debug)]
14+
#[derive(Debug, Clone)]
1515
pub struct FunctionEntity<'a> {
1616
body_consumed: Rc<Cell<bool>>,
1717
pub callee: CalleeInfo<'a>,
@@ -22,13 +22,15 @@ pub struct FunctionEntity<'a> {
2222
pub prototype: &'a ObjectEntity<'a>,
2323
}
2424

25-
impl<'a> EntityTrait<'a> for FunctionEntity<'a> {
26-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
27-
self.consume_body(analyzer);
25+
impl<'a> ConsumableTrait<'a> for FunctionEntity<'a> {
26+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
27+
(analyzer.allocator.alloc(self.clone())).consume_body(analyzer);
2828
self.statics.consume(analyzer);
2929
self.prototype.consume(analyzer);
3030
}
31+
}
3132

33+
impl<'a> EntityTrait<'a> for FunctionEntity<'a> {
3234
fn unknown_mutate(&'a self, analyzer: &mut Analyzer<'a>, dep: Consumable<'a>) {
3335
self.consume(analyzer);
3436
consumed_object::unknown_mutate(analyzer, dep);

crates/tree_shaker/src/entity/literal.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use super::{
55
use crate::{
66
analyzer::Analyzer,
77
builtins::BuiltinPrototype,
8-
consumable::Consumable,
8+
consumable::{Consumable, ConsumableTrait},
99
mangling::{MangleAtom, MangleConstraint},
1010
transformer::Transformer,
1111
utils::F64WithEq,
@@ -33,13 +33,15 @@ pub enum LiteralEntity<'a> {
3333
Undefined,
3434
}
3535

36-
impl<'a> EntityTrait<'a> for LiteralEntity<'a> {
37-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
36+
impl<'a> ConsumableTrait<'a> for LiteralEntity<'a> {
37+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
3838
if let LiteralEntity::String(_, Some(atom)) = self {
3939
analyzer.consume(*atom);
4040
}
4141
}
42+
}
4243

44+
impl<'a> EntityTrait<'a> for LiteralEntity<'a> {
4345
fn consume_mangable(&'a self, _analyzer: &mut Analyzer<'a>) -> bool {
4446
// No effect
4547
!matches!(self, LiteralEntity::String(_, Some(_)))

crates/tree_shaker/src/entity/logical_result.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use super::{
22
Entity, EntityTrait, EnumeratedProperties, IteratedElements, ObjectPrototype, TypeofResult,
33
};
4-
use crate::{analyzer::Analyzer, consumable::Consumable};
4+
use crate::{
5+
analyzer::Analyzer,
6+
consumable::{Consumable, ConsumableTrait},
7+
};
58

69
#[derive(Debug, Clone)]
710
pub struct LogicalResultEntity<'a> {
@@ -10,11 +13,13 @@ pub struct LogicalResultEntity<'a> {
1013
pub result: Option<bool>,
1114
}
1215

13-
impl<'a> EntityTrait<'a> for LogicalResultEntity<'a> {
14-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
16+
impl<'a> ConsumableTrait<'a> for LogicalResultEntity<'a> {
17+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
1518
self.value.consume(analyzer);
1619
}
20+
}
1721

22+
impl<'a> EntityTrait<'a> for LogicalResultEntity<'a> {
1823
fn consume_mangable(&'a self, analyzer: &mut Analyzer<'a>) -> bool {
1924
self.value.consume_mangable(analyzer)
2025
}

crates/tree_shaker/src/entity/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ pub type EnumeratedProperties<'a> = (Vec<(bool, Entity<'a>, Entity<'a>)>, Consum
3838
/// (vec![known_elements], rest, dep)
3939
pub type IteratedElements<'a> = (Vec<Entity<'a>>, Option<Entity<'a>>, Consumable<'a>);
4040

41-
pub trait EntityTrait<'a>: Debug {
42-
fn consume(&'a self, analyzer: &mut Analyzer<'a>);
41+
pub trait EntityTrait<'a>: ConsumableTrait<'a> {
4342
/// Returns true if the entity is completely consumed
4443
fn consume_mangable(&'a self, analyzer: &mut Analyzer<'a>) -> bool {
4544
self.consume(analyzer);

crates/tree_shaker/src/entity/never.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
use crate::{analyzer::Analyzer, consumable::Consumable};
1+
use crate::{
2+
analyzer::Analyzer,
3+
consumable::{Consumable, ConsumableTrait},
4+
};
25

36
use super::{Entity, EntityTrait};
47

58
#[derive(Debug, Clone, Copy)]
69
pub struct NeverEntity;
710

8-
impl<'a> EntityTrait<'a> for NeverEntity {
9-
fn consume(&'a self, _analyzer: &mut Analyzer<'a>) {}
11+
impl<'a> ConsumableTrait<'a> for NeverEntity {
12+
fn consume(&self, _analyzer: &mut Analyzer<'a>) {}
13+
}
1014

15+
impl<'a> EntityTrait<'a> for NeverEntity {
1116
fn unknown_mutate(&'a self, _analyzer: &mut Analyzer<'a>, _dep: Consumable<'a>) {}
1217

1318
fn get_property(

crates/tree_shaker/src/entity/object/delete.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use super::ObjectEntity;
22
use crate::{
33
analyzer::Analyzer,
4-
consumable::Consumable,
5-
entity::{consumed_object, Entity, EntityTrait, LiteralEntity},
4+
consumable::{Consumable, ConsumableTrait},
5+
entity::{consumed_object, Entity, LiteralEntity},
66
mangling::{MangleConstraint, ManglingDep},
77
};
88

crates/tree_shaker/src/entity/object/mod.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ pub struct ObjectEntity<'a> {
7373
// TODO: symbol_keyed
7474
}
7575

76-
impl<'a> EntityTrait<'a> for ObjectEntity<'a> {
77-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
76+
impl<'a> ConsumableTrait<'a> for ObjectEntity<'a> {
77+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
7878
if !self.consumable {
7979
return;
8080
}
@@ -88,7 +88,9 @@ impl<'a> EntityTrait<'a> for ObjectEntity<'a> {
8888

8989
analyzer.mark_object_consumed(self.cf_scope, self.object_id);
9090
}
91+
}
9192

93+
impl<'a> EntityTrait<'a> for ObjectEntity<'a> {
9294
fn unknown_mutate(&'a self, analyzer: &mut Analyzer<'a>, dep: Consumable<'a>) {
9395
if self.consumed.get() {
9496
return consumed_object::unknown_mutate(analyzer, dep);

crates/tree_shaker/src/entity/object/set.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use super::{ObjectEntity, ObjectProperty, ObjectPropertyValue, ObjectPrototype};
22
use crate::{
33
analyzer::Analyzer,
4-
consumable::{Consumable, ConsumableCollector},
5-
entity::{consumed_object, Entity, EntityTrait, LiteralEntity},
4+
consumable::{Consumable, ConsumableCollector, ConsumableTrait},
5+
entity::{consumed_object, Entity, LiteralEntity},
66
mangling::{MangleAtom, MangleConstraint},
77
scope::CfScopeKind,
88
utils::Found,

crates/tree_shaker/src/entity/primitive.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ use super::{
22
consumed_object, never::NeverEntity, Entity, EntityTrait, EnumeratedProperties, IteratedElements,
33
TypeofResult,
44
};
5-
use crate::{analyzer::Analyzer, builtins::BuiltinPrototype, consumable::Consumable};
5+
use crate::{
6+
analyzer::Analyzer,
7+
builtins::BuiltinPrototype,
8+
consumable::{Consumable, ConsumableTrait},
9+
};
610

711
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
812
pub enum PrimitiveEntity {
@@ -15,9 +19,11 @@ pub enum PrimitiveEntity {
1519
Symbol,
1620
}
1721

18-
impl<'a> EntityTrait<'a> for PrimitiveEntity {
19-
fn consume(&'a self, _analyzer: &mut Analyzer<'a>) {}
22+
impl<'a> ConsumableTrait<'a> for PrimitiveEntity {
23+
fn consume(&self, _analyzer: &mut Analyzer<'a>) {}
24+
}
2025

26+
impl<'a> EntityTrait<'a> for PrimitiveEntity {
2127
fn unknown_mutate(&'a self, _analyzer: &mut Analyzer<'a>, _dep: Consumable<'a>) {
2228
// No effect
2329
}

crates/tree_shaker/src/entity/react_element.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ use super::{
22
consumed_object, Entity, EntityTrait, EnumeratedProperties, IteratedElements, TypeofResult,
33
};
44
use crate::{
5-
analyzer::Analyzer, consumable::Consumable, entity::ObjectPrototype, use_consumed_flag,
5+
analyzer::Analyzer,
6+
consumable::{Consumable, ConsumableTrait},
7+
entity::ObjectPrototype,
8+
use_consumed_flag,
69
};
710
use std::cell::{Cell, RefCell};
811

@@ -14,8 +17,8 @@ pub struct ReactElementEntity<'a> {
1417
pub deps: RefCell<Vec<Consumable<'a>>>,
1518
}
1619

17-
impl<'a> EntityTrait<'a> for ReactElementEntity<'a> {
18-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
20+
impl<'a> ConsumableTrait<'a> for ReactElementEntity<'a> {
21+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
1922
use_consumed_flag!(self);
2023

2124
analyzer.consume(self.deps.take());
@@ -33,7 +36,9 @@ impl<'a> EntityTrait<'a> for ReactElementEntity<'a> {
3336
tag.jsx(analyzer, copied_props.into())
3437
});
3538
}
39+
}
3640

41+
impl<'a> EntityTrait<'a> for ReactElementEntity<'a> {
3742
fn unknown_mutate(&'a self, analyzer: &mut Analyzer<'a>, dep: Consumable<'a>) {
3843
if self.consumed.get() {
3944
return consumed_object::unknown_mutate(analyzer, dep);

crates/tree_shaker/src/entity/union.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ use super::{
22
consumed_object, utils::UnionLike, Entity, EntityTrait, EnumeratedProperties, IteratedElements,
33
LiteralEntity, ObjectPrototype, TypeofResult,
44
};
5-
use crate::{analyzer::Analyzer, consumable::Consumable, use_consumed_flag};
5+
use crate::{
6+
analyzer::Analyzer,
7+
consumable::{Consumable, ConsumableTrait},
8+
use_consumed_flag,
9+
};
610
use rustc_hash::FxHashSet;
711
use std::{cell::Cell, fmt::Debug};
812

@@ -14,15 +18,17 @@ pub struct UnionEntity<'a, V: UnionLike<'a, Entity<'a>> + Debug + 'a> {
1418
pub phantom: std::marker::PhantomData<&'a ()>,
1519
}
1620

17-
impl<'a, V: UnionLike<'a, Entity<'a>> + Debug + 'a> EntityTrait<'a> for UnionEntity<'a, V> {
18-
fn consume(&'a self, analyzer: &mut Analyzer<'a>) {
21+
impl<'a, V: UnionLike<'a, Entity<'a>> + Debug + 'a> ConsumableTrait<'a> for UnionEntity<'a, V> {
22+
fn consume(&self, analyzer: &mut Analyzer<'a>) {
1923
use_consumed_flag!(self);
2024

2125
for value in self.values.iter() {
2226
value.consume(analyzer);
2327
}
2428
}
29+
}
2530

31+
impl<'a, V: UnionLike<'a, Entity<'a>> + Debug + 'a> EntityTrait<'a> for UnionEntity<'a, V> {
2632
fn consume_mangable(&'a self, analyzer: &mut Analyzer<'a>) -> bool {
2733
if !self.consumed.get() {
2834
let mut consumed = true;

0 commit comments

Comments
 (0)