public ExprCode doGenCode()

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