visitAssignment method

  1. @override
dynamic visitAssignment(
  1. AssignmentExpression node
)

Implementation

@override
visitAssignment(AssignmentExpression node) {
  try {
    dynamic val = getValueFromExpression(node.right);
    ObjectPattern? pattern;
    if (node.left is MemberExpression) {
      pattern =
          visitMember(node.left as MemberExpression, computeAsPattern: true);
    } else if (node.left is IndexExpression) {
      pattern =
          visitIndex(node.left as IndexExpression, computeAsPattern: true);
    }
    if (pattern != null) {
      var obj = pattern.obj;
      if (node.operator == '=') {
        InvokableController.setProperty(obj, pattern.property, val);
      } else {
        dynamic left = InvokableController.getProperty(obj, pattern.property);
        dynamic right = val;
        val = performOperation(
            left, right, node.operator!, node.line ?? -1, getCode(node));
        InvokableController.setProperty(obj, pattern.property, val);
      }
    } else if (node.left is Name || node.left is NameExpression) {
      Name n;
      if (node.left is NameExpression) {
        n = (node.left as NameExpression).name;
      } else {
        n = node.left as Name;
      }
      dynamic value = getValue(n);
      if (value == null || node.operator == '=') {
        value = val;
      } else {
        value = performOperation(
            value, val, node.operator!, node.line ?? -1, getCode(node));
      }
      addToContext(n, value);
    }
  } on JSException catch (e) {
    rethrow;
  } on InvalidPropertyException catch (e) {
    throw JSException(node.line ?? 1, '${e.message}. Code: ${getCode(node)}');
  }
}