private @Nullable Object getDataFromProviderAndRulesInner(@NotNull String dataId,
                                                            @Nullable GetDataRuleType ruleType,
                                                            @Nullable Set<String> alreadyComputedIds,
                                                            @NotNull DataProvider provider) {
    ProgressManager.checkCanceled();
    if (alreadyComputedIds != null && alreadyComputedIds.contains(dataId)) {
      return null;
    }
    int[] depth = ourGetDataLevel.get();
    try {
      depth[0]++;
      Object data = getDataFromProviderInner(dataId, provider);
      if (data != null) {
        return data;
      }
      return ruleType == null ? null : getDataFromRulesInner(dataId, ruleType, alreadyComputedIds, provider);
    }
    finally {
      depth[0]--;
      if (alreadyComputedIds != null) alreadyComputedIds.remove(dataId);
    }
  }
private @Nullable Object getDataFromProviderAndRulesInner(@NotNull String dataId,
                                                            @Nullable GetDataRuleType ruleType,
                                                            @Nullable Set<String> alreadyComputedIds,
                                                            @NotNull DataProvider provider)