Mercurial > projects > dil
annotate src/cmd/ImportGraph.d @ 810:525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Added options -I, -release and -unittest to the compile command.
Tidied main.d up a bit.
Renamed start() methods of SemanticPass1 and 2 to run().
Moved function findModuleFilePath() to class ModuleManager.
Added msg CouldntLoadModule. Corrected two others.
Added member semanticPass to class Module.
Implemented visit(ImportDeclaration) in SemanticPass1.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Tue, 11 Mar 2008 02:48:01 +0100 |
parents | 7e84472f4e91 |
children | 80eb3251e010 |
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; |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
11 import dil.SourceText; |
780
edd217e14736
Using CompilationContext in command 'igraph'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
779
diff
changeset
|
12 import dil.Compilation; |
810
525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
809
diff
changeset
|
13 import dil.ModuleManager; |
779
8e6fed11bb68
Moved Settings.d and SettingsLoader.d to src/.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
764
diff
changeset
|
14 import Settings; |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
15 import common; |
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
16 |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
17 import tango.text.Regex : RegExp = Regex; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
18 import tango.io.FilePath; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
19 import tango.io.FileConst; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
20 import tango.text.Util; |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
21 |
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
22 alias FileConst.PathSeparatorChar dirSep; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
23 |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
24 /// The importgraph command. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
25 struct IGraphCommand |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
26 { |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
27 /// Options for the command. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
28 enum Option |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
29 { |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
30 None, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
31 IncludeUnlocatableModules = 1, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
32 PrintDot = 1<<1, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
33 HighlightCyclicEdges = 1<<2, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
34 HighlightCyclicVertices = 1<<3, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
35 GroupByPackageNames = 1<<4, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
36 GroupByFullPackageName = 1<<5, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
37 PrintPaths = 1<<6, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
38 PrintList = 1<<7, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
39 MarkCyclicModules = 1<<8, |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
40 } |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
41 alias Option Options; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
42 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
43 Options options; /// Command options. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
44 string filePath; /// File path to the root module. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
45 string[] regexps; /// Regular expressions. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
46 string siStyle = "dashed"; /// Static import style. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
47 string piStyle = "bold"; /// Public import style. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
48 uint levels; /// How many levels to print. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
49 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
50 CompilationContext context; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
51 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
52 /// Adds o to the options. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
53 void add(Option o) |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
54 { |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
55 options |= o; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
56 } |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
57 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
58 void run() |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
59 { |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
60 // Init regular expressions. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
61 RegExp[] regexps; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
62 foreach (strRegexp; this.regexps) |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
63 regexps ~= new RegExp(strRegexp); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
64 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
65 // Add the directory of the file to the import paths. |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
66 auto filePath = new FilePath(this.filePath); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
67 auto fileDir = filePath.folder(); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
68 context.importPaths ~= fileDir; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
69 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
70 auto gbuilder = new GraphBuilder; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
71 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
72 gbuilder.importPaths = context.importPaths; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
73 gbuilder.options = options; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
74 gbuilder.filterPredicate = (string moduleFQNPath) { |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
75 foreach (rx; regexps) |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
76 // Replace slashes: dil/ast/Node -> dil.ast.Node |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
77 if (rx.test(replace(moduleFQNPath.dup, dirSep, '.'))) |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
78 return true; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
79 return false; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
80 }; |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
81 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
82 auto graph = gbuilder.start(filePath.name()); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
83 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
84 if (options & (Option.PrintList | Option.PrintPaths)) |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
85 { |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
86 if (options & Option.MarkCyclicModules) |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
87 graph.detectCycles(); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
88 |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
89 if (options & Option.PrintPaths) |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
90 printModulePaths(graph.vertices, levels+1, ""); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
91 else |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
92 printModuleList(graph.vertices, levels+1, ""); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
93 } |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
94 else |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
95 printDotDocument(graph, siStyle, piStyle, options); |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
96 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
97 } |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
98 |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
99 /// Represents a module dependency graph. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
100 class Graph |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
101 { |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
102 Vertex[] vertices; /// The vertices or modules. |
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
103 Edge[] edges; /// The edges or import statements. |
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 void addVertex(Vertex vertex) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
106 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
107 vertex.id = vertices.length; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
108 vertices ~= vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
109 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
110 |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
111 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
|
112 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
113 auto edge = new Edge(from, to); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
114 edges ~= edge; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
115 from.outgoing ~= to; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
116 to.incoming ~= from; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
117 return edge; |
698
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 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
120 /// 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
|
121 void detectCycles() |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
122 { // 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
|
123 // 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
|
124 |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
125 // 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
|
126 // 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
|
127 /+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
|
128 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
129 switch (vertex.status) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
130 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
131 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
|
132 vertex.isCyclic = true; |
699
4c0ea78a7f8b
Fixed cycle detection algorithm.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
698
diff
changeset
|
133 return true; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
134 case Vertex.Status.None: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
135 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
|
136 foreach (outVertex; vertex.outgoing) // Visit successors. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
137 vertex.isCyclic |= visit(outVertex); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
138 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
|
139 break; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
140 case Vertex.Status.Visited: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
141 break; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
142 default: |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
143 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
|
144 } |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
145 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
|
146 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
147 // Start visiting vertices. |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
148 visit(vertices[0]);+/ |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
149 |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
150 //foreach (edge; edges) |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
151 // 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
|
152 // edge.isCyclic = true; |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
153 |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
154 // Use functioning algorithm. |
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
155 analyzeGraph(vertices, edges); |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
156 } |
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 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
159 /// 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
|
160 class Edge |
370 | 161 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
162 Vertex from; /// Coming from vertex. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
163 Vertex to; /// Going to vertex. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
164 bool isCyclic; /// Edge connects cyclic vertices. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
165 bool isPublic; /// Public import. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
166 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
|
167 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
168 this(Vertex from, Vertex to) |
370 | 169 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
170 this.from = from; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
171 this.to = to; |
370 | 172 } |
173 } | |
174 | |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
175 /// 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
|
176 class Vertex |
367
dda55fae37de
- ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents:
366
diff
changeset
|
177 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
178 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
|
179 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
|
180 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
|
181 Vertex[] outgoing; /// Also called successors. |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
182 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
|
183 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
184 enum Status : ubyte |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
185 { None, Visiting, Visited } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
186 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
|
187 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
188 |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
189 /// Builds a module dependency graph. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
190 class GraphBuilder |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
191 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
192 Graph graph; |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
193 IGraphCommand.Options options; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
194 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
|
195 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
|
196 bool delegate(string) filterPredicate; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
197 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
198 this() |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
199 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
200 this.graph = new Graph; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
201 } |
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 /// Start building the graph and return that. |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
204 /// Params: |
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
205 /// fileName = the file name of the root module. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
206 Graph start(string fileName) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
207 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
208 loadModule(fileName); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
209 return graph; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
210 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
211 |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
212 /// Loads all modules recursively and builds the graph at the same time. |
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
213 /// Params: |
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
214 /// moduleFQNPath = the path version of the module FQN.$(BR) |
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
215 /// E.g.: FQN = dil.ast.Node -> FQNPath = dil/ast/Node |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
216 Vertex loadModule(string moduleFQNPath) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
217 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
218 // 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
|
219 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
|
220 if (pVertex !is null) |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
221 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
|
222 |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
223 // Filter out modules. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
224 if (filterPredicate && filterPredicate(moduleFQNPath)) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
225 { // Store null for filtered modules. |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
226 loadedModulesTable[moduleFQNPath] = null; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
227 return null; |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
228 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
229 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
230 // Locate the module in the file system. |
810
525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
809
diff
changeset
|
231 auto moduleFilePath = ModuleManager.findModuleFilePath( |
525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
809
diff
changeset
|
232 moduleFQNPath, |
525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
809
diff
changeset
|
233 importPaths |
525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
809
diff
changeset
|
234 ); |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
235 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
236 Vertex vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
237 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
238 if (moduleFilePath is null) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
239 { // Module not found. |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
240 if (options & IGraphCommand.Option.IncludeUnlocatableModules) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
241 { // Include module nevertheless. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
242 vertex = new Vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
243 vertex.modul = new Module(""); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
244 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
|
245 graph.addVertex(vertex); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
246 } |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
247 // 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
|
248 loadedModulesTable[moduleFQNPath] = vertex; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
249 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
250 else |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
251 { |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
252 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
|
253 // Use lightweight ImportParser. |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
720
diff
changeset
|
254 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
|
255 modul.parse(); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
256 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
257 vertex = new Vertex; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
258 vertex.modul = modul; |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
259 |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
260 graph.addVertex(vertex); |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
261 loadedModulesTable[modul.getFQNPath()] = vertex; |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
262 |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
263 // 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
|
264 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
|
265 { |
702
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
266 foreach (moduleFQNPath2; importDecl.getModuleFQNs(dirSep)) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
267 { |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
268 auto loaded = loadModule(moduleFQNPath2); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
269 if (loaded !is null) |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
270 { |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
271 auto edge = graph.addEdge(vertex, loaded); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
272 edge.isPublic = importDecl.isPublic(); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
273 edge.isStatic = importDecl.isStatic(); |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
274 } |
e10838e0b182
Fixed filter delegate in cmd.ImportGraph.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
699
diff
changeset
|
275 } |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
276 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
277 } |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
278 return vertex; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
279 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
280 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
281 |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
282 /// Prints the file paths to the modules. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
283 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
|
284 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
285 if (level == 0) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
286 return; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
287 foreach (vertex; vertices) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
288 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
289 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
|
290 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
|
291 printModulePaths(vertex.outgoing, level-1, indent~" "); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
292 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
293 } |
370 | 294 |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
295 /// Prints a list of module FQNs. |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
296 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
|
297 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
298 if (level == 0) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
299 return; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
300 foreach (vertex; vertices) |
370 | 301 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
302 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
|
303 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
|
304 printModuleList(vertex.outgoing, level-1, indent~" "); |
370 | 305 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
306 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
307 |
785
57ef69eced96
Added functions isCodeSection() and skipCodeSection().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
780
diff
changeset
|
308 /// Prints the graph as a graphviz dot document. |
703
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
309 void printDotDocument(Graph graph, string siStyle, string piStyle, |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
310 IGraphCommand.Options options) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
311 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
312 Vertex[][string] verticesByPckgName; |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
313 if (options & IGraphCommand.Option.GroupByFullPackageName) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
314 foreach (vertex; graph.vertices) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
315 verticesByPckgName[vertex.modul.packageName] ~= vertex; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
316 |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
317 if (options & (IGraphCommand.Option.HighlightCyclicVertices | |
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
318 IGraphCommand.Option.HighlightCyclicEdges)) |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
319 graph.detectCycles(); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
320 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
321 // 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
|
322 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
|
323 // Output nodes. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
324 // '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
|
325 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
|
326 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
|
327 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
328 // Output edges. |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
329 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
|
330 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
331 string edgeStyles = ""; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
332 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
|
333 { |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
334 edgeStyles = `[style="`; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 edgeStyles ~= `"]`; |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
339 } |
bf10602159c1
Added static and public import styles to 'igraph' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
702
diff
changeset
|
340 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
|
341 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
|
342 } |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
343 |
809
7e84472f4e91
Refactored the importgraph command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
344 if (options & IGraphCommand.Option.GroupByFullPackageName) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
345 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
|
346 { // 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
|
347 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
|
348 foreach (vertex; vertices) |
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
349 Stdout.format(`n{};`, vertex.id); |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
350 Stdout("\n }\n"); |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
351 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
352 |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
375
diff
changeset
|
353 Stdout("}\n"); |
364 | 354 } |
370 | 355 |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
356 // 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
|
357 void analyzeGraph(Vertex[] vertices_init, Edge[] edges) |
370 | 358 { |
720
74cdbb25c7c8
Using old algo for cycle detection again.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
719
diff
changeset
|
359 edges = edges.dup; |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
360 void recursive(Vertex[] vertices) |
370 | 361 { |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
362 foreach (idx, vertex; vertices) |
370 | 363 { |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
364 uint outgoing, incoming; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
365 foreach (j, edge; edges) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
366 { |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
367 if (edge.from is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
368 outgoing++; |
698
1564e41f454e
Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
369 if (edge.to is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
370 incoming++; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
371 } |
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 if (outgoing == 0) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
374 { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
375 if (incoming != 0) |
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 // Vertex is a sink. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
378 alias outgoing i; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
379 alias incoming j; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
380 // Remove edges. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
381 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
|
382 if (edges[i].to !is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
383 edges[j++] = edges[i]; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
384 edges.length = j; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
385 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
|
386 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
387 return; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
388 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
389 else |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
390 { |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
391 // 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
|
392 // Only remove vertex now. |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
393 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
|
394 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
395 return; |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
396 } |
375
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 else if (incoming == 0) |
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 // Vertex is a source |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
401 alias outgoing i; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
402 alias incoming j; // Reuse |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
403 // Remove edges. |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
404 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
|
405 if (edges[i].from !is vertex) |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
406 edges[j++] = edges[i]; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
407 edges.length = j; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
408 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
|
409 recursive(vertices); |
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
410 return; |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
411 } |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
412 // else |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
413 // { |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
414 // // source && sink |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
415 // // continue loop. |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
416 // } |
370 | 417 } |
418 | |
375
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
419 // 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
|
420 foreach (vertex; vertices) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
421 vertex.isCyclic = true; |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
422 foreach (edge; edges) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
423 if (edge) |
0bd21b746a04
- Added code to main() for recognizing options to the importgraph command.
aziz
parents:
370
diff
changeset
|
424 edge.isCyclic = true; |
370 | 425 } |
431
7a6bfa569a52
Fix: analyzeGraph() should work correctly now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
427
diff
changeset
|
426 recursive(vertices_init); |
370 | 427 } |