private @NotNull ControlFlow doGetControlFlow(@NotNull PsiElement element,
                                                @NotNull ControlFlowPolicy policy,
                                                @NotNull ControlFlowOptions options) throws AnalysisCanceledException {
    if (!element.isPhysical()) {
      return new ControlFlowAnalyzer(element, policy, options).buildControlFlow();
    }
    final long modificationCount = element.getManager().getModificationTracker().getModificationCount();
    ConcurrentList<ControlFlowContext> cached = getOrCreateCachedFlowsForElement(element);
    for (ControlFlowContext context : cached) {
      if (context.isFor(policy, options, modificationCount)) return context.controlFlow;
    }
    ControlFlow controlFlow = new ControlFlowAnalyzer(element, policy, options).buildControlFlow();
    ControlFlowContext context = createContext(options, policy, controlFlow, modificationCount);
    cached.addIfAbsent(context);
    return controlFlow;
  }
private @NotNull ControlFlow doGetControlFlow(@NotNull PsiElement element,
                                                @NotNull ControlFlowPolicy policy,
                                                @NotNull ControlFlowOptions options)