@Override
  public void buildChildren(final Value value, final ChildrenBuilder builder, final EvaluationContext evaluationContext) {
    DebuggerManagerThreadImpl.assertIsManagerThread();
    final ValueDescriptorImpl parentDescriptor = (ValueDescriptorImpl)builder.getParentDescriptor();
    final NodeManager nodeManager = builder.getNodeManager();
    final NodeDescriptorFactory nodeDescriptorFactory = builder.getDescriptorManager();

    if (!(value instanceof ObjectReference objRef)) {
      builder.setChildren(Collections.emptyList());
      return;
    }

    final ReferenceType refType = objRef.referenceType();
    // default ObjectReference processing
    DebuggerUtilsAsync.allFields(refType)
      .thenAccept(fields -> {
          if (fields.isEmpty()) {
            builder.setChildren(Collections.singletonList(nodeManager.createMessageNode(MessageDescriptor.CLASS_HAS_NO_FIELDS.getLabel())));
            return;
          }

          createNodesToShow(fields, evaluationContext, parentDescriptor, nodeManager, nodeDescriptorFactory, objRef)
            .thenAccept(nodesToShow -> {
              if (nodesToShow.isEmpty()) {
                setClassHasNoFieldsToDisplayMessage(builder, nodeManager);
                return;
              }

              builder.setChildren(nodesToShow);
            }
          );
      }
    );
  }
@Override
  public void buildChildren(final Value value, final ChildrenBuilder builder, final EvaluationContext evaluationContext)