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.ifNull) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.orLeft);
    bytesBuilder.addByte(HTOpCode.ifNull);
    bytesBuilder.add(_uint16(right.length + 1)); // length of right value
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.endOfExec);
  } else if (expr.op == _lexicon.logicalOr) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.orLeft);
    bytesBuilder.addByte(HTOpCode.logicalOr);
    bytesBuilder.add(_uint16(right.length + 1)); // length of right value
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.endOfExec);
  } else if (expr.op == _lexicon.logicalAnd) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.andLeft);
    bytesBuilder.addByte(HTOpCode.logicalAnd);
    bytesBuilder.add(_uint16(right.length + 1)); // length of right value
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.endOfExec);
  } else if (expr.op == _lexicon.equal) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.equalLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.equal);
  } else if (expr.op == _lexicon.notEqual) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.equalLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.notEqual);
  } else if (expr.op == _lexicon.lesser) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.relationLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.lesser);
  } else if (expr.op == _lexicon.greater) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.relationLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.greater);
  } else if (expr.op == _lexicon.lesserOrEqual) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.relationLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.lesserOrEqual);
  } else if (expr.op == _lexicon.greaterOrEqual) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.relationLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.greaterOrEqual);
  } else if (expr.op == _lexicon.kAs) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.relationLeft);
    final right = compileAST(expr.right);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.typeAs);
  } else if (expr.op == _lexicon.kIs) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.relationLeft);
    final right = compileAST(expr.right);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.typeIs);
  } else if (expr.op == _lexicon.kIsNot) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.relationLeft);
    final right = compileAST(expr.right);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.typeIsNot);
  } else if (expr.op == _lexicon.add) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.addLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.add);
  } else if (expr.op == _lexicon.subtract) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.addLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.subtract);
  } else if (expr.op == _lexicon.multiply) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.multiplyLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.multiply);
  } else if (expr.op == _lexicon.devide) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.multiplyLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.devide);
  } else if (expr.op == _lexicon.truncatingDevide) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.multiplyLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.truncatingDevide);
  } else if (expr.op == _lexicon.modulo) {
    bytesBuilder.add(left);
    bytesBuilder.addByte(HTOpCode.register);
    bytesBuilder.addByte(HTRegIdx.multiplyLeft);
    bytesBuilder.add(right);
    bytesBuilder.addByte(HTOpCode.modulo);
  } else if (expr.op == _lexicon.kIn) {
    final containsCallExpr = CallExpr(
        MemberExpr(expr.right,
            IdentifierExpr(_lexicon.idCollectionContains, 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.idCollectionContains, isLocal: false)),
        positionalArgs: [expr.left]);
    final containsCallExprBytes = visitCallExpr(containsCallExpr);
    bytesBuilder.add(containsCallExprBytes);
    bytesBuilder.addByte(HTOpCode.logicalNot);
  }
  return bytesBuilder.toBytes();
}