visitBinaryExpr method

  1. @override
Uint8List visitBinaryExpr(
  1. BinaryExpr expr
)
override

Implementation

@override
Uint8List visitBinaryExpr(BinaryExpr expr) {
  final bytesBuilder = BytesBuilder();
  final left = compileAST(expr.left);
  final right = compileAST(expr.right);
  if (expr.op == _lexicon.equal) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.equal);
  } else if (expr.op == _lexicon.notEqual) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.notEqual);
  } else if (expr.op == _lexicon.greaterOrEqual) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.greaterOrEqual);
  } else if (expr.op == _lexicon.greater) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.greater);
  } else if (expr.op == _lexicon.lesserOrEqual) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.lesserOrEqual);
  } else if (expr.op == _lexicon.lesser) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.lesser);
  } else if (expr.op == _lexicon.kAs) {
    bytesBuilder.add(left);
    final right = compileAST(expr.right);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.typeAs);
  } else if (expr.op == _lexicon.kIs) {
    bytesBuilder.add(left);
    final right = compileAST(expr.right);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.typeIs);
  } else if (expr.op == _lexicon.kIsNot) {
    bytesBuilder.add(left);
    final right = compileAST(expr.right);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.typeIsNot);
  } else if (expr.op == _lexicon.kIn) {
    final containsCallExpr = CallExpr(
        MemberExpr(
            expr.right, IdentifierExpr(_lexicon.idContains, isLocal: false)),
        positionalArgs: [expr.left]);
    final containsCallExprBytes = visitCallExpr(containsCallExpr);
    bytesBuilder.add(containsCallExprBytes);
  } else if (expr.op == _lexicon.kNotIn) {
    final containsCallExpr = CallExpr(
        MemberExpr(
            expr.right, IdentifierExpr(_lexicon.idContains, isLocal: false)),
        positionalArgs: [expr.left]);
    final containsCallExprBytes = visitCallExpr(containsCallExpr);
    bytesBuilder.add(containsCallExprBytes);
    bytesBuilder.addByte(OpCode.logicalNot);
  } else if (expr.op == _lexicon.ifNull) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(OpCode.ifNull);
    bytesBuilder.add(_uint16(right.length)); // length of right value
    bytesBuilder.add(right);
  } else if (expr.op == _lexicon.logicalOr) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(OpCode.logicalOr);
    bytesBuilder.add(_uint16(right.length + 1)); // length of right value
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.truthyValue);
  } else if (expr.op == _lexicon.logicalAnd) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(OpCode.logicalAnd);
    bytesBuilder.add(_uint16(right.length + 1)); // length of right value
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.truthyValue);
  } else if (expr.op == _lexicon.bitwiseOr) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.bitwiseOr);
  } else if (expr.op == _lexicon.bitwiseXor) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.bitwiseXor);
  } else if (expr.op == _lexicon.bitwiseAnd) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.bitwiseAnd);
  } else if (expr.op == _lexicon.leftShift) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.leftShift);
  } else if (expr.op == _lexicon.rightShift) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.rightShift);
  } else if (expr.op == _lexicon.unsignedRightShift) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.unsignedRightShift);
  } else if (expr.op == _lexicon.add) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.add);
  } else if (expr.op == _lexicon.subtract) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.subtract);
  } else if (expr.op == _lexicon.multiply) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.multiply);
  } else if (expr.op == _lexicon.devide) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.devide);
  } else if (expr.op == _lexicon.truncatingDevide) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.truncatingDevide);
  } else if (expr.op == _lexicon.modulo) {
    bytesBuilder.add(left);
    bytesBuilder.add(right);
    bytesBuilder.addByte(OpCode.modulo);
  }
  return bytesBuilder.toBytes();
}