@Override
    public void buildChildren(Value value, ChildrenBuilder builder, EvaluationContext evaluationContext) {
      DebuggerManagerThreadImpl.assertIsManagerThread();
      NodeManagerImpl nodeManager = (NodeManagerImpl)builder.getNodeManager();
      NodeDescriptorFactory descriptorFactory = builder.getDescriptorManager();

      builder.setMessage(JavaDebuggerBundle.message("message.node.filtered") + " " + myExpression.getExpression(),
                         AllIcons.General.Filter,
                         SimpleTextAttributes.REGULAR_ATTRIBUTES,
                         FILTER_HYPERLINK);

      if (ENTRIES_LIMIT <= 0) {
        ENTRIES_LIMIT = 1;
      }

      ArrayReference array = (ArrayReference)value;
      int arrayLength = array.length();
      if (arrayLength > 0) {
        builder.initChildrenArrayRenderer(this, arrayLength);

        CachedEvaluator cachedEvaluator = new CachedEvaluator() {
          @Override
          protected String getClassName() {
            return ((ArrayType)array.type()).componentTypeName();
          }

          @Override
          protected PsiElement overrideContext(PsiElement context) {
            return ContextUtil.getContextElement(evaluationContext);
          }
        };
        cachedEvaluator.setReferenceExpression(TextWithImportsImpl.fromXExpression(myExpression));

        try {
          int added = 0;
          if (arrayLength - 1 >= START_INDEX) {

            ErrorsValueGroup errorsGroup = null;
            ArrayValuesCache arrayValuesCache = new ArrayValuesCache(array);
            for (int idx = START_INDEX; idx < arrayLength; idx++) {
              ArrayElementDescriptorImpl descriptor =
                (ArrayElementDescriptorImpl)descriptorFactory.getArrayItemDescriptor(builder.getParentDescriptor(), array, idx);
              Value val = arrayValuesCache.getValue(idx);
              descriptor.setValue(val);
              try {
                if (DebuggerUtilsEx.evaluateBoolean(cachedEvaluator.getEvaluator(evaluationContext.getProject()),
                                                    (EvaluationContextImpl)evaluationContext.createEvaluationContext(val))) {

                  DebuggerTreeNode arrayItemNode = nodeManager.createNode(descriptor, evaluationContext);
                  builder.addChildren(Collections.singletonList(arrayItemNode), false);
                  added++;
                  //if (added > ENTRIES_LIMIT) {
                  //  break;
                  //}
                }
              }
              catch (EvaluateException e) {
                if (errorsGroup == null) {
                  errorsGroup = new ErrorsValueGroup();
                  builder.addChildren(XValueChildrenList.bottomGroup(errorsGroup), false);
                }
                JavaValue childValue = JavaValue.create(null, descriptor, ((EvaluationContextImpl)evaluationContext), nodeManager, false);
                errorsGroup.addErrorValue(e.getMessage(), childValue);
              }
            }
          }

          builder.addChildren(Collections.emptyList(), true);
        }
        catch (ObjectCollectedException e) {
          builder.setErrorMessage(JavaDebuggerBundle.message("evaluation.error.array.collected"));
        }

        //if (added != 0 && END_INDEX < arrayLength - 1) {
        //  builder.setRemaining(arrayLength - 1 - END_INDEX);
        //}
      }
    }
@Override
    public void buildChildren(Value value, ChildrenBuilder builder, EvaluationContext evaluationContext)