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));
}