X-Git-Url: http://nitlanguage.org diff --git a/src/model/model_viz.nit b/src/model/model_viz.nit index 20be8c3..d516da7 100644 --- a/src/model/model_viz.nit +++ b/src/model/model_viz.nit @@ -18,19 +18,16 @@ module model_viz import model import ordered_tree -# A simple specialisation of OrderedTree to display projects, groups and modules -# FIXME do not use Object, but a better common interface of MModule and MGroup -class MProjectTree - super OrderedTree[Object] +# A simple specialisation of OrderedTree to display packages, groups and modules +class MPackageTree + super OrderedTree[MConcern] # The model where to look for information var model: Model - init(model: Model) do self.model = model - redef fun display(a) do if a isa MGroup then - if a.parent == null then return "{a.mproject.name} ({a.filepath.to_s})" + if a.parent == null then return "{a.mpackage.name} ({a.filepath.to_s})" return a.name + " (group)" else if a isa MModule then return a.name @@ -47,7 +44,7 @@ class MProjectTree sort_with(alpha_comparator) end - # Sort modules and groups with a loosly adaptation of the linerarisation of modules + # Sort modules and groups with a loosely adaptation of the linearization of modules fun sort_with_linex do var c = linex_comparator @@ -60,18 +57,20 @@ class MProjectTree end # Compare modules and groups using the -# FIXME do not use Object, but a better common interface of MModule and MGroup private class LinexComparator - super Comparator[Object] + super Comparator + + redef type COMPARED: MConcern + var mins = new HashMap [MGroup, nullable MModule] var maxs = new HashMap [MGroup, nullable MModule] - fun min(o: Object): nullable MModule do + fun mini(o: Object): nullable MModule do if o isa MModule then return o assert o isa MGroup if not mins.has_key(o) then computeminmax(o) return mins[o] end - fun max(o: Object): nullable MModule do + fun maxi(o: Object): nullable MModule do if o isa MModule then return o assert o isa MGroup if not maxs.has_key(o) then computeminmax(o) @@ -84,14 +83,14 @@ private class LinexComparator return end var subs = tree.sub[o] - var minres = min(subs.first) - var maxres = max(subs.first) + var minres = mini(subs.first) + var maxres = maxi(subs.first) var order = minres.model.mmodule_importation_hierarchy for o2 in subs do - var c = min(o2) + var c = mini(o2) if c == null then continue if minres == null or order.compare(minres, c) > 0 then minres = c - c = max(o2) + c = maxi(o2) if c == null then continue if maxres == null or order.compare(maxres, c) < 0 then maxres = c end @@ -100,8 +99,8 @@ private class LinexComparator #if minres != maxres then print "* {o} {minres}..{maxres}" end redef fun compare(a,b) do - var ma = min(a) - var mb = min(b) + var ma = mini(a) + var mb = mini(b) if ma == null then if mb == null then return 0 else return -1 else if mb == null then @@ -110,15 +109,15 @@ private class LinexComparator var order = ma.model.mmodule_importation_hierarchy return order.compare(ma, mb) end - var tree: OrderedTree[Object] + var tree: OrderedTree[MConcern] end redef class Model - # Generate a MProjectTree based on the projects, groups and modules known in the model - fun to_mproject_tree: MProjectTree + # Generate a MPackageTree based on the packages, groups and modules known in the model + fun to_mpackage_tree: MPackageTree do - var res = new MProjectTree(self) - for p in mprojects do + var res = new MPackageTree(self) + for p in mpackages do for g in p.mgroups do res.add(g.parent, g) for m in g.mmodules do @@ -130,19 +129,19 @@ redef class Model end end -# Generate graphiz files based on projects, groups and modules +# Generate graphiz files based on packages, groups and modules # -# Interessing elements must be selected. See `mmodules`, `` -# Display configuration can be set. See `cluster_group`, `project_group` -class MProjectDot - super Streamable +# Interesting elements must be selected. See `mmodules`, `` +# Display configuration can be set. See `cluster_group`, `package_group` +class MPackageDot + super Writable # The model where to look for information var model: Model - # Set of projects to expand fully (ie all groups and modules are displayed) - # Initially empty, projects can be added - var mprojects = new HashSet[MProject] + # Set of packages to expand fully (ie all groups and modules are displayed) + # Initially empty, packages can be added + var mpackages = new HashSet[MPackage] # Set of modules to display # Initially empty, modules can be added @@ -154,19 +153,19 @@ class MProjectDot end # Should groups be shown as clusters? - var cluster_group writable = true + var cluster_group = true is writable - # Should projects be shown as clusters? - var project_group writable = true + # Should packages be shown as clusters? + var package_group = true is writable - # Recursively generate noed ans clusters for a mroup - private fun dot_cluster(o: OStream, mgroup: MGroup) + # Recursively generate node and clusters for a mgroup + private fun dot_cluster(o: Writer, mgroup: MGroup) do # Open the cluster, if required if mgroup.parent == null then - # is is a root group, so display the project - if project_group then - o.write("subgraph cluster_{mgroup.object_id} \{\nlabel=\"{mgroup.mproject.name}\\n({mgroup.filepath.to_s})\"\ncolor=black\nstyle=dotted\n") + # is is a root group, so display the package + if package_group then + o.write("subgraph cluster_{mgroup.object_id} \{\nlabel=\"{mgroup.mpackage.name}\\n({mgroup.filepath.to_s})\"\ncolor=black\nstyle=dotted\n") end else if cluster_group then @@ -180,20 +179,20 @@ class MProjectDot o.write("\t{node_for(mmodule)} [label=\"{mmodule.name}\",color=green]\n") end - # recusively progress on sub-clusters + # recursively progress on sub-clusters for d in mgroup.in_nesting.direct_smallers do dot_cluster(o, d) end # close the cluster if required if mgroup.parent == null then - if project_group then o.write("\}\n") + if package_group then o.write("\}\n") else if cluster_group then o.write("\}\n") end end - # Extends the set of `mmodules` by recurdively adding the most specific imported modules of foreign projects + # Extends the set of `mmodules` by recursively adding the most specific imported modules of foreign packages fun collect_important_importation do var todo = new List[MModule] @@ -202,9 +201,9 @@ class MProjectDot var m = todo.pop for psm in m.in_importation.greaters do - if m.mgroup.mproject != psm.mgroup.mproject then continue + if m.mgroup.mpackage != psm.mgroup.mpackage then continue for ssm in psm.in_importation.direct_greaters do - if psm.mgroup.mproject == ssm.mgroup.mproject then continue + if psm.mgroup.mpackage == ssm.mgroup.mpackage then continue mmodules.add(ssm) todo.add(ssm) end @@ -215,18 +214,18 @@ class MProjectDot # Generate the dot content with the current configuration redef fun write_to(stream) do - # Collect interessing nodes + # Collect interesting nodes for m in model.mmodules do - # filter out modules outside wanted projects + # filter out modules outside wanted packages if m.mgroup == null then continue - if not mprojects.has(m.mgroup.mproject) then continue + if not mpackages.has(m.mgroup.mpackage) then continue mmodules.add(m) end collect_important_importation - # Collect interessing edges + # Collect interesting edges var sub_hierarchy = new POSet[MModule] for m in mmodules do sub_hierarchy.add_node(m) @@ -240,7 +239,7 @@ class MProjectDot stream.write("digraph g \{\n") stream.write("rankdir=BT;node[shape=box];\n") # Generate the nodes - for p in model.mprojects do + for p in model.mpackages do dot_cluster(stream, p.root.as(not null)) end # Generate the edges