private void performHintsUpdate(boolean firstTime, boolean isInBulkMode) {
    for (int infoIndex = 0; infoIndex < myUpdateList.size(); infoIndex++) {
      InlayUpdateInfo info = myUpdateList.get(infoIndex);
      String oldText = info.oldText;
      String newText = info.newText;

      InlayUpdateInfo.Action action = info.action();
      if (action == InlayUpdateInfo.Action.ADD) {
        boolean useAnimation = !myForceImmediateUpdate && !firstTime && !isSameHintRemovedNear(newText, infoIndex) && !isInBulkMode;
        Inlay<?> inlay = myHintsManager.addHint(myEditor, info.offset, info.relatesToPrecedingText, newText, info.widthAdjustment, useAnimation);
        if (inlay != null && !isInBulkMode) {
          VisualPosition inlayPosition = inlay.getVisualPosition();
          VisualPosition visualPosition = new VisualPosition(inlayPosition.line,
                                                             inlayPosition.column + (info.relatesToPrecedingText ? 1 : 0));
          Caret caret = myEditor.getCaretModel().getCaretAt(visualPosition);
          if (caret != null) caret.moveToVisualPosition(new VisualPosition(inlayPosition.line,
                                                                           inlayPosition.column + (info.relatesToPrecedingText ? 0 : 1)));
        }
      }
      else if (action == InlayUpdateInfo.Action.DELETE) {
        boolean useAnimation = !myForceImmediateUpdate && oldText != null && !isSameHintAddedNear(oldText, infoIndex) && !isInBulkMode;
        myHintsManager.deleteHint(myEditor, info.inlay, useAnimation);
      }
      else if (action == InlayUpdateInfo.Action.REPLACE) {
        myHintsManager.replaceHint(myEditor, info.inlay, newText, info.widthAdjustment, !myForceImmediateUpdate);
      }
    }
  }
private void performHintsUpdate(boolean firstTime, boolean isInBulkMode)