generate method

dynamic generate([
  1. dynamic builder,
  2. dynamic output
])
override

Implementation

generate([builder, output]) {
  var op = this.op;

  var aNode = this.aNode;
  var bNode = this.bNode;

  var type = this.getNodeType(builder, output);

  var typeA = null;
  var typeB = null;

  if (type != 'void') {
    typeA = aNode.getNodeType(builder);
    typeB = bNode.getNodeType(builder);

    if (op == '=') {
      typeB = typeA;
    } else if (builder.isMatrix(typeA) && builder.isVector(typeB)) {
      // matrix x vector

      typeB = builder.getVectorFromMatrix(typeA);
    } else if (builder.isVector(typeA) && builder.isMatrix(typeB)) {
      // vector x matrix

      typeA = builder.getVectorFromMatrix(typeB);
    } else {
      // anytype x anytype

      typeA = typeB = type;
    }
  } else {
    typeA = typeB = type;
  }

  var a = aNode.build(builder, typeA);
  var b = bNode.build(builder, typeB);

  var outputLength = builder.getTypeLength(output);

  if (output != 'void') {
    if (op == '=') {
      builder.addFlowCode("${a} ${this.op} ${b}");

      return a;
    } else if (op == '>' && outputLength > 1) {
      return "${builder.getMethod('greaterThan')}( ${a}, ${b} )";
    } else if (op == '<=' && outputLength > 1) {
      return "${builder.getMethod('lessThanEqual')}( ${a}, ${b} )";
    } else {
      return "( ${a} ${this.op} ${b} )";
    }
  } else if (typeA != 'void') {
    return "${a} ${this.op} ${b}";
  }
}