in java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java [1743:1881]
public ExprCode doGenCode(CodegenContext ctx) {
ExprCode condEval = predicate.genCode(ctx);
ExprCode trueEval = trueExpr.doGenCode(ctx);
StringBuilder codeBuilder = new StringBuilder();
if (StringUtils.isNotBlank(condEval.code())) {
codeBuilder.append(condEval.code()).append('\n');
}
String cond;
if (condEval.isNull() != null && !"false".equals(condEval.isNull().code())) {
// indicate condEval.isNull() is a variable. "false" is a java keyword, thus is not a
// variable
cond =
StringUtils.format(
"!${condEvalIsNull} && ${condEvalValue}",
"condEvalIsNull",
condEval.isNull(),
"condEvalValue",
condEval.value());
} else {
cond = StringUtils.format("${condEvalValue}", "condEvalValue", condEval.value());
}
TypeRef<?> type = this.type;
if (!PRIMITIVE_VOID_TYPE.equals(type.unwrap())) {
if (ExpressionUtils.isReturn(trueExpr) && ExpressionUtils.isReturn(falseExpr)) {
type = PRIMITIVE_VOID_TYPE;
}
}
if (!PRIMITIVE_VOID_TYPE.equals(type.unwrap())) {
ExprCode falseEval = falseExpr.doGenCode(ctx);
Preconditions.checkNotNull(trueEval.value());
Preconditions.checkNotNull(falseEval.value());
Class<?> rawType = getRawType(type);
String[] freshNames = ctx.newNames(rawType, "isNull");
String value = freshNames[0];
String isNull = freshNames[1];
codeBuilder.append(String.format("%s %s;\n", ctx.type(type), value));
String ifCode;
if (nullable) {
Preconditions.checkArgument(trueEval.isNull() != null || falseEval.isNull() != null);
codeBuilder.append(String.format("boolean %s = false;\n", isNull));
String trueEvalIsNull;
if (trueEval.isNull() == null) {
trueEvalIsNull = "false";
} else {
trueEvalIsNull = trueEval.isNull().code();
}
String falseEvalIsNull;
if (falseEval.isNull() == null) {
falseEvalIsNull = "false";
} else {
falseEvalIsNull = falseEval.isNull().code();
}
ifCode =
StringUtils.format(
""
+ "if (${cond}) {\n"
+ " ${trueEvalCode}\n"
+ " ${isNull} = ${trueEvalIsNull};\n"
+ " ${value} = ${trueEvalValue};\n"
+ "} else {\n"
+ " ${falseEvalCode}\n"
+ " ${isNull} = ${falseEvalIsNull};\n"
+ " ${value} = ${falseEvalValue};\n"
+ "}",
"isNull",
isNull,
"value",
value,
"cond",
cond,
"trueEvalCode",
alignIndent(trueEval.code()),
"trueEvalIsNull",
trueEvalIsNull,
"trueEvalValue",
trueEval.value(),
"falseEvalCode",
alignIndent(falseEval.code()),
"falseEvalIsNull",
falseEvalIsNull,
"falseEvalValue",
falseEval.value());
} else {
ifCode =
StringUtils.format(
""
+ "if (${cond}) {\n"
+ " ${trueEvalCode}\n"
+ " ${value} = ${trueEvalValue};\n"
+ "} else {\n"
+ " ${falseEvalCode}\n"
+ " ${value} = ${falseEvalValue};\n"
+ "}",
"cond",
cond,
"value",
value,
"trueEvalCode",
alignIndent(trueEval.code()),
"trueEvalValue",
trueEval.value(),
"falseEvalCode",
alignIndent(falseEval.code()),
"falseEvalValue",
falseEval.value());
}
codeBuilder.append(StringUtils.stripBlankLines(ifCode));
return new ExprCode(
codeBuilder.toString(), Code.isNullVariable(isNull), Code.variable(rawType, value));
} else {
String ifCode;
if (falseExpr != null) {
ExprCode falseEval = falseExpr.doGenCode(ctx);
ifCode =
StringUtils.format(
"if (${cond}) {\n"
+ " ${trueEvalCode}\n"
+ "} else {\n"
+ " ${falseEvalCode}\n"
+ "}",
"cond",
cond,
"trueEvalCode",
alignIndent(trueEval.code()),
"falseEvalCode",
alignIndent(falseEval.code()));
} else {
ifCode =
StringUtils.format(
"if (${cond}) {\n" + " ${trueEvalCode}\n" + "}",
"cond",
cond,
"trueEvalCode",
alignIndent(trueEval.code()));
}
codeBuilder.append(ifCode);
return new ExprCode(codeBuilder.toString());
}
}