UsageNode appendOrGet(@NotNull Usage usage,
                        boolean filterDuplicateLines,
                        @NotNull Consumer<? super UsageViewImpl.NodeChange> edtModelToSwingNodeChangesQueue) {
    if (!isVisible(usage)) {
      myFilteredUsagesCount.incrementAndGet();
      return null;
    }

    GroupNode groupNode = myRoot;
    for (int i = 0; i < myGroupingRules.length; i++) {
      UsageGroupingRule rule = myGroupingRules[i];
      if (!DumbService.getInstance(myProject).isUsableInCurrentContext(rule)) continue;

      List<UsageGroup> groups = rule.getParentGroupsFor(usage, myTargets);
      for (UsageGroup group : groups) {
        groupNode = groupNode.addOrGetGroup(group, i, edtModelToSwingNodeChangesQueue);
      }
    }

    return groupNode.addOrGetUsage(usage, filterDuplicateLines, edtModelToSwingNodeChangesQueue);
  }
UsageNode appendOrGet(@NotNull Usage usage,
                        boolean filterDuplicateLines,
                        @NotNull Consumer<? super UsageViewImpl.NodeChange> edtModelToSwingNodeChangesQueue)