Coder Social home page Coder Social logo

intellij-reference-diagram's Introduction

Java Reference Diagram Plugin for IntelliJ IDEA Ultimate

This plugin for IntelliJ IDEA Ultimate helps to get an overview of coupling and cohesion in java projects in two different contexts:

  • References of methods and fields in classes
  • References between files in packages

This plugin is available in IntelliJ Plugin Registry: https://plugins.jetbrains.com/plugin/7996.

Usage

With this plugin a new diagram is available embedded in the action "Show UML Diagram" ⌥+⇧+⌘+U / CTRL+SHIFT+ALT+U. When focus is on a file or inside a file then the method reference diagram will be opened. If fucus is on a package, then file reference diagram will be opened.

Features

  • Show or hide categories of elements, like fields, methods, constructors, class initializers and their static companions.
  • If the return value of a method is assigned to a field, then this is also threaded like a dependency and is shown in a different line style.
  • As other diagrams, features available like Goto Source (F4), File Structure (Strg+F12) and Search (Ctrl+F), refactorings, Find Usages etc.
  • Nodes can be removed from graph to help analyze cohesive structure of the cluss.
  • Ability to isolate a subgraph based on a node: A subgraph of all it's callers or callees.
  • Show the connection between two nodes.
  • The cluster count is shown in the toolbar.
  • Overview of other references not shown in graph (see chapter Outer References below).

Cohesive clusters

If you have a suspect class and you want to analyze the cohesivnes of it this diagram helps you to visualize the [lack of cohesion of methods] (http://sonar-jenkins.blogspot.ch/2012/12/what-is-lcom4.html). The clusters are shown visual in the diagram. Also, the cluster count is shown in the toolbar. This is useful if you have big classes in legacy projects and you are not able to see the cluster count directly in the diagram.

Sometimes, cohesive groups are not separeted because they are connected through common methods or fields. For example for logging purposes. There's a great chance to see this as single nodes that are highly connected. With removing these nodes from the diagram you can see if there were hidden disconnected clusters. Comparing the cluster count before and after the removal helps with this task.

Does static methods and fields play a role in cohesion of a class? Just show or hide them via the toolbar. You can set the default behavior in the usual settings dialog of the others diagrams.

Isolate subgraphs

If you are interested in all methods and fields that can be reached by a certain method, then you can select that method and choose actions subsequently Mark Callees and Isolate Marked. Or you want to see which methods can reach a given diagram element, then you choose actions subsequently Mark Callers and Isolate Marked.

Show Connection between two Nodes

If you want to see the path between two methods you

  1. Select the source of the desired path and Mark Callees then Isolate Marked.
  2. Select the destination of the desired path and Mark Callers then Isolate Marked.

Other References

For overview of coupling there is the information of other references on the top right of the diagram. There are three numbers show:

  1. Number of references from same package. (= package private)
  2. Number of references from packages in the same hierarchy. (= public api)
  3. Number of references from packages in a other hierarchy. (= spaghetti?) These are different kind of references. Where references from same package are kind of local of the package, the references from same hierarchy are part of the public api of the package. The references from other hierarchy (i.e. from sibling packages) could be a sign of spaghetti.

Example

  1. ReferenceDiagramDataModel references OuterReferences. In terms of package hierarchy ch.docksnet.rgraph.method is referenced from ch.docksnet.rgraph, which is a kind of wanted dependency direction.
  2. TestToolWindow references OuterReferences. Here a sibling package ch.docksnet.rgraph.toolwindow references ch.docksnet.rgraph.method.

Example

This example shows five cohesive clusters in MainClass (source is showed below). A blue line indicates a method call, where a green line means that a field is coupled to a method in terms of cohesion. The numbers on the edges indicating the number of references.

public abstract class MainClass {

    {
        // class initializer
        method1();
    }

    static {
        // static class initializer
        staticMethod();
        staticField2 = StaticInnerClass.TEXT;
    }

    // field is coupled to a method, in terms of cohesion
    public static String staticField1 = staticMethod2c();

    private static String staticField2;

    int field1;

    private int field2 = createInt();

    public ENUM field3 = ENUM.A;

    public MainClass() {
        InnerClass innerClass = new InnerClass();
        innerClass.getName();
    }

    public MainClass(int field1, int field2, ENUM field3) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
    }

    private int createInt() {
        return 0;
    }

    public static void staticMethod() {
        staticMethod2c();
    }

    private static String staticMethod2c() {
        return null;
    }

    public final void method1() {
        method2();
    }

    protected void method1(int a) {
        method2();
        method2();
        method2();
    }

    void method2() {
        field1 = 4;
        field1 = 1;
        field3.getString();
    }

    abstract void abstractMethod();

    private void recursiveMethod() {
        recursiveMethod();
    }

    class InnerClass {
        // TODO what about inner classes?
        String innerField = staticMethod2c();
        public String getName() {
            return "Name";
        }
    }

    static class StaticInnerClass {
        public int i =3;
        public static final String TEXT = "text";
        static {
            System.out.println(TEXT);
            System.out.println(staticField1);
        }
    }

    enum ENUM {
        A, B, C;

        public String getString() {
            return "String";
        }
    }

}

Known Issues

  • Diagram does not work for library files #38

Support

Buy Me a Coffee

intellij-reference-diagram's People

Contributors

alshain avatar bash-spbu avatar stefku avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

intellij-reference-diagram's Issues

Graph layout takes too much space

Version: 2.1.0

I have a class with 16 methods. When I generate the method graph, it looks like this:

image

From this graph, I can see that the methods form a graph. But what I really wanted to know is:

  • Which method calls which one? Since the method names are not visible at this zoom level, I cannot quickly see this.
  • How are the methods connected? When I zoom in until I can read a method name, I cannot see the other methods anymore, since they are outside the screen.

Making the lines of the graph should would solve this problem.

RuntimeExceptionWithAttachments thrown in IntelliJ 2023.3.x

Exceptions are thrown when trying to Mark Nodes or Isolate Nodes.

The diagrams generated do not seem to be interactable. Marking Nodes and Isolating Nodes does not seem to have any affect on the diagram or individual nodes.

When loading a Diagram or trying to Isolating Nodes:

com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments: Read access is allowed from inside read-action (see Application.runReadAction()); see https://jb.gg/ij-platform-threading for details
Current thread: Thread[AWT-EventQueue-0,6,main] 1550078836 (EventQueue.isDispatchThread()=true)
SystemEventQueueThread: (same)
	at com.intellij.util.concurrency.ThreadingAssertions.createThreadAccessException(ThreadingAssertions.java:149)
	at com.intellij.util.concurrency.ThreadingAssertions.softAssertReadAccess(ThreadingAssertions.java:107)
	at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1012)
	at com.intellij.psi.impl.smartPointers.SmartPointerManagerImpl.createSmartPsiElementPointer(SmartPointerManagerImpl.java:68)
	at com.intellij.psi.impl.ElementBase$ElementIconRequest.<init>(ElementBase.java:171)
	at com.intellij.psi.impl.ElementBase$ElementIconRequest.<init>(ElementBase.java:166)
	at com.intellij.psi.impl.ElementBase.computeIcon(ElementBase.java:86)
	at com.intellij.psi.impl.ElementBase.getIcon(ElementBase.java:62)
	at ch.docksnet.rgraph.method.ReferenceNode.getIcon(ReferenceNode.java:57)
	at com.intellij.diagram.DiagramNode.getIcon(DiagramNode.java:56)
	at com.intellij.diagram.components.DiagramNodeDeferredIconsEvaluator.lambda$getUnevaluatedIcon$0(DiagramNodeDeferredIconsEvaluator.java:59)
	at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:195)
	at com.intellij.diagram.components.DiagramNodeDeferredIconsEvaluator.getUnevaluatedIcon(DiagramNodeDeferredIconsEvaluator.java:59)
	at com.intellij.diagram.components.DiagramNodeDeferredIconsEvaluator.registerEvaluationOrGetReadyIcon(DiagramNodeDeferredIconsEvaluator.java:66)
	at com.intellij.diagram.components.DiagramNodeHeaderComponent.createLabel(DiagramNodeHeaderComponent.java:104)
	at com.intellij.diagram.components.DiagramNodeHeaderComponent.<init>(DiagramNodeHeaderComponent.java:47)
	at com.intellij.diagram.components.DiagramNodeContainer.<init>(DiagramNodeContainer.java:144)
	at com.intellij.diagram.extras.DiagramExtras.createNodeComponent(DiagramExtras.java:127)
	at com.intellij.uml.core.renderers.DefaultUmlRenderer.tuneNode(DefaultUmlRenderer.java:88)
	at com.intellij.uml.core.renderers.DefaultUmlRenderer.tuneNode(DefaultUmlRenderer.java:79)
	at com.intellij.openapi.graph.builder.renderer.AbstractColoredNodeCellRenderer.createNodeRealizerComponent(AbstractColoredNodeCellRenderer.java:56)
	at com.intellij.uml.core.renderers.DefaultUmlRenderer.createNodeRealizerComponent(DefaultUmlRenderer.java:74)
	at com.intellij.openapi.graph.builder.renderer.BasicNodeCellRenderer$MyRealizerComponents.lambda$getOrCompute$0(BasicNodeCellRenderer.java:113)
	at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1220)
	at com.intellij.openapi.graph.builder.renderer.BasicNodeCellRenderer$MyRealizerComponents.getOrCompute(BasicNodeCellRenderer.java:111)
	at com.intellij.openapi.graph.builder.renderer.BasicNodeCellRenderer.getNodeCellRendererComponent(BasicNodeCellRenderer.java:65)
	at com.intellij.openapi.graph.impl.GraphBase$NodeCellRendererProxy.getNodeCellRendererComponent(GraphBase.java:457)
	at a.a.Fk.y(Unknown Source)
	at com.intellij.openapi.graph.impl.view.FastNodeCellRendererPainter.paintNode(FastNodeCellRendererPainter.java:40)
	at a.a.Fd.y(Unknown Source)
	at a.a.Fd.a(Unknown Source)
	at a.a.rX.paint(Unknown Source)
	at a.a.r0.a(Unknown Source)
	at a.a.ap.y(Unknown Source)
	at a.a.r0.y(Unknown Source)
	at a.a.r0.a(Unknown Source)
	at a.a.Ps.r(Unknown Source)
	at a.a.Ps.paintComponent(Unknown Source)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1115)
	at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5312)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1668)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1643)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1580)
	at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1347)
	at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5260)
	at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5070)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:882)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:865)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:865)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:838)
	at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:787)
	at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1909)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:792)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:761)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695)
	at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$12(IdeEventQueue.kt:589)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithoutImplicitRead(RwLockHolder.kt:44)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:589)
	at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:386)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

Exception on CTRL+F12

java.lang.NullPointerException
    at com.intellij.diagram.Utils.getNodeName(Utils.java:182)
    at com.intellij.uml.core.actions.UmlViewStructure.perform(UmlViewStructure.java:46)
    at com.intellij.diagram.DiagramAction.actionPerformed(DiagramAction.java:123)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher$3.performAction(IdeKeyEventDispatcher.java:586)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processAction(IdeKeyEventDispatcher.java:637)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.d(IdeKeyEventDispatcher.java:476)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.dispatchKeyEvent(IdeKeyEventDispatcher.java:212)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:538)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
[  53817]  ERROR - llij.ide.plugins.PluginManager - IntelliJ IDEA 14.1.3  Build #IU-141.1010.3 
[  53817]  ERROR - llij.ide.plugins.PluginManager - JDK: 1.7.0_67 
[  53817]  ERROR - llij.ide.plugins.PluginManager - VM: Java HotSpot(TM) 64-Bit Server VM 
[  53817]  ERROR - llij.ide.plugins.PluginManager - Vendor: Oracle Corporation 
[  53817]  ERROR - llij.ide.plugins.PluginManager - OS: Windows 7 
[  53817]  ERROR - llij.ide.plugins.PluginManager - Last Action: UML.ShowStructure 

is plugin ignoring method references?

I've noticed that method reference diagram is not considering method names used with "method reference syntax". This is what I get for such class:

public class DummyService {
    public Mono<String> getStringWithMethodReference() {
        return Mono.just("Hello, world")
                .map(this::processString);
    }
    public Mono<String> getStringWithLambda() {
        return Mono.just("Hello, world")
                .map(s -> processString(s));
    }
    private String processString(String source) {
        return source.toUpperCase(Locale.ROOT);
    }
}

image

PS: by the way, I would like to be able to contribute a fix for this, so if there're any hints/suggestions, please share! I did not yet take a look at the code though..

Generate a diagram of all callers of a method

Currently the method reference diagram generates all methods which are called by the selected method. Coming from Visual Studio, I expected this to be the other way round, i.e, given a function show a graph of all possible callers of the function. Is this possible with this plugin?

Bug with callees from anonymous inner classes

Here, the reference is not recognized:

public class MainClass2 {

   public void method() {
        new Runnable() {

            @Override
            public void run() {
                String s = method2();
            }
        } ;
   }

    private String method2() {
        return null;
    }

}

Diagram loses content when the editor is detached

  1. Put the cursor on some method
  2. Press Ctrl+Alt+Shift+U -> "Method reference Diagram"
  3. Grab the tab of the newly opened diagram window and drag it outside of the main IntelliJ IDEA frame (say to your second monitor)

The dragged out window is empty and there is no obvious way to get the content back.

Exception with IntelliJ 2019.1

com.intellij.diagnostic.PluginException: ch.docksnet.rgraph.actions.ShowClusterCountAction (RGRAPH.ShowClusterCount): group with id "Uml.Standard.Toolbar.Actions" isn't registered; action will be added to the "Other" group [Plugin: ch.docksnet.rgraph]
	at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.reportActionError(ActionManagerImpl.java:338)
	at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.reportActionError(ActionManagerImpl.java:333)

Also the cluster count is not shown.

the problem of studying your source code

I want to study how to develop a plugin to generate diagram. I download your source code, but I find that the "com.intellij.uml.UmlIcons" only exist in IDEA 2021.1, not exist in IDEA 2020.1. Does this mean that the source code only can develop plugin for specific version.

Reference diagram of classes in a package

When focus is on a package in project structure, show a diagram of classes and sub packages and their references.

Goal is to have an overview of coupling between files inside of a package.

How can I sync diagram during active class development?

When I write a class and it became too large (20+ methods), I can't no more keep them all in mind at once. But now with this plugin I can. And it's amazing.

I create a diagram, do some mouse dragging to regroup methods according to my understanding, and when it's done, I can keep the whole picture at once, and I know what to do next. I add/delete a method and I want to sync, but the only option here is to create a new diagram, which means all method's positions will be changed, and it's a mess again.

Even if I don't move methods by myself but just use any of layouts, a small refactoring can change positions drastically.

If there is no features that can help me now, please consider this post as feature request for:

  1. sync button / autosync
  2. keeping elements' positions during method adding, deleting, renaming, etc.

Exception after 'show diagram...'

  1. Right click on class method
  2. Select show diagram (CTRL+SHIFT+ALT+U)
  3. Select "Method reference diagram"
  4. Exception is thrown:
com.intellij.psi.impl.source.PsiEnumConstantImpl$MyReference cannot be cast to com.intellij.psi.PsiReferenceExpression
java.lang.ClassCastException: com.intellij.psi.impl.source.PsiEnumConstantImpl$MyReference cannot be cast to com.intellij.psi.PsiReferenceExpression
    at ch.docksnet.rgraph.ReferenceDiagramDataModel.wireUpDependencies(ReferenceDiagramDataModel.java:113)
    at ch.docksnet.rgraph.ReferenceDiagramDataModel.prepareReferenceElements(ReferenceDiagramDataModel.java:78)
    at ch.docksnet.rgraph.ReferenceDiagramDataModel.<init>(ReferenceDiagramDataModel.java:54)
    at ch.docksnet.rgraph.ReferenceDiagramProvider.createDataModel(ReferenceDiagramProvider.java:77)
    at ch.docksnet.rgraph.ReferenceDiagramProvider.createDataModel(ReferenceDiagramProvider.java:37)
    at com.intellij.uml.UmlGraphBuilderFactory.create(UmlGraphBuilderFactory.java:26)
    at com.intellij.uml.core.actions.ShowDiagram$1.run(ShowDiagram.java:72)
    at com.intellij.uml.core.actions.ShowDiagramBase$3$1.run(ShowDiagramBase.java:210)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:943)
    at com.intellij.uml.core.actions.ShowDiagramBase$3.run(ShowDiagramBase.java:201)
    at com.intellij.openapi.progress.impl.CoreProgressManager$5.run(CoreProgressManager.java:227)
    at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:563)
    at com.intellij.openapi.progress.impl.CoreProgressManager$8.run(CoreProgressManager.java:357)
    at com.intellij.openapi.progress.impl.CoreProgressManager$2.run(CoreProgressManager.java:142)
    at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:446)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:392)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:127)
    at com.intellij.openapi.application.impl.ApplicationImpl$14$1.run(ApplicationImpl.java:626)
    at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:365)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jetbrains.ide.PooledThreadExecutor$1$1.run(PooledThreadExecutor.java:55)

Platform info:

IntelliJ IDEA (Minerva) IU-143.379.11
Build #IU-143.379, built on October 20, 2015
JRE: 1.8.0_66-b17 amd64
JVM: Java HotSpot(TM) 64-Bit Server VM by Oracle Corporation

How to handle inner classes?

Shall inner classes visible on the diagram? Will they then be single nodes?
What role are inner classes playing in the cohesion of a class?

how do you open this in idea

Hi
while browsing plugins i found it interesting and decided to try it. But could not find any way i could actually see it in action. whats menu or whats keyboard shortcut???

Plugin is installed and used to work, but not anymore under IntelliJ 2021.1

I have this plugin installed and it does not indicate any problems (although I am not sure, how do you achieve that, if the latest release is from 2019)

so when I click Ctrl+Alt+Shift+U, when inside the class, then I get only 2 items in the popup menu:

image

are there any more specific requirements to be able to build a method graph diagram ?

Unique method names should be displayed without signature

In version 2.1.0, the graph shows the methods including their signatures. For methods that have unique names, including the signature takes much more space than necessary.

Therefore, methods that have a unique name should only display their name, so that the graph can display more relevant information.

Deleting a node should not reset the graph layout

Version: 2.1.0

When I generate a graph, I can rearrange it manually. After rearranging, when I select a node of the graph and press the Delete key (since that particular node is currently not interesting), the whole graph layout is reset, destroying everything that I arranged carefully.

Deleting a node should only do that one thing.

Exception when try to open diagram with cursor outside of class

[  18207]  ERROR - llij.ide.plugins.PluginManager - null 
java.lang.NullPointerException
    at ch.docksnet.rgraph.PsiUtils.getClassFromHierarchy(PsiUtils.java:46)
    at ch.docksnet.rgraph.ReferenceDiagramElementManager.findInDataContext(ReferenceDiagramElementManager.java:48)
    at ch.docksnet.rgraph.ReferenceDiagramElementManager.findInDataContext(ReferenceDiagramElementManager.java:31)
    at com.intellij.diagram.DiagramProvider.findProvider(DiagramProvider.java:148)
    at com.intellij.uml.core.actions.ShowDiagramBase.update(ShowDiagramBase.java:63)
    at com.intellij.openapi.actionSystem.AnAction.beforeActionPerformedUpdate(AnAction.java:243)
    at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:111)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processAction(IdeKeyEventDispatcher.java:620)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.d(IdeKeyEventDispatcher.java:483)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.dispatchKeyEvent(IdeKeyEventDispatcher.java:213)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:538)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Exception on CTRL+F

java.lang.NullPointerException
    at com.intellij.diagram.Utils.getNodeName(Utils.java:182)
    at com.intellij.uml.core.actions.UmlViewStructure.perform(UmlViewStructure.java:46)
    at com.intellij.diagram.DiagramAction.actionPerformed(DiagramAction.java:123)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher$3.performAction(IdeKeyEventDispatcher.java:586)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processAction(IdeKeyEventDispatcher.java:637)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.d(IdeKeyEventDispatcher.java:476)
    at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.dispatchKeyEvent(IdeKeyEventDispatcher.java:212)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:538)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
[  34341]  ERROR - llij.ide.plugins.PluginManager - IntelliJ IDEA 14.1.3  Build #IU-141.1010.3 
[  34341]  ERROR - llij.ide.plugins.PluginManager - JDK: 1.7.0_67 
[  34341]  ERROR - llij.ide.plugins.PluginManager - VM: Java HotSpot(TM) 64-Bit Server VM 
[  34341]  ERROR - llij.ide.plugins.PluginManager - Vendor: Oracle Corporation 
[  34341]  ERROR - llij.ide.plugins.PluginManager - OS: Windows 7 
[  34341]  ERROR - llij.ide.plugins.PluginManager - Last Action: UML.Find 

New rendering approach

The rendering of the diagram is done with com.intellij.diagram which is (at least for me) not intuitive and is has no documentation.

I would prefer another rendering mechanism that more people do understand.

My proposal.

  • Rendering is done with html and a graph drawing framework like d3.js
  • The web app is shown either in browser or in tool window of IntelliJ
  • The IDEA plugin starts a small webserver and pushes data and commands via websocket to the web app

Other posibility to check

NPE in Class GUSTicketBuilderTest

null
java.lang.NullPointerException
    at ch.docksnet.rgraph.PsiUtils.getRootPsiElement(PsiUtils.java:68)
    at ch.docksnet.rgraph.PsiUtils.getRootPsiElement(PsiUtils.java:73)
    at ch.docksnet.rgraph.ReferenceDiagramDataModel.resolveRelationships(ReferenceDiagramDataModel.java:256)
    at ch.docksnet.rgraph.ReferenceDiagramDataModel.updateDataModel(ReferenceDiagramDataModel.java:216)
    at ch.docksnet.rgraph.ReferenceDiagramDataModel.refreshDataModel(ReferenceDiagramDataModel.java:184)
    at com.intellij.uml.core.actions.ShowDiagram$1.run(ShowDiagram.java:79)
    at com.intellij.uml.core.actions.ShowDiagramBase$3$1.run(ShowDiagramBase.java:210)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:943)
    at com.intellij.uml.core.actions.ShowDiagramBase$3.run(ShowDiagramBase.java:201)
    at com.intellij.openapi.progress.impl.CoreProgressManager$5.run(CoreProgressManager.java:227)
    at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:563)
    at com.intellij.openapi.progress.impl.CoreProgressManager$8.run(CoreProgressManager.java:357)
    at com.intellij.openapi.progress.impl.CoreProgressManager$2.run(CoreProgressManager.java:142)
    at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:446)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:392)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:127)
    at com.intellij.openapi.application.impl.ApplicationImpl$14$1.run(ApplicationImpl.java:626)
    at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:365)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jetbrains.ide.PooledThreadExecutor$1$1.run(PooledThreadExecutor.java:55)

CTRL + ALT + SHIFT + U doing class diagram

Hi there,

I installed the plugin for the first time yesterday and it worked fine - but it seems to have broken since then - when I press the short cut CTRL + ALT + SHIFT + U it to jumps straight to the default IntelliJ Class Diagram generator - was wondering if you had any ideas as to what I could do - is there a way to directly generate it?

Thanks and great plugin 🥇

Exception in IU 2021.1.1

Not sure how much of this is helpful.
IntelliJ version and other details at the bottom of stack trace.

2021-06-01 13:36:24,109 [ 932053] ERROR - nsions.impl.ExtensionPointImpl - Cannot create class ch.docksnet.rgraph.ReferenceDiagramProvider (classloader=PluginClassLoader(plugin=PluginDescriptor(name=Java Method Reference Diagram, id=ch.docksnet.rgraph, descriptorPath=plugin.xml, path=/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/211.7142.45/IntelliJ IDEA.app.plugins/intellij-reference-diagram.jar, version=3.0.0, package=null), packagePrefix=null, instanceId=70, state=active))
com.intellij.diagnostic.PluginException: Cannot create class ch.docksnet.rgraph.ReferenceDiagramProvider (classloader=PluginClassLoader(plugin=PluginDescriptor(name=Java Method Reference Diagram, id=ch.docksnet.rgraph, descriptorPath=plugin.xml, path=
/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/211.7142.45/IntelliJ IDEA.app.plugins/intellij-reference-diagram.jar, version=3.0.0, package=null), packagePrefix=null, instanceId=70, state=active))
at com.intellij.serviceContainer.ComponentManagerImpl.instantiateClass(ComponentManagerImpl.kt:763)
at com.intellij.openapi.extensions.impl.XmlExtensionAdapter.instantiateClass(XmlExtensionAdapter.java:94)
at com.intellij.openapi.extensions.impl.XmlExtensionAdapter$SimpleConstructorInjectionAdapter.instantiateClass(XmlExtensionAdapter.java:112)
at com.intellij.openapi.extensions.impl.XmlExtensionAdapter.createInstance(XmlExtensionAdapter.java:73)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.processAdapter(ExtensionPointImpl.java:502)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.processAdapters(ExtensionPointImpl.java:436)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.calcExtensionList(ExtensionPointImpl.java:253)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.getExtensionList(ExtensionPointImpl.java:247)
at com.intellij.openapi.extensions.ExtensionPointName.getExtensionList(ExtensionPointName.java:39)
at com.intellij.uml.core.actions.ShowDiagramBase.findProviders(ShowDiagramBase.java:412)
at com.intellij.uml.core.actions.ShowDiagramBase.findAppropriateProvidersForThisAction(ShowDiagramBase.java:397)
at com.intellij.uml.core.actions.ShowDiagramBase.update(ShowDiagramBase.java:141)
at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performDumbAwareUpdate$1(ActionUtil.java:170)
at com.intellij.util.SlowOperations.lambda$allowSlowOperations$0(SlowOperations.java:77)
at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:64)
at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:76)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:176)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doUpdate(ActionUpdater.java:510)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$new$1(ActionUpdater.java:104)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.callAction(ActionUpdater.java:147)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$new$2(ActionUpdater.java:105)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.update(ActionUpdater.java:492)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.expandGroupChild(ActionUpdater.java:352)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$doExpandActionGroup$20(ActionUpdater.java:308)
at com.intellij.util.TimeoutUtil.compute(TimeoutUtil.java:134)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$doExpandActionGroup$22(ActionUpdater.java:307)
at com.intellij.util.containers.ContainerUtil.concat(ContainerUtil.java:1511)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doExpandActionGroup(ActionUpdater.java:307)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.expandActionGroup(ActionUpdater.java:199)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.expandActionGroup(ActionUpdater.java:173)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$expandActionGroupWithTimeout$11(ActionUpdater.java:215)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:57)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:178)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:688)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:634)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:64)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:165)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:57)
at com.intellij.openapi.progress.util.ProgressIndicatorUtils.withTimeout(ProgressIndicatorUtils.java:310)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.expandActionGroupWithTimeout(ActionUpdater.java:215)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.expandActionGroupWithTimeout(ActionUpdater.java:207)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroup(Utils.java:105)
at com.intellij.openapi.actionSystem.impl.Utils.fillMenu(Utils.java:117)
at com.intellij.openapi.actionSystem.impl.ActionPopupMenuImpl$MyMenu.lambda$show$1(ActionPopupMenuImpl.java:130)
at com.intellij.util.TimeoutUtil.run(TimeoutUtil.java:104)
at com.intellij.openapi.actionSystem.impl.ActionPopupMenuImpl$MyMenu.show(ActionPopupMenuImpl.java:129)
at com.intellij.ui.PopupHandler$2.invokePopup(PopupHandler.java:87)
at com.intellij.ui.PopupHandler.mousePressed(PopupHandler.java:36)
at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:288)
at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6649)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
at com.intellij.ui.treeStructure.Tree.processMouseEvent(Tree.java:392)
at com.intellij.ide.dnd.aware.DnDAwareTree.processMouseEvent(DnDAwareTree.java:45)
at java.desktop/java.awt.Component.processEvent(Component.java:6417)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5027)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4859)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4544)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2784)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4859)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969)
at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:906)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:836)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at com.intellij.serviceContainer.ComponentManagerImpl.instantiateClass(ComponentManagerImpl.kt:722)
... 89 more
Caused by: java.lang.NoClassDefFoundError: icons/UmlIcons
at ch.docksnet.rgraph.ReferenceUmlCategoryManager.(ReferenceUmlCategoryManager.java:167)
at ch.docksnet.rgraph.ReferenceDiagramProvider.(ReferenceDiagramProvider.java:49)
... 94 more
Caused by: java.lang.ClassNotFoundException: icons.UmlIcons PluginClassLoader(plugin=PluginDescriptor(name=Java Method Reference Diagram, id=ch.docksnet.rgraph, descriptorPath=plugin.xml, path=~/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/211.7142.45/IntelliJ IDEA.app.plugins/intellij-reference-diagram.jar, version=3.0.0, package=null), packagePrefix=null, instanceId=70, state=active)
at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.java:215)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 96 more
2021-06-01 13:36:24,111 [ 932055] ERROR - nsions.impl.ExtensionPointImpl - IntelliJ IDEA 2021.1.1 Build #IU-211.7142.45
2021-06-01 13:36:24,115 [ 932059] ERROR - nsions.impl.ExtensionPointImpl - JDK: 11.0.10; VM: Dynamic Code Evolution 64-Bit Server VM; Vendor: JetBrains s.r.o.
2021-06-01 13:36:24,115 [ 932059] ERROR - nsions.impl.ExtensionPointImpl - OS: Mac OS X
2021-06-01 13:36:24,115 [ 932059] ERROR - nsions.impl.ExtensionPointImpl - Plugin to blame: Java Method Reference Diagram version: 3.0.0
2021-06-01 13:36:24,115 [ 932059] ERROR - nsions.impl.ExtensionPointImpl - Last Action: ConsoleView.ClearAll

Reference count is directly on line

Instead on getLabel() use

@Override
    public String getToLabel() {
    return caller.getIdentifyingElement().getCalleeCount(calleeMethod) + "";
}

Click Mark Callers ERROR

Version 3.1.1
IDEA Version 2023.3.3
Abnormal stack information:

com.intellij.diagnostic.PluginException: PSI element is provided on EDT by ch.docksnet.rgraph.ReferenceDiagramExtras.getData("psi.Element"). Please move that to a BGT data provider using PlatformCoreDataKeys.BGT_DATA_PROVIDER [Plugin: ch.docksnet.rgraph]
at com.intellij.diagnostic.PluginProblemReporterImpl.createPluginExceptionByClass(PluginProblemReporterImpl.java:23)
at com.intellij.diagnostic.PluginException.createByClass(PluginException.java:89)
at com.intellij.ide.impl.DataValidators.reportPsiElementOnEdt(DataValidators.java:96)
at com.intellij.ide.impl.DataValidators.isDataValid(DataValidators.java:71)
at com.intellij.ide.impl.DataValidators.validOrNull(DataValidators.java:64)
at com.intellij.uml.UmlFileEditorImpl.getData(UmlFileEditorImpl.java:380)
at com.intellij.uml.UmlFileEditorImpl.getData(UmlFileEditorImpl.java:347)
at com.intellij.ide.impl.DataManagerImpl.getDataFromProviderInner(DataManagerImpl.java:242)
at com.intellij.ide.impl.DataManagerImpl.getDataFromProviderAndRulesInner(DataManagerImpl.java:82)
at com.intellij.ide.impl.DataManagerImpl.getDataFromProviderAndRules(DataManagerImpl.java:61)
at com.intellij.openapi.actionSystem.impl.PreCachedDataContext.cacheProviderData(PreCachedDataContext.java:339)
at com.intellij.openapi.actionSystem.impl.PreCachedDataContext.cacheComponentsData(PreCachedDataContext.java:315)
at com.intellij.openapi.actionSystem.impl.PreCachedDataContext.(PreCachedDataContext.java:104)
at com.intellij.openapi.actionSystem.impl.Utils.createAsyncDataContextImpl(Utils.kt:163)
at com.intellij.openapi.actionSystem.impl.Utils.createAsyncDataContext(Utils.kt:153)
at com.intellij.ide.navbar.ide.NavBarIdeUtil.dataContextInner(util.kt:115)
at com.intellij.ide.navbar.ide.NavBarIdeUtil.access$dataContextInner(util.kt:1)
at com.intellij.ide.navbar.ide.NavBarIdeUtil$dataContext$2$1.run(util.kt:99)
at com.intellij.openapi.wm.impl.FocusManagerImpl.lambda$doWhenFocusSettlesDown$3(FocusManagerImpl.java:169)
at com.intellij.util.ui.EdtInvocationManager.invokeLaterIfNeeded(EdtInvocationManager.java:33)
at com.intellij.ide.IdeEventQueue.ifFocusEventsInTheQueue(IdeEventQueue.kt:220)
at com.intellij.ide.IdeEventQueue.executeWhenAllFocusEventsLeftTheQueue(IdeEventQueue.kt:186)
at com.intellij.openapi.wm.impl.FocusManagerImpl.doWhenFocusSettlesDown(FocusManagerImpl.java:165)
at com.intellij.openapi.wm.impl.FocusManagerImpl.lambda$doWhenFocusSettlesDown$2(FocusManagerImpl.java:174)
at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:209)
at com.intellij.openapi.application.TransactionGuardImpl.access$100(TransactionGuardImpl.java:22)
at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:191)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:843)
at com.intellij.openapi.application.impl.ApplicationImpl$4.run(ApplicationImpl.java:463)
at com.intellij.openapi.application.impl.RwLockHolder.runWithEnabledImplicitRead(RwLockHolder.kt:75)
at com.intellij.openapi.application.impl.RwLockHolder.runWithImplicitRead(RwLockHolder.kt:67)
at com.intellij.openapi.application.impl.ApplicationImpl.runWithImplicitRead(ApplicationImpl.java:1436)
at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:82)
at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:124)
at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:44)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:792)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:761)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695)
at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$12(IdeEventQueue.kt:589)
at com.intellij.openapi.application.impl.RwLockHolder.runWithoutImplicitRead(RwLockHolder.kt:44)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:589)
at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72)
at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355)
at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793)
at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354)
at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349)
at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014)
at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014)
at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:848)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:391)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

Indicate on the documentation how to start a diagram

I've installed the plugin but can't find how to open the diagram.
I thought I would just right click on an element to find "Find References" or something similar but I couldn't tell what action I'm supposed to invoke.

The documentation also doesn't seem to tell how to open the diagram.

Can you indicate what action to look for?

Toolbar is not properly working

Version: 3.1.0

  • Categories cannot enabled/disabled.
  • Cluster count is not shown. Workaround: Context menu, left mouse button.
  • Outer References is not show. Workaround: Context menu, left mouse button.

Overview of coupling of this class regarding to package hierarchy of other classes

Idea is to have an overview if this class is coupled or kind of "free" of incoming references from other package hierarchies.

Currently, three different classes of incoming references is differentiated: Same package, same hierarchy and other hierarchy.

If a class has only references from same package, it's not the public API of the package and can be refactored quite freely. Kind of normal usages.

References from same hierarchy means, there are references from upper level of package hierarchy. For example com.example.MyClass accesses com.example.foo.MyOtherClass. That's a quite common way of using a package and the class is in the public api of the package. Also kind of normal usages.

Last but not least, references from other hierarchy is everything else. I.e. com.example.foo.MyOtherClass references com.example.bar.Class5. Or com.example.foo accesses classes in com.example. All that could be thought as kind of unstructured tangling of packages. These usages are kind of code smells.

Exception with inner classes

java.lang.IllegalStateException: no parent found
    at ch.docksnet.rgraph.PsiUtils.getRootPsiElement(PsiUtils.java:52)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.