Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 library compiler.tool.util; | |
| 2 | |
| 3 import 'package:compiler/src/info/info.dart'; | |
| 4 import 'graph.dart'; | |
| 5 | |
| 6 /// Computes a graph of dependencies from [info]. | |
| 7 Graph<Info> graphFromInfo(AllInfo info) { | |
| 8 // Note: currently we build two graphs to debug the differences between to | |
| 9 // places where we collect this information in dump-info. | |
| 10 // TODO(sigmund): fix inconsistencies between graphs, stick with one of them. | |
| 11 // TODO(sigmund): create a concrete implementation of InfoGraph, instead of | |
| 12 // using the EdgeListGraph. | |
| 13 var g1 = new EdgeListGraph<Info>(); | |
| 14 var g2 = new EdgeListGraph<Info>(); | |
| 15 var g3 = new EdgeListGraph<Info>(); | |
| 16 for (var f in info.functions) { | |
| 17 g1.addNode(f); | |
| 18 g3.addNode(f); | |
| 19 for (var g in f.uses) { | |
| 20 if (g.target == null) print(g.toJson()); | |
|
Harry Terkelsen
2015/08/11 22:57:42
only for debugging?
Siggi Cherem (dart-lang)
2015/08/12 00:06:01
True. removed
| |
| 21 g1.addEdge(f, g.target); | |
| 22 g3.addEdge(f, g.target); | |
| 23 } | |
| 24 g2.addNode(f); | |
| 25 if (info.dependencies[f] != null) { | |
| 26 for (var g in info.dependencies[f]) { | |
| 27 g2.addEdge(f, g); | |
| 28 g3.addEdge(f, g); | |
| 29 } | |
| 30 } | |
| 31 } | |
| 32 | |
| 33 for (var f in info.fields) { | |
| 34 g1.addNode(f); | |
| 35 g3.addNode(f); | |
| 36 for (var g in f.uses) { | |
| 37 g1.addEdge(f, g.target); | |
| 38 g3.addEdge(f, g.target); | |
| 39 } | |
| 40 g2.addNode(f); | |
| 41 g3.addNode(f); | |
|
Harry Terkelsen
2015/08/11 22:57:42
already added f to g3 above
Siggi Cherem (dart-lang)
2015/08/12 00:06:01
Good catch. Done
| |
| 42 if (info.dependencies[f] != null) { | |
| 43 for (var g in info.dependencies[f]) { | |
| 44 g2.addEdge(f, g); | |
| 45 g3.addEdge(f, g); | |
| 46 } | |
| 47 } | |
| 48 } | |
| 49 | |
| 50 // Note: these checks right now show that 'uses' links are computed | |
| 51 // differently than 'deps' links | |
| 52 int more1 = 0; | |
| 53 int more2 = 0; | |
| 54 int more1b = 0; | |
| 55 int more2b = 0; | |
| 56 _sameEdges(f) { | |
| 57 var targets1 = g1.targetsOf(f).toSet(); | |
| 58 var targets2 = g2.targetsOf(f).toSet(); | |
| 59 var len1 = targets1.length; | |
| 60 var len2 = targets2.length; | |
| 61 if (len1 > len2) more1b++; | |
| 62 if (len1 < len2) more2b++; | |
| 63 var diff1 = targets1.difference(targets2); | |
| 64 var diff2 = targets2.difference(targets1); | |
| 65 if (diff1.isNotEmpty) { | |
| 66 more1++; | |
| 67 } | |
| 68 if (diff2.isNotEmpty) { | |
| 69 more2++; | |
| 70 } | |
| 71 return true; | |
| 72 } | |
| 73 info.functions.forEach(_sameEdges); | |
| 74 info.fields.forEach(_sameEdges); | |
| 75 if (more1 > 0 || more2 > 0 || more1b > 0 || more2b > 0) { | |
| 76 print("Dep graph is not consistent: $more1 $more2"); | |
| 77 } | |
| 78 | |
| 79 return g3; | |
| 80 } | |
| 81 | |
| 82 /// Provide a unique long name associated with [info]. | |
| 83 // TODO(sigmund): guarantee that the name is actually unique. | |
| 84 String longName(Info info) { | |
| 85 var sb = new StringBuffer(); | |
| 86 helper(i) { | |
| 87 if (i.parent == null) { | |
| 88 // TODO(sigmund): ensure `i is LibraryInfo`, we still don't set parents | |
| 89 // for closure classes correctly. | |
| 90 sb.write('${i.name}..'); | |
| 91 } else { | |
| 92 helper(i.parent); | |
| 93 sb.write('.${i.name}'); | |
| 94 } | |
| 95 } | |
| 96 helper(info); | |
| 97 return sb.toString(); | |
| 98 } | |
| OLD | NEW |