OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// This tools verifies that all elements that are included in the output are | 5 /// This tools verifies that all elements that are included in the output are |
6 /// reachable from the program entrypoint. If there are elements that are not | 6 /// reachable from the program entrypoint. If there are elements that are not |
7 /// reachable from the entrypoint, then this indicates that we are missing | 7 /// reachable from the entrypoint, then this indicates that we are missing |
8 /// dependencies. If all functions are reachable from the entrypoint, this | 8 /// dependencies. If all functions are reachable from the entrypoint, this |
9 /// script will return with exitcode 0. Otherwise it will list the unreachable | 9 /// script will return with exitcode 0. Otherwise it will list the unreachable |
10 /// functions and return with exitcode 1. | 10 /// functions and return with exitcode 1. |
11 library dart2js_info.bin.verify_deps; | 11 library dart2js_info.bin.verify_deps; |
12 | 12 |
13 import 'dart:async'; | 13 import 'dart:async'; |
14 import 'dart:convert'; | 14 import 'dart:convert'; |
15 import 'dart:io'; | 15 import 'dart:io'; |
16 | 16 |
17 import 'package:dart2js_info/info.dart'; | 17 import 'package:dart2js_info/info.dart'; |
18 import 'package:dart2js_info/src/graph.dart'; | 18 import 'package:dart2js_info/src/graph.dart'; |
19 import 'package:dart2js_info/src/util.dart'; | 19 import 'package:dart2js_info/src/util.dart'; |
20 | 20 |
21 Future main(List<String> args) async { | 21 Future main(List<String> args) async { |
22 if (args.length > 1) { | 22 if (args.length > 1) { |
23 printUsage(); | 23 printUsage(); |
24 exit(1); | 24 exit(1); |
25 } | 25 } |
26 var json = JSON.decode(await new File(args[0]).readAsString()); | 26 var json = JSON.decode(await new File(args[0]).readAsString()); |
27 var info = new AllInfo.fromJson(json); | 27 var info = new AllInfoJsonCodec().decode(json); |
28 var graph = graphFromInfo(info); | 28 var graph = graphFromInfo(info); |
29 var entrypoint = info.program.entrypoint; | 29 var entrypoint = info.program.entrypoint; |
30 var reachables = findReachable(graph, entrypoint); | 30 var reachables = findReachable(graph, entrypoint); |
31 | 31 |
32 var unreachables = info.functions.where((func) => !reachables.contains(func)); | 32 var unreachables = info.functions.where((func) => !reachables.contains(func)); |
33 if (unreachables.isNotEmpty) { | 33 if (unreachables.isNotEmpty) { |
34 unreachables.forEach(print); | 34 unreachables.forEach(print); |
35 exit(1); | 35 exit(1); |
36 } else { | 36 } else { |
37 print('all elements are reachable from the entrypoint'); | 37 print('all elements are reachable from the entrypoint'); |
38 } | 38 } |
39 } | 39 } |
40 | 40 |
41 /// Finds the set of nodes reachable from [start] in [graph]. | 41 /// Finds the set of nodes reachable from [start] in [graph]. |
42 Set<Info> findReachable(Graph<Info> graph, Info start) { | 42 Set<Info> findReachable(Graph<Info> graph, Info start) { |
43 var visited = new Set<Info>(); | 43 var visited = new Set<Info>(); |
44 var stack = <Info>[start]; | 44 var stack = <Info>[start]; |
45 while (stack.isNotEmpty) { | 45 while (stack.isNotEmpty) { |
46 var next = stack.removeLast(); | 46 var next = stack.removeLast(); |
47 visited.add(next); | 47 visited.add(next); |
48 stack.addAll( | 48 stack.addAll( |
49 graph.targetsOf(next).where((target) => !visited.contains(target))); | 49 graph.targetsOf(next).where((target) => !visited.contains(target))); |
50 } | 50 } |
51 return visited; | 51 return visited; |
52 } | 52 } |
53 | 53 |
54 void printUsage() { | 54 void printUsage() { |
55 print('usage: dart2js_info_verify_deps <info file>'); | 55 print('usage: dart2js_info_verify_deps <info file>'); |
56 } | 56 } |
OLD | NEW |