@NotNull
  private static DataflowResult runDFA(@Nullable PsiElement block) {
    if (block == null) return new DataflowResult(RunnerResult.NOT_APPLICABLE);
    var listener = new CommonDataflowListener();
    var runner = new StandardDataFlowRunner(block.getProject(), ThreeState.UNSURE) {
      @Override
      protected @NotNull StandardDataFlowInterpreter createInterpreter(@NotNull DfaListener listener, @NotNull ControlFlow flow) {
        return new ReachabilityCountingInterpreter(flow, listener, false, true, 0);
      }

      @Override
      protected void afterInterpretation(@NotNull ControlFlow flow,
                                         @NotNull StandardDataFlowInterpreter interpreter,
                                         @NotNull RunnerResult result) {
        if (result == RunnerResult.OK) {
          Set<PsiElement> unreachable = ((ReachabilityCountingInterpreter)interpreter).getUnreachable();
          listener.myResult.myUnreachable.addAll(DataFlowIRProvider.computeUnreachableSegments(block, unreachable));
        }
        super.afterInterpretation(flow, interpreter, result);
      }
    };
    RunnerResult result = runner.analyzeMethodRecursively(block, listener);
    if (result != RunnerResult.OK) return new DataflowResult(result);
    if (!(block instanceof PsiClass psiClass)) return listener.myResult;
    DataflowResult dfr = listener.myResult.copy();
    List<DfaMemoryState> states = listener.myEndOfInitializerStates;
    for (PsiMethod method : psiClass.getConstructors()) {
      List<DfaMemoryState> initialStates;
      PsiCodeBlock body = method.getBody();
      if (body == null) continue;
      PsiMethodCallExpression call = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor(method);
      if (JavaPsiConstructorUtil.isChainedConstructorCall(call) || (call == null && hasImplicitImpureSuperCall(psiClass, method))) {
        initialStates = Collections.singletonList(runner.createMemoryState());
      } else {
        initialStates = ContainerUtil.map(states, DfaMemoryState::createCopy);
      }
      if (runner.analyzeBlockRecursively(body, initialStates, listener) == RunnerResult.OK) {
        dfr = listener.myResult.copy();
      } else {
        listener.myResult = dfr;
      }
    }
    return dfr;
  }
@NotNull
  private static DataflowResult runDFA(@Nullable PsiElement block)