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