| 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 g1.addEdge(f, g.target); | |
| 21 g3.addEdge(f, g.target); | |
| 22 } | |
| 23 g2.addNode(f); | |
| 24 if (info.dependencies[f] != null) { | |
| 25 for (var g in info.dependencies[f]) { | |
| 26 g2.addEdge(f, g); | |
| 27 g3.addEdge(f, g); | |
| 28 } | |
| 29 } | |
| 30 } | |
| 31 | |
| 32 for (var f in info.fields) { | |
| 33 g1.addNode(f); | |
| 34 g3.addNode(f); | |
| 35 for (var g in f.uses) { | |
| 36 g1.addEdge(f, g.target); | |
| 37 g3.addEdge(f, g.target); | |
| 38 } | |
| 39 g2.addNode(f); | |
| 40 if (info.dependencies[f] != null) { | |
| 41 for (var g in info.dependencies[f]) { | |
| 42 g2.addEdge(f, g); | |
| 43 g3.addEdge(f, g); | |
| 44 } | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 // Note: these checks right now show that 'uses' links are computed | |
| 49 // differently than 'deps' links | |
| 50 int more1 = 0; | |
| 51 int more2 = 0; | |
| 52 int more1b = 0; | |
| 53 int more2b = 0; | |
| 54 _sameEdges(f) { | |
| 55 var targets1 = g1.targetsOf(f).toSet(); | |
| 56 var targets2 = g2.targetsOf(f).toSet(); | |
| 57 var len1 = targets1.length; | |
| 58 var len2 = targets2.length; | |
| 59 if (len1 > len2) more1b++; | |
| 60 if (len1 < len2) more2b++; | |
| 61 var diff1 = targets1.difference(targets2); | |
| 62 var diff2 = targets2.difference(targets1); | |
| 63 if (diff1.isNotEmpty) { | |
| 64 more1++; | |
| 65 } | |
| 66 if (diff2.isNotEmpty) { | |
| 67 more2++; | |
| 68 } | |
| 69 return true; | |
| 70 } | |
| 71 info.functions.forEach(_sameEdges); | |
| 72 info.fields.forEach(_sameEdges); | |
| 73 if (more1 > 0 || more2 > 0 || more1b > 0 || more2b > 0) { | |
| 74 print("Dep graph is not consistent: $more1 $more2"); | |
| 75 } | |
| 76 | |
| 77 return g3; | |
| 78 } | |
| 79 | |
| 80 /// Provide a unique long name associated with [info]. | |
| 81 // TODO(sigmund): guarantee that the name is actually unique. | |
| 82 String longName(Info info) { | |
| 83 var sb = new StringBuffer(); | |
| 84 helper(i) { | |
| 85 if (i.parent == null) { | |
| 86 // TODO(sigmund): ensure `i is LibraryInfo`, we still don't set parents | |
| 87 // for closure classes correctly. | |
| 88 sb.write('${i.name}..'); | |
| 89 } else { | |
| 90 helper(i.parent); | |
| 91 sb.write('.${i.name}'); | |
| 92 } | |
| 93 } | |
| 94 helper(info); | |
| 95 return sb.toString(); | |
| 96 } | |
| OLD | NEW |