public Expression buildEncodeExpression()

in java/fury-core/src/main/java/org/apache/fury/builder/CompatibleCodecBuilder.java [172:337]


  public Expression buildEncodeExpression() {
    Reference inputObject = new Reference(ROOT_OBJECT_NAME, OBJECT_TYPE, false);
    Reference buffer = new Reference(BUFFER_NAME, bufferTypeRef, false);

    ListExpression expressions = new ListExpression();
    Expression bean = tryCastIfPublic(inputObject, beanType, ctx.newName(beanClass));
    expressions.add(bean);
    groupFields(fieldResolver.getEmbedTypes4Fields(), 9)
        .forEach(
            group -> {
              Expression invokeGeneratedWrite =
                  ExpressionOptimizer.invokeGenerated(
                      ctx,
                      () -> {
                        ListExpression groupExpressions = new ListExpression();
                        for (FieldInfo fieldInfo : group) {
                          groupExpressions.add(
                              new Invoke(
                                  buffer,
                                  "writeInt32",
                                  new Literal(
                                      (int) fieldInfo.getEncodedFieldInfo(), PRIMITIVE_INT_TYPE)));
                          groupExpressions.add(writeEmbedTypeFieldValue(bean, buffer, fieldInfo));
                        }
                        return groupExpressions;
                      },
                      "writeEmbedTypes4Fields");
              expressions.add(invokeGeneratedWrite);
            });
    groupFields(fieldResolver.getEmbedTypes9Fields(), 9)
        .forEach(
            group -> {
              Expression invokeGeneratedWrite =
                  ExpressionOptimizer.invokeGenerated(
                      ctx,
                      () -> {
                        ListExpression groupExpressions = new ListExpression();
                        for (FieldInfo fieldInfo : group) {
                          groupExpressions.add(
                              new Invoke(
                                  buffer,
                                  "writeInt64",
                                  new Literal(
                                      fieldInfo.getEncodedFieldInfo(), PRIMITIVE_LONG_TYPE)));
                          groupExpressions.add(writeEmbedTypeFieldValue(bean, buffer, fieldInfo));
                        }
                        return groupExpressions;
                      },
                      "writeEmbedTypes9Fields");
              expressions.add(invokeGeneratedWrite);
            });
    groupFields(fieldResolver.getEmbedTypesHashFields(), 9)
        .forEach(
            group -> {
              Expression invokeGeneratedWrite =
                  ExpressionOptimizer.invokeGenerated(
                      ctx,
                      () -> {
                        ListExpression groupExpressions = new ListExpression();
                        for (FieldInfo fieldInfo : group) {
                          groupExpressions.add(
                              new Invoke(
                                  buffer,
                                  "writeInt64",
                                  new Literal(
                                      fieldInfo.getEncodedFieldInfo(), PRIMITIVE_LONG_TYPE)));
                          groupExpressions.add(writeEmbedTypeFieldValue(bean, buffer, fieldInfo));
                        }
                        return groupExpressions;
                      },
                      "writeEmbedTypesHashFields");
              expressions.add(invokeGeneratedWrite);
            });
    groupFields(fieldResolver.getSeparateTypesHashFields(), 9)
        .forEach(
            group -> {
              Expression invokeGeneratedWrite =
                  ExpressionOptimizer.invokeGenerated(
                      ctx,
                      () -> {
                        ListExpression groupExpressions = new ListExpression();
                        for (FieldInfo fieldInfo : group) {
                          groupExpressions.add(
                              new Invoke(
                                  buffer,
                                  "writeInt64",
                                  new Literal(
                                      fieldInfo.getEncodedFieldInfo(), PRIMITIVE_LONG_TYPE)));
                          Descriptor descriptor = createDescriptor(fieldInfo);
                          walkPath.add(descriptor.getDeclaringClass() + descriptor.getName());
                          byte fieldType = fieldInfo.getFieldType();
                          Expression writeFieldAction =
                              invokeGenerated(
                                  ctx,
                                  () -> {
                                    Expression fieldValue = getFieldValue(bean, descriptor);
                                    ListExpression writeFieldValue =
                                        new ListExpression(
                                            new Invoke(
                                                buffer,
                                                "writeByte",
                                                new Literal(fieldType, PRIMITIVE_BYTE_TYPE)));
                                    if (fieldType == FieldTypes.OBJECT) {
                                      writeFieldValue.add(
                                          writeForNotNullNonFinalObject(
                                              fieldValue, buffer, descriptor.getTypeRef()));
                                    } else {
                                      if (fieldType == FieldTypes.COLLECTION_ELEMENT_FINAL) {
                                        CollectionFieldInfo collectionFieldInfo =
                                            (CollectionFieldInfo) fieldInfo;
                                        writeFieldValue.add(
                                            writeFinalClassInfo(
                                                buffer, collectionFieldInfo.getElementType()));
                                      } else if (fieldType == FieldTypes.MAP_KV_FINAL) {
                                        MapFieldInfo mapFieldInfo = (MapFieldInfo) fieldInfo;
                                        Expression keyClassInfo =
                                            getFinalClassInfo(mapFieldInfo.getKeyType());
                                        Expression valueClassInfo =
                                            getFinalClassInfo(mapFieldInfo.getValueType());
                                        writeFieldValue.add(
                                            keyClassInfo,
                                            valueClassInfo,
                                            writeFinalClassInfo(buffer, mapFieldInfo.getKeyType()),
                                            writeFinalClassInfo(
                                                buffer, mapFieldInfo.getValueType()));
                                      } else if (fieldType == FieldTypes.MAP_KEY_FINAL) {
                                        MapFieldInfo mapFieldInfo = (MapFieldInfo) fieldInfo;
                                        writeFieldValue.add(
                                            writeFinalClassInfo(buffer, mapFieldInfo.getKeyType()));
                                      } else {
                                        Preconditions.checkArgument(
                                            fieldType == FieldTypes.MAP_VALUE_FINAL, fieldInfo);
                                        MapFieldInfo mapFieldInfo = (MapFieldInfo) fieldInfo;
                                        writeFieldValue.add(
                                            writeFinalClassInfo(
                                                buffer, mapFieldInfo.getValueType()));
                                      }
                                      Class<?> clz = descriptor.getRawType();
                                      if (ReflectionUtils.isMonomorphic(clz)) {
                                        // serializeForNotNull won't write field type if it's final,
                                        // but the type is useful if peer doesn't have this field.
                                        writeFieldValue.add(writeFinalClassInfo(buffer, clz));
                                      }
                                      writeFieldValue.add(
                                          serializeForNotNull(
                                              fieldValue, buffer, descriptor.getTypeRef()));
                                    }
                                    return new If(
                                        ExpressionUtils.not(writeRefOrNull(buffer, fieldValue)),
                                        writeFieldValue);
                                  },
                                  "writeField",
                                  fieldInfo.getEncodedFieldInfo());
                          walkPath.removeLast();
                          groupExpressions.add(writeFieldAction);
                        }
                        return groupExpressions;
                      },
                      "writeSeparateTypesHashFields");
              expressions.add(invokeGeneratedWrite);
            });
    expressions.add(
        new Invoke(
            buffer, "writeInt64", new Literal(fieldResolver.getEndTag(), PRIMITIVE_LONG_TYPE)));
    return expressions;
  }