in java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java [1053:1134]
public ExprCode doGenCode(CodegenContext ctx) {
StringBuilder codeBuilder = new StringBuilder();
ExprCode targetExprCode = targetObject.genCode(ctx);
if (StringUtils.isNotBlank(targetExprCode.code())) {
codeBuilder.append(targetExprCode.code());
codeBuilder.append("\n");
}
int len = arguments.length;
StringBuilder argsBuilder = new StringBuilder();
if (len > 0) {
for (int i = 0; i < len; i++) {
Expression argExpr = arguments[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());
}
}
if (!inlineCall && type != null && !PRIMITIVE_VOID_TYPE.equals(type)) {
Class<?> rawType = getRawType(type);
if (StringUtils.isBlank(returnNamePrefix)) {
returnNamePrefix = ctx.namePrefix(getRawType(type));
}
String[] freshNames = ctx.newNames(returnNamePrefix, returnNamePrefix + "IsNull");
String value = freshNames[0];
String isNull = freshNames[1];
if (returnNullable) {
codeBuilder.append(String.format("boolean %s = false;\n", isNull));
String callCode =
ExpressionUtils.callFunc(
ctx.type(type),
value,
targetExprCode.value().code(),
functionName,
argsBuilder.toString(),
needTryCatch);
codeBuilder.append(callCode).append('\n');
} else {
String callCode =
ExpressionUtils.callFunc(
ctx.type(type),
value,
targetExprCode.value().code(),
functionName,
argsBuilder.toString(),
needTryCatch);
codeBuilder.append(callCode);
}
if (returnNullable) {
String nullCode =
StringUtils.format(
"if (${value} == null) {\n" + " ${isNull} = true;\n" + "}",
"value",
value,
"isNull",
isNull);
codeBuilder.append(nullCode);
return new ExprCode(
codeBuilder.toString(), Code.isNullVariable(isNull), Code.variable(rawType, value));
} else {
return new ExprCode(codeBuilder.toString(), FalseLiteral, Code.variable(rawType, value));
}
} else if (inlineCall) {
CodeGenerator.stripIfHasLastNewline(codeBuilder);
String call =
ExpressionUtils.callFunc(
targetExprCode.value().code(), functionName, argsBuilder.toString(), needTryCatch);
call = call.substring(0, call.length() - 1);
return new ExprCode(codeBuilder.toString(), null, Code.variable(getRawType(type), call));
} else {
String call =
ExpressionUtils.callFunc(
targetExprCode.value().code(), functionName, argsBuilder.toString(), needTryCatch);
codeBuilder.append(call);
return new ExprCode(codeBuilder.toString(), null, null);
}
}