Dart Types

A utility to construct and present the type graph of dart type(s).

The tool is useful to visualize and understand the type hierarchy of a certain library or package.

Currently, the library only supports generating Mermaid graphs.

Features:

  • Generate the type graph of given dart type(s) or for given library/libraries
  • Generate Mermaid code (as code, as url for view, edit or image)
  • List all types within a path.

Note: generics are ignored at the moment

Installation

  • To install the package as a CLI, run the following:

    dart pub global activate dart_types
    
  • Available commands in dart_types:

    Global options:
    -h, --help            Print this usage information.
    -v, --[no-]verbose    Verbose output
    
    Available commands:
    list      List the available types in the given `path`
    mermaid   Generate Mermaid Graph (code, editor url, viewer url, or image url)
    
    Run "dart_types help <command>" for more information about a command
    
  • Usage for dart_types mermaid

    Generate Mermaid Graph (code, editor url, viewer url, or image url)
    
    Usage: dart_types mermaid [arguments]
    -h, --help                    Print this usage information.
    -p, --path                    Specify the path of the file/project where the type(s) are (can be multiple)
    -f, --filter                  filter types using a pattern (can be multiple)
    -x, --[no-]ignore-privates    Ignore all private types
    
    
    -t, --type                    scope the type hierarchy to specific type(s) (can be multiple)
    -c, --code                    print the mermaid graph code
    -u, --url                     generate a url to mermaid.live graph viewer
    -e, --url-edit                generate a url to mermaid.live graph editor
    -i, --url-image               generate a url to mermaid.ink graph image
    -g, --graph-type              Specify the graph type: Top Bottom, Bottom Up, Right Left, Left Right
                                [TB, BT, RL, LR (default)]
    

Notes: See the example folder for how to use this as a package

Example

  • Running the following:

    dart_types mermaid --path /path/to/flutter/sdk/packages/flutter/lib --code -ignore-privates --type StatelessWidget
    
  • Produces the code to the following mermaid graph:

    %% To view the graph, copy the code below to:
    %%  https://mermaid.live/
    graph LR
        931422573("Object") --> 639058955("Widget")
        639058955 --> 464006715("StatelessWidget")
        639058955 --> 416054233("PreferredSizeWidget")
        464006715 --> 1056914755("Builder")
        464006715 --> 262732828("CallbackShortcuts")
        464006715 --> 337536055("CheckedModeBanner")
        464006715 --> 610219950("Container")
        464006715 --> 936772830("DefaultTextEditingShortcuts")
        464006715 --> 162789820("DisplayFeatureSubScreen")
        464006715 --> 609146547("ExcludeFocus")
        464006715 --> 49112299("ExcludeFocusTraversal")
        464006715 --> 747420043("GestureDetector")
        464006715 --> 146799707("GridPaper")
        464006715 --> 902421044("HeroMode")
        464006715 --> 742478379("HtmlElementView")
        464006715 --> 821894802("Icon")
        464006715 --> 679314("ImageIcon")
        464006715 --> 599778847("IndexedStack")
        464006715 --> 386259944("KeyboardListener")
        464006715 --> 756704846("KeyedSubtree")
        464006715 --> 341174972("ModalBarrier")
        464006715 --> 339198387("NavigationToolbar")
        464006715 --> 409547886("OrientationBuilder")
        464006715 --> 48107699("PageStorage")
        464006715 --> 743848276("Placeholder")
        464006715 --> 456230168("PlatformSelectableRegionContextMenu")
        464006715 --> 42097335("PositionedDirectional")
        464006715 --> 961235098("PreferredSize")
        464006715 --> 1065842558("RawMagnifier")
        464006715 --> 472365102("ReorderableDragStartListener")
        464006715 --> 427683055("SafeArea")
        464006715 --> 286068455("ScrollView")
        464006715 --> 445477711("SingleChildScrollView")
        464006715 --> 126306520("SliverConstrainedCrossAxis")
        464006715 --> 592348889("SliverFillRemaining")
        464006715 --> 83650908("SliverFillViewport")
        464006715 --> 827955045("SliverPersistentHeader")
        464006715 --> 378627107("SliverSafeArea")
        464006715 --> 716412635("SliverVisibility")
        464006715 --> 460084456("Spacer")
        464006715 --> 900189511("Text")
        464006715 --> 535960679("Title")
        464006715 --> 638939478("TwoDimensionalScrollView")
        464006715 --> 661441418("UnconstrainedBox")
        464006715 --> 521488773("View")
        464006715 --> 956347801("ViewAnchor")
        464006715 --> 740469611("Visibility")
        760877175("BoxScrollView") --> 733462125("GridView")
        760877175 --> 167943787("ListView")
        416054233 --> 961235098
        472365102 --> 721803713("ReorderableDelayedDragStartListener")
        286068455 --> 760877175
        286068455 --> 257018606("CustomScrollView")
    
    
    style 464006715 color:#7FFF7F
    
    

    Note: to view the output, paste the graph at: https://mermaid.live

    Or alternatively, you can generate a URL directly using the following command:

    dart_types mermaid --path /path/to/flutter/sdk/packages/flutter/lib --url -ignore-privates --type StatelessWidget
    

Known Limitation:

  • Generics are ignored in generated graphs (in terms of type hierarchy)
  • Types from external libraries may not appear in the graph as super types in certain cases.
    • I assume that the analyzer will take advantage of cached analysis to provide super types from external libraries. If those external libraries are not available in the cache, they are ignored (this is unverified observation).
  • Note: mermaid.live website has a limit of 500 edges.

Libraries

dart_types