Skip to content

Commit b796e81

Browse files
committed
fix: interaction
1 parent f8dcd9e commit b796e81

File tree

4 files changed

+47
-19
lines changed

4 files changed

+47
-19
lines changed

src/builtins/prototypes/array.rs

+37-10
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
1-
use crate::entity::builtin_fn::PureBuiltinFnEntity;
1+
use crate::entity::{builtin_fn::PureBuiltinFnEntity, interactions::InteractionKind};
22

33
use super::{object::create_object_prototype, Prototype};
44

55
pub fn create_array_prototype<'a>() -> Prototype<'a> {
66
let mut prototype = create_object_prototype();
77

88
prototype.insert("concat", PureBuiltinFnEntity::returns_array());
9-
prototype.insert("copyWithin", PureBuiltinFnEntity::returns_unknown().mutates_this());
9+
prototype.insert(
10+
"copyWithin",
11+
PureBuiltinFnEntity::returns_unknown().interaction_kind(InteractionKind::ArrayOp),
12+
);
1013
prototype.insert("entries", PureBuiltinFnEntity::returns_array());
1114
prototype.insert("every", PureBuiltinFnEntity::returns_boolean());
12-
prototype.insert("fill", PureBuiltinFnEntity::returns_unknown().mutates_this());
15+
prototype.insert(
16+
"fill",
17+
PureBuiltinFnEntity::returns_unknown().interaction_kind(InteractionKind::ArrayOp),
18+
);
1319
prototype.insert("filter", PureBuiltinFnEntity::returns_array());
1420
prototype.insert("find", PureBuiltinFnEntity::returns_unknown());
1521
prototype.insert("findIndex", PureBuiltinFnEntity::returns_number());
@@ -24,17 +30,38 @@ pub fn create_array_prototype<'a>() -> Prototype<'a> {
2430
prototype.insert("keys", PureBuiltinFnEntity::returns_unknown());
2531
prototype.insert("lastIndexOf", PureBuiltinFnEntity::returns_number());
2632
prototype.insert("map", PureBuiltinFnEntity::returns_array());
27-
prototype.insert("pop", PureBuiltinFnEntity::returns_unknown().mutates_this());
28-
prototype.insert("push", PureBuiltinFnEntity::returns_number().mutates_this());
33+
prototype.insert(
34+
"pop",
35+
PureBuiltinFnEntity::returns_unknown().interaction_kind(InteractionKind::ArrayOp),
36+
);
37+
prototype.insert(
38+
"push",
39+
PureBuiltinFnEntity::returns_number().interaction_kind(InteractionKind::ArrayOp),
40+
);
2941
prototype.insert("reduce", PureBuiltinFnEntity::returns_unknown());
3042
prototype.insert("reduceRight", PureBuiltinFnEntity::returns_unknown());
31-
prototype.insert("reverse", PureBuiltinFnEntity::returns_unknown().mutates_this());
32-
prototype.insert("shift", PureBuiltinFnEntity::returns_unknown().mutates_this());
43+
prototype.insert(
44+
"reverse",
45+
PureBuiltinFnEntity::returns_unknown().interaction_kind(InteractionKind::ArrayOp),
46+
);
47+
prototype.insert(
48+
"shift",
49+
PureBuiltinFnEntity::returns_unknown().interaction_kind(InteractionKind::ArrayOp),
50+
);
3351
prototype.insert("slice", PureBuiltinFnEntity::returns_array());
3452
prototype.insert("some", PureBuiltinFnEntity::returns_boolean());
35-
prototype.insert("sort", PureBuiltinFnEntity::returns_unknown().mutates_this());
36-
prototype.insert("splice", PureBuiltinFnEntity::returns_array().mutates_this());
37-
prototype.insert("unshift", PureBuiltinFnEntity::returns_number().mutates_this());
53+
prototype.insert(
54+
"sort",
55+
PureBuiltinFnEntity::returns_unknown().interaction_kind(InteractionKind::ArrayOp),
56+
);
57+
prototype.insert(
58+
"splice",
59+
PureBuiltinFnEntity::returns_array().interaction_kind(InteractionKind::ArrayOp),
60+
);
61+
prototype.insert(
62+
"unshift",
63+
PureBuiltinFnEntity::returns_number().interaction_kind(InteractionKind::ArrayOp),
64+
);
3865
prototype.insert("values", PureBuiltinFnEntity::returns_unknown());
3966

4067
prototype

src/entity/array.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ impl<'a> EntityTrait<'a> for ArrayEntity<'a> {
4848

4949
fn interact(&self, analyzer: &mut Analyzer<'a>, dep: EntityDep, kind: InteractionKind) {
5050
if kind == InteractionKind::ArrayOp {
51-
self.deps.borrow_mut().push(dep);
51+
self.add_dep(analyzer, dep);
5252
} else {
5353
self.consume(analyzer);
5454
consumed_object::interact(analyzer, dep, kind);
@@ -199,7 +199,7 @@ impl<'a> EntityTrait<'a> for ArrayEntity<'a> {
199199
}
200200
}
201201
if has_effect {
202-
self.add_assignment_dep(analyzer, dep);
202+
self.add_dep(analyzer, dep);
203203
}
204204
} else {
205205
self.consume(analyzer);
@@ -344,7 +344,7 @@ impl<'a> ArrayEntity<'a> {
344344
}
345345
}
346346

347-
fn add_assignment_dep(&self, analyzer: &Analyzer<'a>, dep: EntityDep) {
347+
fn add_dep(&self, analyzer: &Analyzer<'a>, dep: EntityDep) {
348348
let target_variable_scope = analyzer.find_first_different_variable_scope(&self.variable_scopes);
349349
self.deps.borrow_mut().push(analyzer.get_assignment_deps(target_variable_scope, dep));
350350
}

src/entity/builtin_fn.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ impl<'a> ImplementedBuiltinFnEntity<'a> {
146146
#[derive(Debug, Clone)]
147147
pub struct PureBuiltinFnEntity<'a> {
148148
return_value: Entity<'a>,
149-
mutates_this: bool,
149+
interaction_kind: InteractionKind,
150150
}
151151

152152
impl<'a> BuiltinFnEntity<'a> for PureBuiltinFnEntity<'a> {
@@ -157,19 +157,19 @@ impl<'a> BuiltinFnEntity<'a> for PureBuiltinFnEntity<'a> {
157157
this: &Entity<'a>,
158158
args: &Entity<'a>,
159159
) -> Entity<'a> {
160-
this.interact(analyzer, dep, InteractionKind::Unknown);
160+
this.interact(analyzer, dep, self.interaction_kind);
161161
args.consume(analyzer);
162162
self.return_value.clone()
163163
}
164164
}
165165

166166
impl<'a> PureBuiltinFnEntity<'a> {
167167
pub fn new(return_value: Entity<'a>) -> Self {
168-
Self { return_value, mutates_this: false }
168+
Self { return_value, interaction_kind: InteractionKind::Unknown }
169169
}
170170

171-
pub fn mutates_this(mut self) -> Self {
172-
self.mutates_this = true;
171+
pub fn interaction_kind(mut self, interaction_kind: InteractionKind) -> Self {
172+
self.interaction_kind = interaction_kind;
173173
self
174174
}
175175

src/entity/interactions.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1+
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
22
pub enum InteractionKind {
3+
#[default]
34
Unknown,
45
ArrayOp,
56
}

0 commit comments

Comments
 (0)