use super::*;
impl JsParser {
pub(super) fn eval_assignment_expr(&mut self, assign: &AssignExpr) -> NodeId {
let rhs = self.eval_expr(&assign.right);
match &assign.left {
AssignTarget::Simple(SimpleAssignTarget::Ident(i)) => {
let lhs_name = i.id.sym.to_string();
let lhs = self.var(&lhs_name);
self.flow(rhs, lhs);
if let Some(alias) = self.node_binding_alias(rhs) {
if let Some(node) = self.graph.node_mut(lhs) {
node.alias = Some(alias);
}
}
self.materialize_composite_bindings(&lhs_name, rhs);
if let Some(ref params) = self.fn_expr_params_at_depth_0.take() {
self.function_params.insert(lhs_name.clone(), params.clone());
}
if let Some(s) = self.try_infer_string_literal(&assign.right) {
self.known_strings.insert(lhs_name.clone(), s);
}
if let Some(arr) = self.try_infer_array_literal(&assign.right) {
self.known_arrays.insert(lhs_name, arr);
}
lhs
}
AssignTarget::Simple(SimpleAssignTarget::Member(m)) => {
let lhs = self.eval_member_expr(m);
self.flow(rhs, lhs);
let lhs_name = self.binding_name(lhs);
self.assigned_members.insert(lhs_name.clone());
self.materialize_composite_bindings(&lhs_name, rhs);
lhs
}
AssignTarget::Pat(p) => {
match p {
AssignTargetPat::Array(a) => {
self.bind_pat_with_source(&Pat::Array(a.clone()), Some(rhs));
}
AssignTargetPat::Object(o) => {
self.bind_pat_with_source(&Pat::Object(o.clone()), Some(rhs));
}
AssignTargetPat::Invalid(_) => {}
}
rhs
}
_ => rhs,
}
}
}