public ExprCode doGenCode()

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


    public ExprCode doGenCode(CodegenContext ctx) {
      StringBuilder codeBuilder = new StringBuilder();
      ExprCode targetExprCode = inputObject.genCode(ctx);
      if (StringUtils.isNotBlank(targetExprCode.code())) {
        codeBuilder.append(targetExprCode.code()).append("\n");
      }
      String i = ctx.newName("i");
      String elemValue = ctx.newName("elemValue");
      Expression elementExpr =
          action.apply(new Reference(i), new Reference(elemValue, elementType, false));
      ExprCode elementExprCode = elementExpr.genCode(ctx);

      if (inputObject.type().isArray()) {
        String code =
            StringUtils.format(
                ""
                    + "int ${len} = ${arr}.length;\n"
                    + "int ${i} = 0;\n"
                    + "while (${i} < ${len}) {\n"
                    + "    ${elemType} ${elemValue} = ${arr}[${i}];\n"
                    + "    ${elementExprCode}\n"
                    + "    ${i}++;\n"
                    + "}",
                "arr",
                targetExprCode.value(),
                "len",
                ctx.newName("len"),
                "i",
                i,
                "elemType",
                ctx.type(elementType),
                "elemValue",
                elemValue,
                "i",
                i,
                "elementExprCode",
                alignIndent(elementExprCode.code()));
        codeBuilder.append(code);
        return new ExprCode(codeBuilder.toString(), null, null);
      } else {
        // don't use forloop for List, because it may be LinkedList.
        Preconditions.checkArgument(
            ITERABLE_TYPE.isSupertypeOf(inputObject.type()),
            "Unsupported type " + inputObject.type());
        String elemTypeCast = "";
        if (getRawType(elementType) != Object.class) {
          // elementType may be unresolved generic`E`
          elemTypeCast = "(" + ctx.type(elementType) + ")";
        }
        String code =
            StringUtils.format(
                ""
                    + "java.util.Iterator ${iter} = ${input}.iterator();\n"
                    + "int ${i} = 0;\n"
                    + "while (${iter}.hasNext()) {\n"
                    + "    ${elemType} ${elemValue} = ${elemTypeCast}${iter}.next();\n"
                    + "    ${elementExprCode}\n"
                    + "    ${i}++;\n"
                    + "}",
                "iter",
                ctx.newName("iter"),
                "i",
                i,
                "input",
                targetExprCode.value().code(),
                "elemType",
                ctx.type(elementType),
                "elemTypeCast",
                elemTypeCast,
                "elemValue",
                elemValue,
                "elementExprCode",
                alignIndent(elementExprCode.code()));
        codeBuilder.append(code);
        return new ExprCode(codeBuilder.toString(), null, null);
      }
    }