public ExprCode doGenCode()

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


    public ExprCode doGenCode(CodegenContext ctx) {
      StringBuilder codeBuilder = new StringBuilder();
      Class<?> rawType = getRawType(type);
      String arrayType = getArrayType(rawType);
      String value = ctx.newName("arr");
      if (dims != null) {
        // multi-dimension array
        ExprCode dimsExprCode = dims.genCode(ctx);
        if (StringUtils.isNotBlank(dimsExprCode.code())) {
          codeBuilder.append(dimsExprCode.code()).append('\n');
        }
        // "${arrType} ${value} = new ${elementType}[$?][$?]...
        codeBuilder
            .append(arrayType)
            .append(' ')
            .append(value)
            .append(" = new ")
            .append(ctx.type(elemType));
        for (int i = 0; i < numDimensions; i++) {
          // dims is dimensions array, which store size of per dim.
          String idim = StringUtils.format("${dims}[${i}]", "dims", dimsExprCode.value(), "i", i);
          codeBuilder.append('[').append(idim).append("]");
        }
        codeBuilder.append(';');
      } else if (dim != null) {
        ExprCode dimExprCode = dim.genCode(ctx);
        if (StringUtils.isNotBlank(dimExprCode.code())) {
          codeBuilder.append(dimExprCode.code()).append('\n');
        }
        if (numDimensions > 1) {
          // multi-dimension array
          // "${arrType} ${value} = new ${elementType}[$?][][][]...
          codeBuilder
              .append(arrayType)
              .append(' ')
              .append(value)
              .append(" = new ")
              .append(ctx.type(elemType));
          codeBuilder.append('[').append(dimExprCode.value()).append(']');
          for (int i = 1; i < numDimensions; i++) {
            codeBuilder.append('[').append("]");
          }
          codeBuilder.append(';');
        } else {
          // one-dimension array
          String code =
              StringUtils.format(
                  "${type} ${value} = new ${elemType}[${dim}];",
                  "type",
                  arrayType,
                  "elemType",
                  ctx.type(elemType),
                  "value",
                  value,
                  "dim",
                  dimExprCode.value());
          codeBuilder.append(code);
        }
      } else {
        // create array with init value
        int len = elements.length;
        StringBuilder argsBuilder = new StringBuilder();
        if (len > 0) {
          for (int i = 0; i < len; i++) {
            Expression argExpr = elements[i];
            ExprCode argExprCode = argExpr.genCode(ctx);
            if (StringUtils.isNotBlank(argExprCode.code())) {
              codeBuilder.append(argExprCode.code()).append("\n");
            }
            if (i != 0) {
              argsBuilder.append(", ");
            }
            argsBuilder.append(argExprCode.value());
          }
        }

        String code =
            StringUtils.format(
                "${type} ${value} = new ${type} {${args}};",
                "type",
                arrayType,
                "value",
                value,
                "args",
                argsBuilder.toString());
        codeBuilder.append(code);
      }

      return new ExprCode(codeBuilder.toString(), null, Code.variable(rawType, value));
    }