Class Hierarchy Graphs
w0rp via Digitalmars-d
digitalmars-d at puremagic.com
Mon Apr 6 13:26:06 PDT 2015
I have just updated my reposistory so instead of using a
ClassHierarchyInfo type for class diagrams and a
ModuleDependencyInfo type for module diagrams, now digraph types
are used, coming from my container library. I had to update my
container library a little to get it to work, as I had some
problems with const and immutable types, but I needed to fix
those issues anyway. So now class diagrams use
Digraph!(const(ClassInfo)) and module diagrams use
Digraph!(const(ModuleInfo*)).
I have made some implementation changes for my container library,
but the API for the graphs should be the same, and it is
documented here.
https://w0rp.com/project/dstruct/dstruct/graph/
So now you can play around with the graphs directly if you want,
so you can say manually that module foo imports bar, when the
helper functions can't figure it out. I'm not exactly sure what
kind of graph you were after Andrei, as I have one thing for
direct imports and another for everything transitively, but you
can probably make whatever it is happen in a few ways. The actual
method for it is pretty short, so I'll paste the whole thing
here. (Adding an edge twice does effectively nothing, as the
edges aren't weighted here.)
void addModuleWithDependencies(Dependencies strategy =
Dependencies.all)
(ref ModuleGraph graph, const(ModuleInfo*) mod) {
graph.addVertex(mod);
// Add the imported modules.
foreach(importedModule; mod.importedModules) {
static if (strategy == Dependencies.all) {
if (!graph.hasEdge(mod, importedModule)) {
graph.addEdge(mod, importedModule);
// Add recursive dependencies.
graph.addModuleWithDependencies(importedModule);
}
} else {
graph.addEdge(mod, importedModule);
}
}
}
ModuleGraph is just an alias for the Digraph type mentioned
before. I think my only pain point is that there's no way, at
least that I know of, to just get ModuleInfo for a given module.
I have to use a foreach over all modules until I find the module
I'm after. It works, though.
More information about the Digitalmars-d
mailing list