Mercurial > projects > dil
annotate trunk/src/cmd/ImportGraph.d @ 755:90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Wed, 13 Feb 2008 20:21:25 +0100 |
parents | 74cdbb25c7c8 |
children | 4579e8505d5e |
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; |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
13 import dil.SourceText; |
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
14 import common; |
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
15 |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
16 import tango.text.Regex : RegExp = Regex; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
17 import tango.io.FilePath; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
18 import tango.io.FileConst; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
19 import tango.text.Util; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
20 |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
21 alias FileConst.PathSeparatorChar dirSep; |
375
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 enum IGraphOption |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
24 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
25 None, |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
26 IncludeUnlocatableModules = 1, |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
27 PrintDot = 1<<1, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
28 HighlightCyclicEdges = 1<<2, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
29 HighlightCyclicVertices = 1<<3, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
30 GroupByPackageNames = 1<<4, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
31 GroupByFullPackageName = 1<<5, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
32 PrintPaths = 1<<6, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
33 PrintList = 1<<7, |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
34 MarkCyclicModules = 1<<8, |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
35 } |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
36 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
37 class Graph |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
38 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
39 Vertex[] vertices; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
40 Edge[] edges; |
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 void addVertex(Vertex vertex) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
43 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
44 vertex.id = vertices.length; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
45 vertices ~= vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
46 } |
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 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
|
49 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
50 auto edge = new Edge(from, to); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
51 edges ~= edge; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
52 from.outgoing ~= to; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
53 to.incoming ~= from; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
54 return edge; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
55 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
56 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
57 /// 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
|
58 void detectCycles() |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
59 { // 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
|
60 // 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
|
61 |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
62 // Commented out because this algorithm doesn't work. |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
63 // Returns true if the vertex is in status Visiting. |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
64 /+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
|
65 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
66 switch (vertex.status) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
67 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
68 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
|
69 vertex.isCyclic = true; |
699
4c0ea78a7f8b
Fixed cycle detection algorithm.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
698
diff
changeset
|
70 return true; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
71 case Vertex.Status.None: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
72 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
|
73 foreach (outVertex; vertex.outgoing) // Visit successors. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
74 vertex.isCyclic |= visit(outVertex); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
75 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
|
76 break; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
77 case Vertex.Status.Visited: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
78 break; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
79 default: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
80 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
|
81 } |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
82 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
|
83 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
84 // Start visiting vertices. |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
85 visit(vertices[0]);+/ |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
86 |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
87 //foreach (edge; edges) |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
88 // if (edge.from.isCyclic && edge.to.isCyclic) |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
89 // edge.isCyclic = true; |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
90 |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
91 // Use functioning algorithm. |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
92 analyzeGraph(vertices, edges); |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
93 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
94 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
95 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
96 /// 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
|
97 class Edge |
370 | 98 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
99 Vertex from; /// Coming from vertex. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
100 Vertex to; /// Going to vertex. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
101 bool isCyclic; /// Edge connects cyclic vertices. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
102 bool isPublic; /// Public import. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
103 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
|
104 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
105 this(Vertex from, Vertex to) |
370 | 106 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
107 this.from = from; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
108 this.to = to; |
370 | 109 } |
110 } | |
111 | |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
112 /// 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
|
113 class Vertex |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
114 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
115 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
|
116 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
|
117 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
|
118 Vertex[] outgoing; /// Also called successors. |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
119 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
|
120 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
121 enum Status : ubyte |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
122 { None, Visiting, Visited } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
123 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
|
124 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
125 |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
126 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
|
127 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
128 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
|
129 foreach (importPath; importPaths) |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
130 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
131 filePath.set(importPath); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
132 filePath.append(moduleFQNPath); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
133 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
|
134 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
135 filePath.suffix(moduleSuffix); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
136 if (filePath.exists()) |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
137 return filePath.toString(); |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
138 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
139 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
140 return null; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
141 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
142 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
143 class GraphBuilder |
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 Graph graph; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
146 IGraphOption options; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
147 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
|
148 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
|
149 bool delegate(string) filterPredicate; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
150 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
151 this() |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
152 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
153 this.graph = new Graph; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
154 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
155 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
156 /// 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
|
157 Graph start(string fileName) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
158 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
159 loadModule(fileName); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
160 return graph; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
161 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
162 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
163 /++ |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
164 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
|
165 Params: |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
166 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
|
167 +/ |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
168 Vertex loadModule(string moduleFQNPath) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
169 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
170 // 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
|
171 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
|
172 if (pVertex !is null) |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
173 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
|
174 |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
175 // Filter out modules. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
176 if (filterPredicate && filterPredicate(moduleFQNPath)) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
177 { // Store null for filtered modules. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
178 loadedModulesTable[moduleFQNPath] = null; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
179 return null; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
180 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
181 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
182 // 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
|
183 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
|
184 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
185 Vertex vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
186 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
187 if (moduleFilePath is null) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
188 { // Module not found. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
189 if (options & IGraphOption.IncludeUnlocatableModules) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
190 { // Include module nevertheless. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
191 vertex = new Vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
192 vertex.modul = new Module(""); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
193 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
|
194 graph.addVertex(vertex); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
195 } |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
196 // 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
|
197 loadedModulesTable[moduleFQNPath] = vertex; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
198 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
199 else |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
200 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
201 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
|
202 // Use lightweight ImportParser. |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
203 modul.setParser(new ImportParser(modul.sourceText)); |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
204 modul.parse(); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
205 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
206 vertex = new Vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
207 vertex.modul = modul; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
208 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
209 graph.addVertex(vertex); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
210 loadedModulesTable[modul.getFQNPath()] = vertex; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
211 |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
212 // 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
|
213 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
|
214 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
215 foreach (moduleFQNPath2; importDecl.getModuleFQNs(dirSep)) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
216 { |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
217 auto loaded = loadModule(moduleFQNPath2); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
218 if (loaded !is null) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
219 { |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
220 auto edge = graph.addEdge(vertex, loaded); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
221 edge.isPublic = importDecl.isPublic(); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
222 edge.isStatic = importDecl.isStatic(); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
223 } |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
224 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
225 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
226 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
227 return vertex; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
228 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
229 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
230 |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
231 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
|
232 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
|
233 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
234 // Init regular expressions. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
235 RegExp[] regexps; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
236 foreach (strRegexp; strRegexps) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
237 regexps ~= new RegExp(strRegexp); |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
238 |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
239 // 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
|
240 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
|
241 auto fileDir = filePath.folder(); |
719
8f8c9ab3f3ba
Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
703
diff
changeset
|
242 importPaths ~= fileDir; |
370 | 243 importPaths ~= GlobalSettings.importPaths; |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
244 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
245 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
|
246 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
247 gbuilder.importPaths = importPaths; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
248 gbuilder.options = options; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
249 gbuilder.filterPredicate = (string moduleFQNPath) { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
250 foreach (rx; regexps) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
251 // 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
|
252 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
|
253 return true; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
254 return false; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
255 }; |
364 | 256 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
257 auto graph = gbuilder.start(filePath.name()); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
258 |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
259 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
|
260 { |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
261 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
|
262 graph.detectCycles(); |
427
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
263 |
e2bbc6406a14
Added a new option '-m' to the igraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
264 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
|
265 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
|
266 else |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
267 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
|
268 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
269 else |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
270 printDotDocument(graph, siStyle, piStyle, options); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
271 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
272 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
273 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
|
274 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
275 if (level == 0) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
276 return; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
277 foreach (vertex; vertices) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
278 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
279 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
|
280 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
|
281 printModulePaths(vertex.outgoing, level-1, indent~" "); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
282 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
283 } |
370 | 284 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
285 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
|
286 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
287 if (level == 0) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
288 return; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
289 foreach (vertex; vertices) |
370 | 290 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
291 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
|
292 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
|
293 printModuleList(vertex.outgoing, level-1, indent~" "); |
370 | 294 } |
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 |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
297 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
|
298 IGraphOption options) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
299 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
300 Vertex[][string] verticesByPckgName; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
301 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
|
302 foreach (vertex; graph.vertices) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
303 verticesByPckgName[vertex.modul.packageName] ~= vertex; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
304 |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
305 if (options & (IGraphOption.HighlightCyclicVertices | |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
306 IGraphOption.HighlightCyclicEdges)) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
307 graph.detectCycles(); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
308 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
309 // 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
|
310 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
|
311 // Output nodes. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
312 // '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
|
313 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
|
314 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
|
315 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
316 // Output edges. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
317 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
|
318 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
319 string edgeStyles = ""; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
320 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
|
321 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
322 edgeStyles = `[style="`; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
323 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
|
324 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
|
325 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
|
326 edgeStyles ~= `"]`; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
327 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
328 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
|
329 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
|
330 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
331 |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
332 if (options & IGraphOption.GroupByFullPackageName) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
333 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
|
334 { // 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
|
335 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
|
336 foreach (vertex; vertices) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
337 Stdout.format(`n{};`, vertex.id); |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
338 Stdout("\n }\n"); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
339 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
340 |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
341 Stdout("}\n"); |
364 | 342 } |
370 | 343 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
344 // 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
|
345 void analyzeGraph(Vertex[] vertices_init, Edge[] edges) |
370 | 346 { |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
347 edges = edges.dup; |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
348 void recursive(Vertex[] vertices) |
370 | 349 { |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
350 foreach (idx, vertex; vertices) |
370 | 351 { |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
352 uint outgoing, incoming; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
353 foreach (j, edge; edges) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
354 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
355 if (edge.from is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
356 outgoing++; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
357 if (edge.to is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
358 incoming++; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
359 } |
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 if (outgoing == 0) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
362 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
363 if (incoming != 0) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
364 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
365 // Vertex is a sink. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
366 alias outgoing i; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
367 alias incoming j; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
368 // Remove edges. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
369 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
|
370 if (edges[i].to !is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
371 edges[j++] = edges[i]; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
372 edges.length = j; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
373 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
|
374 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
375 return; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
376 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
377 else |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
378 { |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
379 // 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
|
380 // Only remove vertex now. |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
381 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
|
382 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
383 return; |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
384 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
385 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
386 else if (incoming == 0) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
387 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
388 // Vertex is a source |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
389 alias outgoing i; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
390 alias incoming j; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
391 // Remove edges. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
392 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
|
393 if (edges[i].from !is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
394 edges[j++] = edges[i]; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
395 edges.length = j; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
396 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
|
397 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
398 return; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
399 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
400 // else |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
401 // { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
402 // // source && sink |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
403 // // continue loop. |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
404 // } |
370 | 405 } |
406 | |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
407 // 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
|
408 foreach (vertex; vertices) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
409 vertex.isCyclic = true; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
410 foreach (edge; edges) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
411 if (edge) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
412 edge.isCyclic = true; |
370 | 413 } |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
414 recursive(vertices_init); |
370 | 415 } |