public ExprCode doGenCode()

in java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java [2396:2503]


    public ExprCode doGenCode(CodegenContext ctx) {
      StringBuilder codeBuilder = new StringBuilder();
      ExprCode leftExprCode = left.genCode(ctx);
      ExprCode rightExprCode = right.genCode(ctx);
      Stream.of(leftExprCode, rightExprCode)
          .forEach(
              exprCode -> {
                if (StringUtils.isNotBlank(exprCode.code())) {
                  codeBuilder.append(exprCode.code()).append('\n');
                }
              });
      String i = ctx.newName("i");
      String leftElemValue = ctx.newName("leftElemValue");
      String rightElemValue = ctx.newName("rightElemValue");
      TypeRef<?> leftElemType;
      if (left.type().isArray()) {
        leftElemType = left.type().getComponentType();
      } else {
        leftElemType = getElementType(left.type());
      }
      leftElemType = ReflectionUtils.getPublicSuperType(leftElemType);
      TypeRef<?> rightElemType;
      if (right.type().isArray()) {
        rightElemType = right.type().getComponentType();
      } else {
        rightElemType = getElementType(right.type());
      }
      rightElemType = ReflectionUtils.getPublicSuperType(rightElemType);
      Expression elemExpr =
          action.apply(
              new Reference(i),
              new Reference(leftElemValue, leftElemType, true),
              // elemValue nullability check use isNullAt inside action, so elemValueRef'nullable is
              // false.
              new Reference(rightElemValue, rightElemType, false));
      ExprCode elementExprCode = elemExpr.genCode(ctx);

      if (left.type().isArray()) {
        String code =
            StringUtils.format(
                ""
                    + "int ${len} = ${leftArr}.length;\n"
                    + "int ${i} = 0;\n"
                    + "while (${i} < ${len}) {\n"
                    + "    ${leftElemType} ${leftElemValue} = ${leftArr}[${i}];\n"
                    + "    ${rightElemType} ${rightElemValue} = ${rightArr}[${i}];\n"
                    + "    ${elementExprCode}\n"
                    + "    ${i}++;\n"
                    + "}",
                "leftArr",
                leftExprCode.value(),
                "len",
                ctx.newName("len"),
                "i",
                i,
                "leftElemType",
                ctx.type(leftElemType),
                "leftElemValue",
                leftElemValue,
                "rightElemType",
                ctx.type(rightElemType),
                "rightElemValue",
                rightElemValue,
                "rightArr",
                rightExprCode.value(),
                "elementExprCode",
                alignIndent(elementExprCode.code()));
        codeBuilder.append(code);
        return new ExprCode(codeBuilder.toString(), null, null);
      } else {
        // CHECKSTYLE.OFF:LineLength
        String code =
            StringUtils.format(
                ""
                    + "java.util.Iterator ${leftIter} = ${leftInput}.iterator();\n"
                    + "java.util.Iterator ${rightIter} = ${rightInput}.iterator();\n"
                    + "int ${i} = 0;\n"
                    + "while (${leftIter}.hasNext() && ${rightIter}.hasNext()) {\n"
                    + "    ${leftElemType} ${leftElemValue} = (${leftElemType})${leftIter}.next();\n"
                    + "    ${rightElemType} ${rightElemValue} = (${rightElemType})${rightIter}.next();\n"
                    + "    ${elementExprCode}\n"
                    + "    ${i}++;\n"
                    + "}",
                "leftIter",
                // CHECKSTYLE.ON:LineLength
                ctx.newName("leftIter"),
                "leftInput",
                leftExprCode.value(),
                "rightIter",
                ctx.newName("rightIter"),
                "rightInput",
                rightExprCode.value(),
                "i",
                i,
                "leftElemType",
                ctx.type(leftElemType),
                "leftElemValue",
                leftElemValue,
                "rightElemType",
                ctx.type(rightElemType),
                "rightElemValue",
                rightElemValue,
                "elementExprCode",
                alignIndent(elementExprCode.code()));
        codeBuilder.append(code);
        return new ExprCode(codeBuilder.toString(), null, null);
      }
    }