operatorAdd method

FutureOr<ASTValue> operatorAdd(
  1. VMContext context,
  2. ASTValue val1,
  3. ASTValue val2
)

Implementation

FutureOr<ASTValue> operatorAdd(
    VMContext context, ASTValue val1, ASTValue val2) {
  var t1 = val1.type;
  var t2 = val2.type;

  if (t1 is ASTTypeString || t2 is ASTTypeString) {
    var v1 = val1.getValue(context);
    var v2 = val2.getValue(context);
    if (v1.isResolved && v2.isResolved) {
      var r = '$v1$v2';
      return ASTValueString(r);
    } else {
      return <FutureOr>[v1, v2].resolveAllJoined((l) {
        return ASTValueString(l.join());
      });
    }
  }

  if (t1 is ASTTypeInt) {
    if (t2 is ASTTypeInt) {
      var v1 = val1.getValue(context) as int;
      var v2 = val2.getValue(context) as int;
      var r = v1 + v2;
      return ASTValueInt(r);
    } else if (t2 is ASTTypeDouble) {
      var v1 = val1.getValue(context) as int;
      var v2 = val2.getValue(context) as double;
      var r = v1 + v2;
      return ASTValueDouble(r);
    }
  }

  if (t1 is ASTTypeDouble) {
    if (t2 is ASTTypeNum) {
      var v1 = val1.getValue(context) as double;
      var v2 = val2.getValue(context) as num;
      var r = v1 + v2;
      return ASTValueDouble(r);
    }
  }

  throwOperationError('+', t1, t2);
}