visitUnary method

  1. @override
dynamic visitUnary(
  1. UnaryExpression node
)

Implementation

@override
visitUnary(UnaryExpression node) {
  // Handle 'delete' operator specially - it needs to work on property expressions
  if (node.operator == 'delete') {
    ObjectPattern? pattern;
    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);
    } else if (node.argument is Name || node.argument is NameExpression) {
      // Deleting a variable name is not allowed in strict mode, but we'll return false
      // In non-strict mode, it would delete from global scope, but we don't support that
      return false;
    }

    if (pattern != null) {
      return InvokableController.deleteProperty(
          pattern.obj, pattern.property);
    }
    return false;
  }

  dynamic val = getValueFromNode(node.argument);
  switch (node.operator) {
    case '-':
      val = (val is num) ? -val : -toNumber(val);
      break;
    case '+':
      val = toNumber(val);
      break;
    case '++':
      val = (val is num) ? val + 1 : toNumber(val) + 1;
      break;
    case '--':
      val = (val is num) ? val - 1 : toNumber(val) - 1;
      break;
    case '~':
      val = (val is int) ? ~val : ~toNumber(val).toInt();
      break;
    case 'typeof':
      val = _jsTypeOf(val);
      break;
    case '!':
      val = !toBoolean(val);
      break;
    default:
      throw JSException(
          node.line ?? -1, "${node.operator} not yet implemented.",
          detailedError: "Code: " + getCode(node));
  }
  return val;
}