public ExprCode doGenCode()

in java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java [395:459]


    public ExprCode doGenCode(CodegenContext ctx) {
      Class<?> javaType = getRawType(type);
      if (isPrimitive(javaType)) {
        javaType = boxedType(javaType);
      }
      if (value == null) {
        LiteralValue defaultLiteral = new LiteralValue(javaType, defaultValue(javaType));
        return new ExprCode(null, TrueLiteral, defaultLiteral);
      } else {
        if (javaType == String.class) {
          return new ExprCode(FalseLiteral, new LiteralValue("\"" + value + "\""));
        } else if (javaType == Boolean.class || javaType == Integer.class) {
          return new ExprCode(null, FalseLiteral, new LiteralValue(javaType, value.toString()));
        } else if (javaType == Float.class) {
          Float f = (Float) value;
          if (f.isNaN()) {
            return new ExprCode(FalseLiteral, new LiteralValue(javaType, "Float.NaN"));
          } else if (f.equals(Float.POSITIVE_INFINITY)) {
            return new ExprCode(
                FalseLiteral, new LiteralValue(javaType, "Float.POSITIVE_INFINITY"));
          } else if (f.equals(Float.NEGATIVE_INFINITY)) {
            return new ExprCode(
                FalseLiteral, new LiteralValue(javaType, "Float.NEGATIVE_INFINITY"));
          } else {
            return new ExprCode(FalseLiteral, new LiteralValue(javaType, String.format("%fF", f)));
          }
        } else if (javaType == Double.class) {
          Double d = (Double) value;
          if (d.isNaN()) {
            return new ExprCode(FalseLiteral, new LiteralValue(javaType, "Double.NaN"));
          } else if (d.equals(Double.POSITIVE_INFINITY)) {
            return new ExprCode(
                FalseLiteral, new LiteralValue(javaType, "Double.POSITIVE_INFINITY"));
          } else if (d.equals(Double.NEGATIVE_INFINITY)) {
            return new ExprCode(
                FalseLiteral, new LiteralValue(javaType, "Double.NEGATIVE_INFINITY"));
          } else {
            return new ExprCode(FalseLiteral, new LiteralValue(javaType, String.format("%fD", d)));
          }
        } else if (javaType == Byte.class) {
          return new ExprCode(
              FalseLiteral, Code.exprValue(javaType, String.format("(%s)%s", "byte", value)));
        } else if (javaType == Short.class) {
          return new ExprCode(
              FalseLiteral, Code.exprValue(javaType, String.format("(%s)%s", "short", value)));
        } else if (javaType == Long.class) {
          return new ExprCode(
              FalseLiteral,
              new LiteralValue(javaType, String.format("%dL", ((Number) (value)).longValue())));
        } else if (isPrimitive(javaType)) {
          return new ExprCode(FalseLiteral, new LiteralValue(javaType, String.valueOf(value)));
        } else if (javaType == Class.class) {
          String v;
          Class<?> valueClass = (Class<?>) value;
          if (valueClass.isArray()) {
            v = String.format("%s.class", TypeUtils.getArrayClass((Class<?>) value));
          } else {
            v = String.format("%s.class", ((Class<?>) (value)).getName());
          }
          return new ExprCode(FalseLiteral, new LiteralValue(javaType, v));
        } else {
          throw new UnsupportedOperationException("Unsupported type " + javaType);
        }
      }
    }