Giter Club home page Giter Club logo

dcdg.dart's Introduction

Build Status

Dart Class Diagram Generator

A small command line utility to generate a class (UML or similar) diagram from a Dart package.

Examples

Below is a UML diagram of the dcdg source code, created with dcdg. You can find the PlantUML source in the example/ directory.

Example UML Diagram

Installation

Install from pub:

dart pub global activate dcdg

Install from clone:

dart pub global activate -s path .

Usage

From inside a Dart package directory:

dart pub global run dcdg

This will dump a PlantUML file to stdout. You can save it to a file instead with the -o option.

If you'd like to create a Mermaid file instead, pass the -b option with mermaid as its argument:

dart pub global run dcdg -b mermaid

See --help for more options, including ways to filter what ends up in the output. You can find the help contents in USAGE.txt as well.

Examples

There are test fixtures in test/fixtures/. Each Dart package in this directory contains various (fake) classes. Try running DCDG against these fixtures to familiarize yourself with how it works.

Contributing

Pull requests are welcome! It is intended to be reasonably straightforward to add a new output format. Take a look at the DOT format implementation in lib/src/builders for an example.

If you have found a bug or have a feature request please open an issue.

Development

Format code using the tool/format.sh script. It will have a non-zero exit code if the formatting changed. That's fine, it does that so it can be used in CI.

Run the full test suite (including unit and functional tests) with tool/check.sh.

If you change the user interface or add features you should run tool/docs.sh to regenerate documentation and other resources. This script requires PlantUML.

dcdg.dart's People

Contributors

georgelesica-wf avatar glesica avatar greglittlefield-wf avatar tiloc 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

dcdg.dart's Issues

flutter support

is this library support flutter projects
and how we can use it with flutter projects

Not seeing all classes export to Plantuml

This might be an issue with Plantuml instead of this tool, but when I run plantuml against a .puml file generated by this tool, much of the .png seems to be missing. There are connection lines that go off the edge that I think should lead to the missing classes.

Again, not sure if PlantUML is at fault or this tool isn't generating things correcly.

Extensions?

I seem unable to get dcdg to represent extensions in my output.

part of 'extensions.dart';

extension intX on int {
  String toTime() {
    int h, m, s;

    h = this ~/ 3600;

    m = ((this - h * 3600)) ~/ 60;

    s = this - (h * 3600) - (m * 60);

    String hourLeft =
        h.toString().length < 2 ? "0" + h.toString() : h.toString();

    String minuteLeft =
        m.toString().length < 2 ? "0" + m.toString() : m.toString();

    String secondsLeft =
        s.toString().length < 2 ? "0" + s.toString() : s.toString();

    String result = "$hourLeft:$minuteLeft:$secondsLeft";

    return result;
  }
}

plantuml.com gives "Forbidden" error on dcdg output

Hi George,

I got this error form www.plantuml.com with some dcdg output:

Forbidden

You don't have permission to access /plantuml/uml/xLrVSzmuSd_tfs3fwRQypaFkwYgbygrE6icxa_CVdINlfl8oHP6O6Pmuu0G4nz8w_ku1-2Cez0Ya6l8uLwdAYqHsDngDxaRZ3ngSlpOcrwRTL2yQOJALRqIppGjn9RQvpasji-FZ5o-AAc-QxEWVzKxcrQBPhOwFotprBwKjUNnyLUHLVbE9-IPVYVDyTPHzUP5bhzxAnho-cdyKgXJQuN_A5dfuQIp9Ir8o-opD-htu_AiKdxUrDd_umP7iQbbcsrmgCrlBgh

(plus another page of goop)

Is this interesting enough to you that you'd like me to dig up a reproducible case? Or is the plantuml website not all that reliable to begin with?

If this is of interest, I'm happy to put a more reasonable bug report together. The example that creates this is the opposite of minimal -- I just ran dcdg on about 5KLOC, did a copy-paste, got the error, then went back to umlet and digging through dartdoc output :-). But I'm happy to spend a bit of time putting together a usable bug report, if you don't mind a largeish example (34K puml file). In this case, I might hold off for a couple of days, while I do a bit of refactoring prior to making the github repo public, since maybe you'd want access to the code that created it?

FWIW I use generics a fair bit, including generic methods. Might be totally unrelated, but maybe generic methods aren't all that commonly used in Dart?

unhandled exception

Have an error when attempting to generate diagrams for this repo: https://github.com/fredgrott/dart_oop_patterns

PS D:\fredgrttsstuff\GithubProjects\dart_oop_patterns\abstract_factory> flutter pub global run dcdg -s bin -o reports/docs/diagrams/src
Unhandled exception:
Bad state: Unable to find the context to D:\fredgrttsstuff\GithubProjects\dart_oop_patterns\abstract_factory\bin\abstract_factory.dart
#0 AnalysisContextCollectionImpl.contextFor (package:analyzer/src/dart/analysis/analysis_context_collection.dart:89:5)
#1 findClassElements (package:dcdg/src/find_class_elements.dart:44:39)
#2 main (file:///D:/fluttersdk/myfluttersdk/flutter/.pub-cache/hosted/pub.dartlang.org/dcdg-3.1.1/bin/dcdg.dart:35:25)
#3 _delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:281:32)
#4 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
pub finished with exit code 255

Add option to include dart:core

It would be nice to be able to optionally include dart:core for both has-a and is-a relationships. Right now it is excluded for has-a but included for is-a. We should exclude by default for both.

dcdg does not work with the new analyzer >=3.0.0 - but it is required for freezed to work.

dcdg does not work with the new analyzer >=3.0.0 - but it is required for freezed to work.
And freezed is a structured package...
Can this be fixed?

Because tortuga depends on freezed ^2.0.2 which depends on analyzer >=3.0.0 <5.0.0, analyzer >=3.0.0 <5.0.0 is required. So, because tortuga depends on analyzer ^2.6.0, version solving failed. pub get failed (1; So, because tortuga depends on analyzer ^2.6.0, version solving failed.) exit code 1

Unhandled exception when running dcdg

When I try to run dcdg in my project, I get the following stack trace:

Unhandled exception:
NoSuchMethodError: Closure call with mismatched arguments: function 'BlockScope.elementsInBlock'
Receiver: Closure: (_SyncIterator<Element>) => bool
Tried calling: BlockScope.elementsInBlock()
Found: BlockScope.elementsInBlock(_SyncIterator<Element>) => bool
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      _SyncIterable.iterator (dart:core-patch/core_patch.dart:117:45)
#2      BlockScope._defineElements (package:analyzer/src/dart/resolver/scope.dart:31:29)
#3      new BlockScope (package:analyzer/src/dart/resolver/scope.dart:27:5)
#4      ScopedVisitor.visitBlock (package:analyzer/src/generated/resolver.dart:5656:41)
#5      BlockImpl.accept (package:analyzer/src/dart/ast/ast.dart:1117:49)
#6      BlockFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1076:13)
#7      UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3339:10)
#8      UnifyingAstVisitor.visitBlockFunctionBody (package:analyzer/dart/ast/visitor.dart:3119:55)
#9      ScopedVisitor.visitBlockFunctionBody (package:analyzer/src/generated/resolver.dart:5669:13)
#10     BlockFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:1072:49)
#11     FunctionExpressionImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:5016:12)
#12     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3339:10)
#13     UnifyingAstVisitor.visitFunctionExpression (package:analyzer/dart/ast/visitor.dart:3248:57)
#14     ScopedVisitor.visitFunctionExpression (package:analyzer/src/generated/resolver.dart:5951:13)
#15     FunctionExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:5010:49)
#16     FunctionDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:4869:26)
#17     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3339:10)
#18     UnifyingAstVisitor.visitFunctionDeclaration (package:analyzer/dart/ast/visitor.dart:3241:59)
#19     ScopedVisitor.visitFunctionDeclarationInScope (package:analyzer/src/generated/resolver.dart:5944:11)
#20     ScopedVisitor.visitFunctionDeclaration (package:analyzer/src/generated/resolver.dart:5937:7)
#21     FunctionDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:4862:49)
#22     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7687:20)
#23     CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2167:21)
#24     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3339:10)
#25     UnifyingAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:3146:51)
#26     CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2146:49)
#27     LibraryAnalyzer._resolveFile (package:analyzer/src/dart/analysis/library_analyzer.dart:678:10)
#28     LibraryAnalyzer.analyzeSync.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:158:7)
#29     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#30     LibraryAnalyzer.analyzeSync (package:analyzer/src/dart/analysis/library_analyzer.dart:157:11)
#31     LibraryAnalyzer.analyze.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:111:14)
#32     _PerformanceTagImpl.makeCurrentWhile (package:analyzer/src/generated/utilities_general.dart:258:15)
#33     LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:110:43)
#34     AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1451:63)
#35     PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#36     AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#37     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#38     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#39     AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#40     ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#41     new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#42     findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#43     main (file:///C:/Users/sako_/flutter/.pub-cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#44     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#45     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

#0      AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1487:9)
#1      PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#2      AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#3      AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#4      AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#5      AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#6      ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#7      new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#8      findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#9      main (file:///C:/Users/sako_/flutter/.pub-cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#10     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#11     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

I have used it before in the same project and it worked, I have no idea what's wrong now.

Add option to put field labels on arrows

If PlantUML supports putting a label on the has-a arrow, provide an option to put fields on the arrows instead of (or in addition to) in the class node for easier readability in some situations.

This would probably also make sense for graphviz and Cypher output formats when they are implemented.

Bug: Duplicated fields when using 'part' keyword in dart

Discovered this bug because I am using the package json_serializable.

When using the dart 'part' and 'part of' keywords, the class' fields, methods, and relationships get duplicated.

For example:
If I break a file into 2 parts, then everything in the diagram is doubled for that class.
If I break a file into 3 parts, then everything in the diagram is tripled for that class.

Example Code:

// file_a.dart
import 'file_b.dart';

part 'file_a2.dart';

class A extends B {
  final String _name;

  A(this._name);

  String get name => _getName(this);
}
//file_a2.dart
part of 'file_a.dart';

String _getName(A instance) => instance._name;
//file_b.dart
class B {}

Creates this diagram:
image

'ConstTopLevelVariableElementImpl' is not a subtype of type 'FieldElement'

Is this project unmaintained? I do believe that this software won't work with new dart versions...

Unhandled exception:
_ElementMismatchException: Element mismatch in C:\dev\flutter\tourhq\lib\core\models\enrollment_state.dart at C:\dev\flutter\tourhq\lib\core\models\enrollment_state.dart
Caused by type 'ConstTopLevelVariableElementImpl' is not a subtype of type 'FieldElement'
#0      DeclarationResolver.visitFieldDeclaration (package:analyzer/src/generated/declaration_resolver.dart:189:18)
#1      FieldDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:4010:49)
#2      NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7687:20)
#3      ExtensionDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:3934:14)
#4      RecursiveAstVisitor.visitExtensionDeclaration (package:analyzer/dart/ast/visitor.dart:847:10)
#5      ExtensionDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:3927:49)
#6      NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7687:20)
#7      CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2167:21)
#8      RecursiveAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:727:10)
#9      CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2146:49)
#10     DeclarationResolver.resolve (package:analyzer/src/generated/declaration_resolver.dart:46:12)
#11     LibraryAnalyzer._resolveFile (package:analyzer/src/dart/analysis/library_analyzer.dart:675:31)
#12     LibraryAnalyzer.analyzeSync.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:158:7)
#13     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#14     LibraryAnalyzer.analyzeSync (package:analyzer/src/dart/analysis/library_analyzer.dart:157:11)
#15     LibraryAnalyzer.analyze.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:111:14)
#16     _PerformanceTagImpl.makeCurrentWhile (package:analyzer/src/generated/utilities_general.dart:258:15)
#17     LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:110:43)
#18     AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1451:63)
#19     PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#20     AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#21     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#22     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#23     AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#24     ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#25     new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#26     findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#27     main (file:///C:/Users/Zaki/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#28     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#29     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)


#0      DeclarationResolver.resolve (package:analyzer/src/generated/declaration_resolver.dart:49:7)
#1      LibraryAnalyzer._resolveFile (package:analyzer/src/dart/analysis/library_analyzer.dart:675:31)
#2      LibraryAnalyzer.analyzeSync.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:158:7)
#3      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#4      LibraryAnalyzer.analyzeSync (package:analyzer/src/dart/analysis/library_analyzer.dart:157:11)
#5      LibraryAnalyzer.analyze.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:111:14)
#6      _PerformanceTagImpl.makeCurrentWhile (package:analyzer/src/generated/utilities_general.dart:258:15)
#7      LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:110:43)
#8      AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1451:63)
#9      PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#10     AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#11     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#12     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#13     AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#14     ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#15     new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#16     findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#17     main (file:///C:/Users/Zaki/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#18     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#19     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

#0      AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1487:9)
#1      PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#2      AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#3      AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#4      AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#5      AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#6      ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#7      new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#8      findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#9      main (file:///C:/Users/Zaki/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#10     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#11     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
Unhandled exception:
_ElementMismatchException: Element mismatch in C:\dev\flutter\tourhq\lib\core\models\enrollment_state.dart at C:\dev\flutter\tourhq\lib\core\models\enrollment_state.dart
Caused by type 'ConstTopLevelVariableElementImpl' is not a subtype of type 'FieldElement'
#0      DeclarationResolver.visitFieldDeclaration (package:analyzer/src/generated/declaration_resolver.dart:189:18)
#1      FieldDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:4010:49)
#2      NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7687:20)
#3      ExtensionDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:3934:14)
#4      RecursiveAstVisitor.visitExtensionDeclaration (package:analyzer/dart/ast/visitor.dart:847:10)
#5      ExtensionDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:3927:49)
#6      NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7687:20)
#7      CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2167:21)
#8      RecursiveAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:727:10)
#9      CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2146:49)
#10     DeclarationResolver.resolve (package:analyzer/src/generated/declaration_resolver.dart:46:12)
#11     LibraryAnalyzer._resolveFile (package:analyzer/src/dart/analysis/library_analyzer.dart:675:31)
#12     LibraryAnalyzer.analyzeSync.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:158:7)
#13     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#14     LibraryAnalyzer.analyzeSync (package:analyzer/src/dart/analysis/library_analyzer.dart:157:11)
#15     LibraryAnalyzer.analyze.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:111:14)
#16     _PerformanceTagImpl.makeCurrentWhile (package:analyzer/src/generated/utilities_general.dart:258:15)
#17     LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:110:43)
#18     AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1451:63)
#19     PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#20     AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#21     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#22     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#23     AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#24     ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#25     new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#26     findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#27     main (file:///C:/Users/Zaki/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#28     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#29     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)


#0      DeclarationResolver.resolve (package:analyzer/src/generated/declaration_resolver.dart:49:7)
#1      LibraryAnalyzer._resolveFile (package:analyzer/src/dart/analysis/library_analyzer.dart:675:31)
#2      LibraryAnalyzer.analyzeSync.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:158:7)
#3      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#4      LibraryAnalyzer.analyzeSync (package:analyzer/src/dart/analysis/library_analyzer.dart:157:11)
#5      LibraryAnalyzer.analyze.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:111:14)
#6      _PerformanceTagImpl.makeCurrentWhile (package:analyzer/src/generated/utilities_general.dart:258:15)
#7      LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:110:43)
#8      AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1451:63)
#9      PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#10     AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#11     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#12     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#13     AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#14     ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#15     new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#16     findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#17     main (file:///C:/Users/Zaki/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#18     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#19     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

#0      AnalysisDriver._computeAnalysisResult.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1487:9)
#1      PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:34:15)
#2      AnalysisDriver._computeAnalysisResult (package:analyzer/src/dart/analysis/driver.dart:1428:20)
#3      AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1100:33)
<asynchronous suspension>
#4      AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2188:24)
<asynchronous suspension>
#5      AnalysisDriverScheduler.start (package:analyzer/src/dart/analysis/driver.dart:2118:5)
#6      ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:77:17)
#7      new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:46:36)
#8      findClassElements (package:dcdg/src/find_class_elements.dart:26:29)
#9      main (file:///C:/Users/Zaki/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#10     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#11     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

Methods not generated properly

Hi!
When I called dart pub global run dcdg it incorrectly read method's return type and didin't read parameters.

Reproduce:

class Foo {
  Future<void> bar(int a) async {
  }
}

Results:

class "project::foo.dart::Foo" {
  +dynamic bar()
}

Use snapshots to speed up functional tests

Apparently (thanks @greglittlefield-wf) we can build a snapshot like this:

dart --snapshot=dcdg.snapshot bin/dcdg.dart

Then we can run the snapshot with the dart executable: dart dcdg.snapshot. This avoids recompilation every time it is run.

This would potentially make the functional tests run quite a bit faster.

Does this work Recursively/Hierarchically?

I wanted to run this CLI on a folder which has a bunch of my packages, but couldn't because it seems to only work within the context of a single package. Am I wrong?

Anyway, I didn't know how to create Dart CLIs so I took it as an opportunity to learn something new. I worked out a CLI that looks for packages and then calls dcdg on each to generate their UMLs โ€” it does so by calling out a process on a shell, instead of using the dcdg Dart package itself, I was a bit lazy...

You can check out the package here โ€” basically I called a package everything that has a lib folder inside, it makes sense to my folder's context, but it is probably not a universal solution of course.

This is an awesome package and I would like to help if I can, let me know if this idea interests you.

Another suggestion I have is for a feature of drawing UML for relationships between packages, which can be very important for understanding the larger scope projects. Does the dcdg package already do that?

package choosing

when I run the command it generates UML for the whole application how I can select a package that I want to generate from it?

stdout location?

Please where is the stdout location, where does the UML file save to?

exclude samples

Where can I find some samples using exclude param from cli ?

I would like to exclude dart and flutter native classes (the one I didn't create)
Because after generate uml class diagram, it comes with Color flutter class and others I didn't create.

How can I ignore them ? I just want to generate all the classes I create only.

Thanks

Problem with large package and limiting scope

I have successfully been able to create UML diagrams for many of the packages found at.

https://github.com/julienlebren/flutter_packages

I use dcdg | pbcopy to copy the plantuml output to my clipboard on the Mac. Then I use the PlantUML integration plugin viewer on Android Studio to preview the picture.

With that plugin I am able to copy the SVG code into (.svg) files to achieve a good solution for adding the diagrams to SketchApp for layout. One could also use these on HMTL or other places.

I fail when I attempt to render the signin package as noted below. I did some basic research from other closed issues but I'd appreciate suggestions about how to get this fairly complex package to render.

Thanks for your phenomenal work on this package.

Unhandled exception:
Bad state: Unable to find the context to /Volumes/VPL/Development/flutter-workspace/flutter_packages/packages/sign_in/lib/sign_in.freezed.dart
#0      AnalysisContextCollectionImpl.contextFor (package:analyzer/src/dart/analysis/analysis_context_collection.dart:106:5)
#1      findClassElements (package:dcdg/src/find_class_elements.dart:46:39)
<asynchronous suspension>
#2      main (file:///Users/stan/.pub-cache/hosted/pub.dartlang.org/dcdg-4.0.1/bin/dcdg.dart:35:19)
<asynchronous suspension>

Note:
When I try options to limit the scope of my folder search, I come up empty.

eg.
dcdg -s "lib/services"|pbcopy  

BTW:
Several of the other packages were extremely large and I was successful getting them into SVG files. I do not understand the error message.

P.S.
I was able to achieve 99% of what I want by removing the freezed.dart file outside of the package. My question now becomes; can you explain what the error means and how I might better handle the problem if I have a similar issue in the future? Why the behavior on freezed files? The scope question remains as well. I am obviously missing something as I was not able to scope the output.

How to save to png file?

i run the command "pub global run dcdg --output=ClassDiagram.png". I can't find the command to save as png written anywhere not even in help

Extra namespace separators

In some cases we seem to end up with extra namespace separators. This happens with the functional test suite. For example:

class file:::::::home::george::dcdg.dart::test::fixtures::simple::lib::src::internal.dart::_PrivateInternalPrivate

I'm not sure why this happens. Seems likely that it has something to do with setting the package directory to something other than the CWD.

Report crash on package without pub get

The visitor barfs if an export uses a package: style URI rather than a relative path. Seems like it might be an analyzer bug (it may have something to do with dart-lang/sdk#35174), but noting it here for the future. Example stack trace:

 dcdg --exported-only
file:///home/george/w_common/lib/disposable.dart
{DisposableManager, DisposableManagerV2, DisposableManagerV3, DisposableManagerV4, DisposableManagerV5, DisposableManagerV6, DisposableManagerV7, ObjectDisposedException}
Unhandled exception:
NoSuchMethodError: The method 'accept' was called on null.
Receiver: null
Tried calling: accept<void>(Instance of 'ClassElementCollector')
#0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
#1      ClassElementCollector.visitExportElement (package:dcdg/src/class_element_collector.dart:47:29)
#2      ExportElementImpl.accept (package:analyzer/src/dart/element/element.dart:4668:53)
#3      ElementImpl.safelyVisitChildren (package:analyzer/src/dart/element/element.dart:3616:15)
#4      LibraryElementImpl.visitChildren (package:analyzer/src/dart/element/element.dart:6604:5)
#5      RecursiveElementVisitor.visitLibraryElement (package:analyzer/dart/element/visitor.dart:265:13)
#6      LibraryElementImpl.accept (package:analyzer/src/dart/element/element.dart:6488:53)
#7      findClassElements (package:dcdg/src/find_class_elements.dart:49:33)
<asynchronous suspension>
#8      main (file:///home/george/dcdg.dart/bin/dcdg.dart:28:25)
<asynchronous suspension>
#9      _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:298:32)
#10     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)

Better documentation on exclude

I am trying to exclude any Flutter SDK packages from the output. I have tried a lot of variations:
--exclude=^flutter.*
--exclude=flutter.*
--exclude=StatefulWidget
--exclude=.*StatefulWidget

none of these seem to have any effect. I am looking for better documentation on such a use-case and maybe a --verbose option for dcdg that prints out whether it believes something is a match. It is unclear to me whether the package names, such as flutter:: are part of the class name that needs to match.

I have also attempted the --exported-only option as an alternative, but that leads to broken output with numerous repeating fields.

Exported classes are included twice

We include classes that are exported twice because we find them twice, once in the entry point file (in lib/) and then again when we traverse the src directory (which happens whenever we don't have --exported-only).

its hanging on intl

Its hanging on intl classes

my command lien and output errors:
PS D:\fredgrttsstuff\GithubProjects\flutter_best_practices\fbp_one> flutter pub global run dcdg -o reports\docs\diagrams\src\diagrams.puml
Unhandled exception:
Bad state: Unable to find the context to D:\fredgrttsstuff\GithubProjects\flutter_best_practices\fbp_one\lib\src\localization_gen\intl\messages_all.dart
#0 AnalysisContextCollectionImpl.contextFor (package:analyzer/src/dart/analysis/analysis_context_collection.dart:89:5)
#1 findClassElements (package:dcdg/src/find_class_elements.dart:44:39)

#2 main (file:///D:/fluttersdk/myfluttersdk/flutter/.pub-cache/hosted/pub.dartlang.org/dcdg-3.1.1/bin/dcdg.dart:35:19)

pub finished with exit code 255
PS D:\fredgrttsstuff\GithubProjects\flutter_best_practices\fbp_one>

Composition and Aggregation

Sorry if I'm missing something but does it currently have no support for Composition and Aggregation? It generates just extents for me. No has-a relationships.

"Unhandled exception:" error

I'm always getting the following output when running dcdg:

Unhandled exception:
FileSystemException: Directory listing failed, path = '/home/mzamayias/Documents/Repositories/glowing-sniffle/Current Courses/Agile Programming/Assignments/Assignment 2/dart/simple_hearts_game/lib/' (OS Error: No such file or directory, errno = 2)
#0 _Directory._fillWithDirectoryListing (dart:io-patch/directory_patch.dart:37:68)
#1 _Directory.listSync (dart:io/directory_impl.dart:243:5)
#2 findClassElements (package:dcdg/src/find_class_elements.dart:35:8)
#3 main (file:///home/mzamayias/.pub-cache/hosted/pub.dartlang.org/dcdg-2.0.1/bin/dcdg.dart:28:25)
#4 _startIsolate. (dart:isolate-patch/isolate_patch.dart:299:32)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

Am I doing something wrong? I've followed the instructions for installation and usage. Also, as this my first Issue report on GitHub, am I doing it right?

Enhancement: Include and exclude multiple paths

I'd like to have a way to tell dcdg to search into multiple directories and at the same time exclude multiple directories relative to the root directory. My use case is this flame engine's repo

Directories I want to include:
lib/src/components/

Directories I want to exclude:
lib/src/components/input/
lib/src/components/mixins/

Mermaid - Class associations of objects with generics

It looks like there is an issue with the mermaid builder where you can't associate classes that have nested generics. An example of this would be:

classDiagram
class Foo
Foo : +bars List~Bar~Object~~
Foo o-- List~Bar~Object~~

class Bar~Object?~

However, this works fine.

classDiagram
class Foo
Foo : +bars List~Bar~Object~~
Foo o-- Bar~Object~

class Bar~Object?~
classDiagram
class Foo
Foo : +bars List~Bar~Object~~
Foo o-- Bar~Object~

Class Bar~Object?~

In my opinion, it probably makes sense to drop the iterable from the association and just associate the object. ๐Ÿคท

Dot output contains the full path

Problem

I am trying to use this package to generate dot output for some class in flame engine's repo. This is the command that I am using,

dart pub global run dcdg -b dot > dot.dot

It executes without any errors, but the output is something like this,

"flame/src/collisions/hitboxes/circle_hitbox.dartCircleHitbox" -> "flame/src/geometry/circle_component.dartCircleComponent"
"flame/src/collisions/hitboxes/circle_hitbox.dartCircleHitbox" -> "flame/src/collisions/hitboxes/shape_hitbox.dartShapeHitbox"
"flame/src/collisions/hitboxes/composite_hitbox.dartCompositeHitbox" -> "flame/src/components/position_component.dartPositionComponent"
"flame/src/collisions/hitboxes/composite_hitbox.dartCompositeHitbox" -> "flame/src/collisions/collision_callbacks.dartCollisionCallbacks"

The class name and file path are getting combined into a single string and as a result of this the image generated from dot executable looks like this,
image

Expected behavior

I'd like the dot output to be just the class names so that the generated image also contains only the class names.

Handle nullable field types correctly

We need to affiliate A? with A rather than treating it as its own type. For right now at least they get mapped to the same package, but the diagram isn't as useful / clean as it could be. See screenshot below.

image

update dependencies in pubspec to latest versions

I get errors about version solving failed when including dcdg in my project. Reason is that the dependency versions in the pubspec are outdated.
for example: analyzer is already at version 2.4.0 (is still at 1.1.0)
version of test package is now at 1.18.2 (is still at 1.0.0)

Any plans to upgrade to latest dependeny packages?

New filtering options

  • Filter to certain class names plus their full networks, including fields on super types, has-a types, etc.
  • Make include and exclude accept regular expressions or at least wildcards.
  • Make include and exclude work on namespaces as well as class names or provide separate options for namespace filtering.
  • Option to generate diagram with no relationships or "only" relationships.
  • Filter to include only classes that extend, or share a has-a relationship with, another given class or classes.

How to get UML diagram for only the lib folder

I have it working for Flutter but for large projects the resulting UML is too complex since packages are included.
Is there a way to get a UML just for the lib folder?
I tried running from the lib folder but it changes the CWD to project root and then I get the same diagram.

UML dependency relationship

Hi. I am using dcdg / plantUML / Android Studio in early stages of learning Flutter development. Thanks for a nice product. My question: is there any way to request dcdg shows UML dependency relationships e.g Class2 depends on Class1 as Class 2 uses property or method of Class1? I checked USAGE.txt. Thanks for your help.

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.