@Override
  public @Nullable Object getData(@NotNull String dataId) {
    //noinspection DuplicatedCode
    if (PlatformCoreDataKeys.CONTEXT_COMPONENT.is(dataId)) return dereference(myComponentRef.ref);
    if (PlatformCoreDataKeys.IS_MODAL_CONTEXT.is(dataId)) return myComponentRef.modalContext;
    if (PlatformDataKeys.MODALITY_STATE.is(dataId)) return myComponentRef.modalityState;
    if (PlatformDataKeys.SPEED_SEARCH_TEXT.is(dataId) && myComponentRef.speedSearchText != null) return myComponentRef.speedSearchText;
    if (PlatformDataKeys.SPEED_SEARCH_COMPONENT.is(dataId) && myComponentRef.speedSearchRef != null) return myComponentRef.speedSearchRef.get();
    if (myCachedData.isEmpty()) return null;

    boolean isEDT = EDT.isCurrentThreadEdt();
    if (isEDT && ourIsCapturingSnapshot) {
      reportGetDataInsideCapturingSnapshot();
    }
    boolean noRulesSection = isEDT && ActionUpdater.Companion.isNoRulesInEDTSection();
    boolean rulesSuppressed = isEDT && LoadingState.COMPONENTS_LOADED.isOccurred() && Registry.is("actionSystem.update.actions.suppress.dataRules.on.edt");
    boolean rulesAllowed = !CommonDataKeys.PROJECT.is(dataId) && !rulesSuppressed && !noRulesSection;
    Object answer = getDataInner(dataId, rulesAllowed, !noRulesSection);

    int keyIndex; // for use with `nullsByContextRules` only, always != -1
    ProviderData map = myCachedData.get(0);
    if (answer == null && rulesAllowed && !map.nullsByContextRules.get(keyIndex = ourDataKeysIndices.getOrDefault(dataId, -1))) {
      answer = myDataManager.getDataFromRules(dataId, GetDataRuleType.CONTEXT, id -> {
        return getDataInner(id, !CommonDataKeys.PROJECT.is(id), true);
      });
      if (answer != null) {
        map.computedData.put(dataId, answer);
        map.nullsByRules.clear(keyIndex);
        reportValueProvidedByRules(dataId);
      }
      else {
        map.nullsByContextRules.set(keyIndex);
      }
    }
    if (answer == null && rulesSuppressed) {
      Throwable throwable = new Throwable();
      AppExecutorUtil.getAppExecutorService().execute(() -> {
        if (ReadAction.compute(() -> getData(dataId)) != null) {
          LOG.warn(dataId + " is not available on EDT. " +
                   "Code that depends on data rules and slow data providers must be run in background. " +
                   "For example, an action must use `ActionUpdateThread.BGT`.", throwable);
        }
      });
    }
    answer = wrapUnsafeData(answer);
    return answer == EXPLICIT_NULL ? null : answer;
  }
@Override
  public @Nullable Object getData(@NotNull String dataId)