visitUpdateExpression method

  1. @override
dynamic visitUpdateExpression(
  1. UpdateExpression node
)

Implementation

@override
visitUpdateExpression(UpdateExpression node) {
  dynamic val = getValueFromExpression(node.argument!);
  ObjectPattern? pattern;
  num number;
  num originalNumber;
  if (val is num) {
    number = val;
    originalNumber = number;
  } else {
    throw JSException(
        node.line ?? -1,
        'The operator ' +
            node.operator! +
            ' is only valid for numbers and ' +
            node.argument.toString() +
            ' is not a number.',
        detailedError: 'Code: ${getCode(node)}');
  }
  if (node.argument is MemberExpression) {
    pattern = visitMember(node.argument as MemberExpression,
        computeAsPattern: true);
  } else if (node.argument is IndexExpression) {
    pattern =
        visitIndex(node.argument as IndexExpression, computeAsPattern: true);
  }

  if (pattern != null) {
    var obj = pattern.obj;
    switch (node.operator) {
      case '++':
        number++;
        InvokableController.setProperty(obj, pattern.property, number);
        break;
      case '--':
        number--;
        InvokableController.setProperty(obj, pattern.property, number);
        break;
      default:
        throw JSException(node.line ?? -1,
            "${node.operator!} in Code: ${getCode(node)} is not yet supported");
    }
  } else if (node.argument is Name || node.argument is NameExpression) {
    Name n;
    if (node.argument is NameExpression) {
      n = (node.argument as NameExpression).name;
    } else {
      n = node.argument as Name;
    }
    switch (node.operator) {
      case '++':
        number++;
        break;
      case '--':
        number--;
        break;
    }
    addToContext(n, number);
  }
  if (node.isPrefix) {
    return number;
  }
  return originalNumber;
}