public static List<BreakpointPanelProvider> collectPanelProviders() {
   List<BreakpointPanelProvider> panelProviders = new ArrayList<>();
   for (DebuggerSupport debuggerSupport : DebuggerSupport.getDebuggerSupports()) {
     panelProviders.add(debuggerSupport.getBreakpointPanelProvider());
   }
   Collections.sort(panelProviders, (o1, o2) -> o2.getPriority() - o1.getPriority());
   return panelProviders;
 }
 @Nullable
 public static DebuggerSupport getDebuggerSupport(Project project, BreakpointItem breakpointItem) {
   DebuggerSupport[] debuggerSupports = DebuggerSupport.getDebuggerSupports();
   List<BreakpointItem> items = new ArrayList<>();
   for (DebuggerSupport support : debuggerSupports) {
     support.getBreakpointPanelProvider().provideBreakpointItems(project, items);
     if (items.contains(breakpointItem)) {
       return support;
     }
     items.clear();
   }
   return null;
 }
  @NotNull
  public static Pair<GutterIconRenderer, Object> findSelectedBreakpoint(
      @NotNull final Project project, @NotNull final Editor editor) {
    int offset = editor.getCaretModel().getOffset();
    Document editorDocument = editor.getDocument();

    DebuggerSupport[] debuggerSupports = DebuggerSupport.getDebuggerSupports();
    for (DebuggerSupport debuggerSupport : debuggerSupports) {
      final BreakpointPanelProvider<?> provider = debuggerSupport.getBreakpointPanelProvider();

      final int textLength = editor.getDocument().getTextLength();
      if (offset > textLength) {
        offset = textLength;
      }

      Object breakpoint = provider.findBreakpoint(project, editorDocument, offset);
      if (breakpoint != null) {
        final GutterIconRenderer iconRenderer =
            provider.getBreakpointGutterIconRenderer(breakpoint);
        return Pair.create(iconRenderer, breakpoint);
      }
    }
    return Pair.create(null, null);
  }