public ExprCode doGenCode()

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