Mercurial > projects > dil
annotate trunk/src/cmd/ImportGraph.d @ 703:bf10602159c1
Added static and public import styles to 'igraph' command.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 27 Jan 2008 20:51:19 +0100 |
parents | e10838e0b182 |
children | 8f8c9ab3f3ba |
rev | line source |
---|---|
364 | 1 /++ |
2 Author: Aziz Köksal | |
3 License: GPL3 | |
4 +/ | |
5 module cmd.ImportGraph; | |
580
fa6d3c52757d
Moved SyntaxTree.d to new package 'ast'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
576
diff
changeset
|
6 |
fa6d3c52757d
Moved SyntaxTree.d to new package 'ast'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
576
diff
changeset
|
7 import dil.ast.Node; |
585
05c375fb2d5c
Moved dil.Declarations to dil.ast.Declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
580
diff
changeset
|
8 import dil.ast.Declarations; |
593
2848ce3becf5
Moved dil.Module to dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
585
diff
changeset
|
9 import dil.semantic.Module; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
10 import dil.parser.ImportParser; |
364 | 11 import dil.File; |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
12 import dil.Settings; |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
13 import tango.text.Regex : RegExp = Regex; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
14 import tango.io.FilePath; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
15 import tango.io.FileConst; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
16 import tango.text.Util; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
17 import common; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
18 |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
19 alias FileConst.PathSeparatorChar dirSep; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
20 |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
21 enum IGraphOption |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
22 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
23 None, |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
24 IncludeUnlocatableModules = 1, |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
25 PrintDot = 1<<1, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
26 HighlightCyclicEdges = 1<<2, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
27 HighlightCyclicVertices = 1<<3, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
28 GroupByPackageNames = 1<<4, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
29 GroupByFullPackageName = 1<<5, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
30 PrintPaths = 1<<6, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
31 PrintList = 1<<7, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
32 MarkCyclicModules = 1<<8, |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
33 } |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
34 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
35 class Graph |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
36 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
37 Vertex[] vertices; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
38 Edge[] edges; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
39 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
40 void addVertex(Vertex vertex) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
41 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
42 vertex.id = vertices.length; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
43 vertices ~= vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
44 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
45 |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
46 Edge addEdge(Vertex from, Vertex to) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
47 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
48 auto edge = new Edge(from, to); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
49 edges ~= edge; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
50 from.outgoing ~= to; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
51 to.incoming ~= from; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
52 return edge; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
53 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
54 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
55 /// Walks the graph and marks cyclic vertices and edges. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
56 void detectCycles() |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
57 { // Cycles could also be detected in the GraphBuilder, |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
58 // but having the code here makes things much clearer. |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
59 |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
60 // Returns true if the vertex is in status Visiting. |
699
4c0ea78a7f8b
Fixed cycle detection algorithm.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
698
diff
changeset
|
61 bool visit(Vertex vertex) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
62 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
63 switch (vertex.status) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
64 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
65 case Vertex.Status.Visiting: |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
66 vertex.isCyclic = true; |
699
4c0ea78a7f8b
Fixed cycle detection algorithm.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
698
diff
changeset
|
67 return true; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
68 case Vertex.Status.None: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
69 vertex.status = Vertex.Status.Visiting; // Flag as visiting. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
70 foreach (outVertex; vertex.outgoing) // Visit successors. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
71 vertex.isCyclic |= visit(outVertex); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
72 vertex.status = Vertex.Status.Visited; // Flag as visited. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
73 break; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
74 case Vertex.Status.Visited: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
75 break; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
76 default: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
77 assert(0, "unknown vertex status"); |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
78 } |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
79 return false; // return (vertex.status == Vertex.Status.Visiting); |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
80 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
81 // Start visiting vertices. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
82 visit(vertices[0]); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
83 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
84 foreach (edge; edges) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
85 if (edge.from.isCyclic && edge.to.isCyclic) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
86 edge.isCyclic = true; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
87 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
88 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
89 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
90 /// Represents a directed connection between two vertices. |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
91 class Edge |
370 | 92 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
93 Vertex from; /// Coming from vertex. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
94 Vertex to; /// Going to vertex. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
95 bool isCyclic; /// Edge connects cyclic vertices. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
96 bool isPublic; /// Public import. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
97 bool isStatic; /// Static import. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
98 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
99 this(Vertex from, Vertex to) |
370 | 100 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
101 this.from = from; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
102 this.to = to; |
370 | 103 } |
104 } | |
105 | |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
106 /// Represents a module in the graph. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
107 class Vertex |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
108 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
109 Module modul; /// The module represented by this vertex. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
110 uint id; /// The nth vertex in the graph. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
111 Vertex[] incoming; /// Also called predecessors. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
112 Vertex[] outgoing; /// Also called successors. |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
113 bool isCyclic; /// Whether this vertex is in a cyclic relationship with other vertices. |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
114 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
115 enum Status : ubyte |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
116 { None, Visiting, Visited } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
117 Status status; /// Used by the cycle detection algorithm. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
118 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
119 |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
120 string findModuleFilePath(string moduleFQNPath, string[] importPaths) |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
121 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
122 auto filePath = new FilePath(); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
123 foreach (importPath; importPaths) |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
124 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
125 filePath.set(importPath); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
126 filePath.append(moduleFQNPath); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
127 foreach (moduleSuffix; [".d", ".di"/*interface file*/]) |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
128 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
129 filePath.suffix(moduleSuffix); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
130 if (filePath.exists()) |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
131 return filePath.toString(); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
132 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
133 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
134 return null; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
135 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
136 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
137 class GraphBuilder |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
138 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
139 Graph graph; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
140 IGraphOption options; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
141 string[] importPaths; /// Where to look for modules. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
142 Vertex[string] loadedModulesTable; /// Maps FQN paths to modules. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
143 bool delegate(string) filterPredicate; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
144 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
145 this() |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
146 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
147 this.graph = new Graph; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
148 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
149 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
150 /// Start building the graph and return that. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
151 Graph start(string fileName) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
152 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
153 loadModule(fileName); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
154 return graph; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
155 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
156 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
157 /++ |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
158 Loads all modules recursively and builds the graph at the same time. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
159 Params: |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
160 moduleFQNPath = e.g.: dil/ast/Node (module FQN = dil.ast.Node) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
161 +/ |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
162 Vertex loadModule(string moduleFQNPath) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
163 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
164 // Look up in table if the module is already loaded. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
165 auto pVertex = moduleFQNPath in loadedModulesTable; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
166 if (pVertex !is null) |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
167 return *pVertex; // Returns null for filtered or unlocatable modules. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
168 |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
169 // Filter out modules. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
170 if (filterPredicate && filterPredicate(moduleFQNPath)) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
171 { // Store null for filtered modules. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
172 loadedModulesTable[moduleFQNPath] = null; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
173 return null; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
174 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
175 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
176 // Locate the module in the file system. |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
177 auto moduleFilePath = findModuleFilePath(moduleFQNPath, importPaths); |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
178 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
179 Vertex vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
180 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
181 if (moduleFilePath is null) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
182 { // Module not found. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
183 if (options & IGraphOption.IncludeUnlocatableModules) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
184 { // Include module nevertheless. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
185 vertex = new Vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
186 vertex.modul = new Module(""); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
187 vertex.modul.setFQN(replace(moduleFQNPath, dirSep, '.')); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
188 graph.addVertex(vertex); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
189 } |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
190 // Store vertex in the table (vertex may be null.) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
191 loadedModulesTable[moduleFQNPath] = vertex; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
192 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
193 else |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
194 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
195 auto modul = new Module(moduleFilePath); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
196 // Use lightweight ImportParser. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
197 modul.parser = new ImportParser(loadFile(moduleFilePath), moduleFilePath); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
198 modul.parse(); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
199 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
200 vertex = new Vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
201 vertex.modul = modul; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
202 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
203 graph.addVertex(vertex); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
204 loadedModulesTable[modul.getFQNPath()] = vertex; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
205 |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
206 // Load the modules which this module depends on. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
207 foreach (importDecl; modul.imports) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
208 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
209 foreach (moduleFQNPath2; importDecl.getModuleFQNs(dirSep)) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
210 { |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
211 auto loaded = loadModule(moduleFQNPath2); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
212 if (loaded !is null) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
213 { |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
214 auto edge = graph.addEdge(vertex, loaded); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
215 edge.isPublic = importDecl.isPublic(); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
216 edge.isStatic = importDecl.isStatic(); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
217 } |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
218 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
219 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
220 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
221 return vertex; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
222 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
223 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
224 |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
225 void execute(string filePathString, string[] importPaths, string[] strRegexps, |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
226 uint levels, string siStyle, string piStyle, IGraphOption options) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
227 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
228 // Init regular expressions. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
229 RegExp[] regexps; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
230 foreach (strRegexp; strRegexps) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
231 regexps ~= new RegExp(strRegexp); |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
232 |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
233 // Add directory of file and global directories to import paths. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
234 auto filePath = new FilePath(filePathString); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
235 auto fileDir = filePath.folder(); |
370 | 236 if (fileDir.length) |
237 importPaths ~= fileDir; | |
238 importPaths ~= GlobalSettings.importPaths; | |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
239 |
364 | 240 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
241 auto gbuilder = new GraphBuilder; |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
242 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
243 gbuilder.importPaths = importPaths; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
244 gbuilder.options = options; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
245 gbuilder.filterPredicate = (string moduleFQNPath) { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
246 foreach (rx; regexps) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
247 // Replace slashes: dil/ast/Node -> dil.ast.Node |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
248 if (rx.test(replace(moduleFQNPath.dup, dirSep, '.'))) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
249 return true; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
250 return false; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
251 }; |
364 | 252 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
253 auto graph = gbuilder.start(filePath.name()); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
254 |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
255 if (options & (IGraphOption.PrintList | IGraphOption.PrintPaths)) |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
256 { |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
257 if (options & IGraphOption.MarkCyclicModules) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
258 graph.detectCycles(); |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
259 |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
260 if (options & IGraphOption.PrintPaths) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
261 printModulePaths(graph.vertices, levels+1, ""); |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
262 else |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
263 printModuleList(graph.vertices, levels+1, ""); |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
264 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
265 else |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
266 printDotDocument(graph, siStyle, piStyle, options); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
267 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
268 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
269 void printModulePaths(Vertex[] vertices, uint level, char[] indent) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
270 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
271 if (level == 0) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
272 return; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
273 foreach (vertex; vertices) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
274 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
275 Stdout(indent)((vertex.isCyclic?"*":"")~vertex.modul.filePath).newline; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
276 if (vertex.outgoing.length) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
277 printModulePaths(vertex.outgoing, level-1, indent~" "); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
278 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
279 } |
370 | 280 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
281 void printModuleList(Vertex[] vertices, uint level, char[] indent) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
282 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
283 if (level == 0) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
284 return; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
285 foreach (vertex; vertices) |
370 | 286 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
287 Stdout(indent)((vertex.isCyclic?"*":"")~vertex.modul.getFQN()).newline; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
288 if (vertex.outgoing.length) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
289 printModuleList(vertex.outgoing, level-1, indent~" "); |
370 | 290 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
291 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
292 |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
293 void printDotDocument(Graph graph, string siStyle, string piStyle, |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
294 IGraphOption options) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
295 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
296 Vertex[][string] verticesByPckgName; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
297 if (options & IGraphOption.GroupByFullPackageName) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
298 foreach (vertex; graph.vertices) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
299 verticesByPckgName[vertex.modul.packageName] ~= vertex; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
300 |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
301 if (options & (IGraphOption.HighlightCyclicVertices | |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
302 IGraphOption.HighlightCyclicEdges)) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
303 graph.detectCycles(); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
304 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
305 // Output header of the dot document. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
306 Stdout("Digraph ImportGraph\n{\n"); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
307 // Output nodes. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
308 // 'i' and vertex.id should be the same. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
309 foreach (i, vertex; graph.vertices) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
310 Stdout.formatln(` n{} [label="{}"{}];`, i, vertex.modul.getFQN(), (vertex.isCyclic ? ",style=filled,fillcolor=tomato" : "")); |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
311 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
312 // Output edges. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
313 foreach (edge; graph.edges) |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
314 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
315 string edgeStyles = ""; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
316 if (edge.isStatic || edge.isPublic) |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
317 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
318 edgeStyles = `[style="`; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
319 edge.isStatic && (edgeStyles ~= siStyle ~ ","); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
320 edge.isPublic && (edgeStyles ~= piStyle); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
321 edgeStyles[$-1] == ',' && (edgeStyles = edgeStyles[0..$-1]); // Remove last comma. |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
322 edgeStyles ~= `"]`; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
323 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
324 edge.isCyclic && (edgeStyles ~= "[color=red]"); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
325 Stdout.formatln(` n{} -> n{} {};`, edge.from.id, edge.to.id, edgeStyles); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
326 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
327 |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
328 if (options & IGraphOption.GroupByFullPackageName) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
329 foreach (packageName, vertices; verticesByPckgName) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
330 { // Output nodes in a cluster. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
331 Stdout.format(` subgraph "cluster_{}" {`\n` label="{}";color=blue;`"\n ", packageName, packageName); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
332 foreach (vertex; vertices) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
333 Stdout.format(`n{};`, vertex.id); |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
334 Stdout("\n }\n"); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
335 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
336 |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
337 Stdout("}\n"); |
364 | 338 } |
370 | 339 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
340 /+ |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
341 // This is the old algorithm that was used to detect cycles in a directed graph. |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
342 void analyzeGraph(Vertex[] vertices_init, Edge[] edges) |
370 | 343 { |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
344 void recursive(Vertex[] vertices) |
370 | 345 { |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
346 foreach (idx, vertex; vertices) |
370 | 347 { |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
348 uint outgoing, incoming; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
349 foreach (j, edge; edges) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
350 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
351 if (edge.from is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
352 outgoing++; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
353 if (edge.to is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
354 incoming++; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
355 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
356 |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
357 if (outgoing == 0) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
358 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
359 if (incoming != 0) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
360 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
361 // Vertex is a sink. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
362 alias outgoing i; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
363 alias incoming j; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
364 // Remove edges. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
365 for (i=j=0; i < edges.length; i++) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
366 if (edges[i].to !is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
367 edges[j++] = edges[i]; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
368 edges.length = j; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
369 vertices = vertices[0..idx] ~ vertices[idx+1..$]; |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
370 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
371 return; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
372 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
373 else |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
374 { |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
375 // Edges to this vertex were removed previously. |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
376 // Only remove vertex now. |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
377 vertices = vertices[0..idx] ~ vertices[idx+1..$]; |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
378 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
379 return; |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
380 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
381 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
382 else if (incoming == 0) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
383 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
384 // Vertex is a source |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
385 alias outgoing i; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
386 alias incoming j; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
387 // Remove edges. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
388 for (i=j=0; i < edges.length; i++) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
389 if (edges[i].from !is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
390 edges[j++] = edges[i]; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
391 edges.length = j; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
392 vertices = vertices[0..idx] ~ vertices[idx+1..$]; |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
393 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
394 return; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
395 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
396 // else |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
397 // { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
398 // // source && sink |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
399 // // continue loop. |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
400 // } |
370 | 401 } |
402 | |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
403 // When reaching this point it means only cylic edges and vertices are left. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
404 foreach (vertex; vertices) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
405 vertex.isCyclic = true; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
406 foreach (edge; edges) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
407 if (edge) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
408 edge.isCyclic = true; |
370 | 409 } |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
410 recursive(vertices_init); |
370 | 411 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
412 +/ |