// A graph showing the hierarchy of ClassLoaders and DelegatingClassLoader.Loaders within StudioModuleClassLoader
digraph {
  compound=true;
  node [shape=box, margin=0.2];

  "ClassLoader of android plugin" [style="filled"];
  LayoutlibClassLoader [style="filled"];
  FilteringClassLoader [style="filled"];
  FirewalledResourcesClassLoader [style="filled"];

  ClassLoaderLoaderParent [style="filled", color="lightblue", label="ClassLoaderLoader"];

  UrlClassLoader [style="filled", color="lightpink"];
  ClassLoaderLoaderJar [style="filled", color="lightblue", label="ClassLoaderLoader"];
  NameRemapperLoader [style="filled", color="lightblue"];

  FakeSavedStateRegistryLoader [style="filled", color="lightblue"];

  PseudoClassLocatorForLoaderNonProject [style="filled", color="lightgreen", label="PseudoClassLocatorForLoader"];

  AsmTransformingLoaderNonProject [style="filled", color="lightblue", label="AsmTransformingLoader"];
  ListeningLoaderNonProject1 [style="filled", color="lightblue", label="ListeningLoader"];
  ClassBinaryCacheLoader [style="filled", color="lightblue"];
  ListeningLoaderNonProject2 [style="filled", color="lightblue", label="ListeningLoader"];

  ProjectSystemClassLoader [style="filled", color="lightblue"];

  ListeningLoaderProject [style="filled", color="lightblue", label="ListeningLoader"];
  PseudoClassLocatorForLoaderProject [style="filled", color="lightgreen", label="PseudoClassLocatorForLoader"];
  AsmTransformingLoaderProject [style="filled", color="lightblue", label="AsmTransformingLoader"];

  OverlayLoader [style="filled", color="lightblue"];
  ListeningLoaderOverlay1 [style="filled", color="lightblue", label="ListeningLoader"];
  ListeningLoaderOverlay2 [style="filled", color="lightblue", label="ListeningLoader"];
  PseudoClassLocatorForLoaderOverlay [style="filled", color="lightgreen", label="PseudoClassLocatorForLoader"];
  AsmTransformingLoaderOverlay [style="filled", color="lightblue", label="AsmTransformingLoader"];

  MultiLoader [style="filled", color="lightblue"];
  RecyclerViewAdapterLoader [style="filled", color="lightblue"];
  MultiLoader2 [style="filled", color="lightblue", label="MultiLoader"];

  ModuleClassLoaderImpl [style="filled", color="lightblue"];
  LibraryResourceClassLoader [style="filled", color="lightpink"];
  StudioModuleClassLoader [style="filled", color="lightpink"];

  subgraph cluster_parent_loader {
    graph [style="dashed, rounded", label="parentLoader", margin="16pt"];
    ClassLoaderLoaderParent;
    subgraph cluster_parent {
      graph [style="dashed, rounded", label="parent", margin="16pt"];
      LayoutlibClassLoader; "ClassLoader of android plugin" [style="filled"];
    }
  }

  subgraph cluster_non_project {
    graph [style="dashed, rounded", label="nonProjectLoader", margin="16pt"];
    FakeSavedStateRegistryLoader; AsmTransformingLoaderNonProject; ListeningLoaderNonProject1; ClassBinaryCacheLoader; ListeningLoaderNonProject2; PseudoClassLocatorForLoaderNonProject;
    subgraph cluster_jar {
      graph [style="dashed, rounded", label="jarLoader", margin="16pt"];
      NameRemapperLoader; ClassLoaderLoaderJar; UrlClassLoader;
    }
  }

  subgraph cluster_project {
    graph [style="dashed, rounded", label="projectLoader", margin="16pt"];
    ListeningLoaderProject; PseudoClassLocatorForLoaderProject; AsmTransformingLoaderProject;
  }

  subgraph cluster_overlay {
    graph [style="dashed, rounded", label="overlayLoader", margin="16pt"];
    OverlayLoader; ListeningLoaderOverlay1; ListeningLoaderOverlay2; PseudoClassLocatorForLoaderOverlay; AsmTransformingLoaderOverlay;
  }


  LayoutlibClassLoader -> "ClassLoader of android plugin";
  FilteringClassLoader -> LayoutlibClassLoader;
  FirewalledResourcesClassLoader -> FilteringClassLoader;

  ClassLoaderLoaderParent -> LayoutlibClassLoader;

  NameRemapperLoader -> ClassLoaderLoaderJar -> UrlClassLoader;

  FakeSavedStateRegistryLoader -> NameRemapperLoader;

  PseudoClassLocatorForLoaderNonProject -> ClassLoaderLoaderParent;
  PseudoClassLocatorForLoaderNonProject -> LayoutlibClassLoader;
  PseudoClassLocatorForLoaderNonProject -> NameRemapperLoader;

  AsmTransformingLoaderNonProject -> FakeSavedStateRegistryLoader
  AsmTransformingLoaderNonProject -> PseudoClassLocatorForLoaderNonProject

  ListeningLoaderNonProject2 -> ClassBinaryCacheLoader -> ListeningLoaderNonProject1 -> AsmTransformingLoaderNonProject;

  ListeningLoaderProject -> ProjectSystemClassLoader;

  PseudoClassLocatorForLoaderProject -> ProjectSystemClassLoader;
  PseudoClassLocatorForLoaderProject -> ListeningLoaderNonProject2;
  PseudoClassLocatorForLoaderProject -> ClassLoaderLoaderParent;
  PseudoClassLocatorForLoaderProject -> LayoutlibClassLoader;

  AsmTransformingLoaderProject -> ListeningLoaderProject;
  AsmTransformingLoaderProject -> PseudoClassLocatorForLoaderProject;

  ListeningLoaderOverlay2 -> ListeningLoaderOverlay1 -> OverlayLoader;

  PseudoClassLocatorForLoaderOverlay -> ProjectSystemClassLoader;
  PseudoClassLocatorForLoaderOverlay -> ListeningLoaderNonProject2;
  PseudoClassLocatorForLoaderOverlay -> ClassLoaderLoaderParent;
  PseudoClassLocatorForLoaderOverlay -> LayoutlibClassLoader;

  AsmTransformingLoaderOverlay -> ListeningLoaderOverlay2;
  AsmTransformingLoaderOverlay -> PseudoClassLocatorForLoaderOverlay;

  MultiLoader -> AsmTransformingLoaderOverlay;
  MultiLoader -> AsmTransformingLoaderProject;

  MultiLoader2 -> MultiLoader;
  MultiLoader2 -> ListeningLoaderNonProject2;
  MultiLoader2 -> RecyclerViewAdapterLoader;

  ModuleClassLoaderImpl -> MultiLoader2;

  LibraryResourceClassLoader -> FirewalledResourcesClassLoader;
  LibraryResourceClassLoader -> ModuleClassLoaderImpl;
  StudioModuleClassLoader -> LibraryResourceClassLoader;
  StudioModuleClassLoader -> ModuleClassLoaderImpl;

  "ClassLoader" [style="filled"];
  "DelegatingClassLoader.Loader" [style="filled", color="lightblue"];
  PseudoClassLocator [style="filled", color="lightgreen"];
  "ClassLoader with R-classes" [style="filled", color="lightpink"];
  subgraph cluster_legend {
  graph [style="dashed, rounded", label="Legend", margin="16pt", orientation=i];
  "ClassLoader"; "DelegatingClassLoader.Loader" ; PseudoClassLocator; "ClassLoader with R-classes";
  }
  {
  // This is to make the nodes position vertically
    edge [style=invisible];
  "ClassLoader" -> "DelegatingClassLoader.Loader" -> PseudoClassLocator -> "ClassLoader with R-classes" [arrowhead=none];
  }
}