visitBinaryExpr method
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();
}