make dart2js_info strong-mode clean

R=sigmund@google.com

Review URL: https://codereview.chromium.org//2233093003 .
diff --git a/.analysis_options b/.analysis_options
new file mode 100644
index 0000000..518eb90
--- /dev/null
+++ b/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
\ No newline at end of file
diff --git a/bin/code_deps.dart b/bin/code_deps.dart
index a90df78..c9b0544 100644
--- a/bin/code_deps.dart
+++ b/bin/code_deps.dart
@@ -96,12 +96,12 @@
 
   List<Info> run(Graph<Info> graph) {
     var seen = {source: null};
-    var queue = new Queue();
+    var queue = new Queue<Info>();
     queue.addLast(source);
     while (queue.isNotEmpty) {
       var node = queue.removeFirst();
       if (identical(node, target)) {
-        var result = new Queue();
+        var result = new Queue<Info>();
         while (node != null) {
           result.addFirst(node);
           node = seen[node];
@@ -118,4 +118,7 @@
   }
 }
 
-_longNameMatcher(RegExp regexp) => (e) => regexp.hasMatch(longName(e));
+typedef bool LongNameMatcher(FunctionInfo info);
+
+LongNameMatcher _longNameMatcher(RegExp regexp) =>
+    (e) => regexp.hasMatch(longName(e));
diff --git a/bin/coverage_log_server.dart b/bin/coverage_log_server.dart
index cbab8c6..a4dc4c9 100644
--- a/bin/coverage_log_server.dart
+++ b/bin/coverage_log_server.dart
@@ -29,7 +29,7 @@
 
 const _DEFAULT_OUT_TEMPLATE = '<dart2js-out-file>.coverage.json';
 
-main(argv) async {
+main(List<String> argv) async {
   var parser = new ArgParser()
     ..addOption('port', abbr: 'p', help: 'port number', defaultsTo: "8080")
     ..addOption('host',
@@ -169,8 +169,9 @@
       await new Future.delayed(new Duration(seconds: 3));
       await new File(outPath).writeAsString(_serializedData);
       var diff = data.length - _total;
-      print(
-          diff ? ' - no new element covered' : ' - $diff new elements covered');
+      print(diff == 0
+          ? ' - no new element covered'
+          : ' - $diff new elements covered');
       _savePending = false;
       _total = data.length;
     }
diff --git a/bin/inference/client.dart b/bin/inference/client.dart
index e5b05d7..caba830 100644
--- a/bin/inference/client.dart
+++ b/bin/inference/client.dart
@@ -116,8 +116,8 @@
   }
 
   @override
-  visitFunction(FunctionInfo function) {
-    if (function.measurements?.uri?.path != path) return;
+  Null visitFunction(FunctionInfo function) {
+    if (function.measurements?.uri?.path != path) return null;
     var entries = function.measurements.entries;
     for (var metric in entries.keys) {
       if (metric is GroupedMetric) continue;
@@ -128,6 +128,7 @@
         code.insert(entry.end, '</span>');
       }
     }
+    return null;
   }
 }
 
diff --git a/bin/inference/print_summary.dart b/bin/inference/print_summary.dart
index a0dbc0b..45a7612 100644
--- a/bin/inference/print_summary.dart
+++ b/bin/inference/print_summary.dart
@@ -81,10 +81,11 @@
     totals.addFrom(currentBundleTotals);
   }
 
-  visitFunction(FunctionInfo function) {
+  Null visitFunction(FunctionInfo function) {
     var measurements = function.measurements;
-    if (measurements == null) return;
+    if (measurements == null) return null;
     currentBundleTotals.addFrom(measurements);
+    return null;
   }
 }
 
diff --git a/lib/json_info_codec.dart b/lib/json_info_codec.dart
index b042a40..5a79a27 100644
--- a/lib/json_info_codec.dart
+++ b/lib/json_info_codec.dart
@@ -6,27 +6,30 @@
 part of dart2js_info.info;
 
 // TODO(sigmund): add unit tests.
-class JsonToAllInfoConverter extends Converter<Map, AllInfo> {
+class JsonToAllInfoConverter extends Converter<Map<String, dynamic>, AllInfo> {
   Map<String, Info> registry;
 
-  AllInfo convert(Map json) {
+  AllInfo convert(Map<String, dynamic> json) {
     registry = <String, Info>{};
 
     var result = new AllInfo();
     var elements = json['elements'];
-    result.libraries.addAll(elements['library'].values.map(parseLibrary));
-    result.classes.addAll(elements['class'].values.map(parseClass));
-    result.functions.addAll(elements['function'].values.map(parseFunction));
-    result.fields.addAll(elements['field'].values.map(parseField));
-    result.typedefs.addAll(elements['typedef'].values.map(parseTypedef));
+    result.libraries
+        .addAll((elements['library'] as Map).values.map(parseLibrary));
+    result.classes.addAll((elements['class'] as Map).values.map(parseClass));
+    result.functions
+        .addAll((elements['function'] as Map).values.map(parseFunction));
+    result.fields.addAll((elements['field'] as Map).values.map(parseField));
+    result.typedefs
+        .addAll((elements['typedef'] as Map).values.map(parseTypedef));
 
     // TODO(sigmund): remove null check on next breaking version
     var constants = elements['constant'];
     if (constants != null) {
-      result.constants.addAll(constants.values.map(parseConstant));
+      result.constants.addAll((constants as Map).values.map(parseConstant));
     }
 
-    var idMap = {};
+    var idMap = <String, Info>{};
     for (var f in result.functions) {
       idMap[f.serializedId] = f;
     }
@@ -40,15 +43,16 @@
       for (var dep in deps) {
         var target = idMap[dep['id']];
         assert(target != null);
-        src.uses.add(new DependencyInfo(target, dep['mask']));
+        (src as CodeInfo).uses.add(new DependencyInfo(target, dep['mask']));
       }
     });
 
-    json['dependencies']?.forEach((k, deps) {
+    json['dependencies']?.forEach((String k, List<String> deps) {
       result.dependencies[idMap[k]] = deps.map((d) => idMap[d]).toList();
     });
 
-    result.outputUnits.addAll(json['outputUnits'].map(parseOutputUnit));
+    result.outputUnits
+        .addAll((json['outputUnits'] as List).map(parseOutputUnit));
 
     result.program = parseProgram(json['program']);
     // todo: version, etc
@@ -60,7 +64,8 @@
     result
       ..name = json['name']
       ..size = json['size'];
-    result.imports.addAll(json['imports'] ?? const []);
+    result.imports
+        .addAll((json['imports'] as List).map((s) => s as String) ?? const []);
     return result;
   }
 
@@ -119,7 +124,7 @@
       ..code = json['code']
       ..isConst = json['const'] ?? false
       ..initializer = parseId(json['initializer'])
-      ..closures = json['children'].map(parseId).toList();
+      ..closures = (json['children'] as List).map(parseId).toList();
   }
 
   ConstantInfo parseConstant(Map json) {
@@ -153,11 +158,12 @@
       ..type = json['type']
       ..returnType = json['returnType']
       ..inferredReturnType = json['inferredReturnType']
-      ..parameters = json['parameters'].map(parseParameter).toList()
+      ..parameters = (json['parameters'] as List).map(parseParameter).toList()
       ..code = json['code']
       ..sideEffects = json['sideEffects']
-      ..modifiers = parseModifiers(json['modifiers'])
-      ..closures = json['children'].map(parseId).toList()
+      ..modifiers =
+          parseModifiers(new Map<String, bool>.from(json['modifiers']))
+      ..closures = (json['children'] as List).map(parseId).toList()
       ..measurements = parseMeasurements(json['measurements']);
   }
 
@@ -306,8 +312,9 @@
     };
     // TODO(sigmund): Omit this also when outputUnit.id == 0 (most code is in
     // the main output unit by default).
-    if (info.outputUnit != null) res['outputUnit'] =
-        info.outputUnit.serializedId;
+    if (info.outputUnit != null) {
+      res['outputUnit'] = info.outputUnit.serializedId;
+    }
     if (info.coverageId != null) res['coverageId'] = info.coverageId;
     if (info.parent != null) res['parent'] = info.parent.serializedId;
     return res;
@@ -346,8 +353,9 @@
       });
     if (info.isConst) {
       result['const'] = true;
-      if (info.initializer != null) result['initializer'] =
-          info.initializer.serializedId;
+      if (info.initializer != null) {
+        result['initializer'] = info.initializer.serializedId;
+      }
     }
     return result;
   }
@@ -376,12 +384,12 @@
 
   Map _visitMeasurements(Measurements measurements) {
     if (measurements == null) return null;
-    var jsonEntries = <String, List<Map>>{};
+    var jsonEntries = <String, List<int>>{};
     measurements.entries.forEach((metric, values) {
       jsonEntries[_visitMetric(metric)] =
           values.expand((e) => [e.begin, e.end]).toList();
     });
-    var json = {'entries': jsonEntries};
+    var json = <String, dynamic>{'entries': jsonEntries};
     // TODO(sigmund): encode uri as an offset of the URIs available in the parts
     // of the library info.
     if (measurements.uri != null) json['sourceFile'] = '${measurements.uri}';
diff --git a/lib/src/graph.dart b/lib/src/graph.dart
index 5602d6e..7638995 100644
--- a/lib/src/graph.dart
+++ b/lib/src/graph.dart
@@ -43,7 +43,7 @@
   /// Returns all nodes reachable from [root] in post order.
   Iterable<N> postOrder(N root) sync* {
     var seen = new Set<N>();
-    Iterable<N> helper(n) sync* {
+    Iterable<N> helper(N n) sync* {
       if (!seen.add(n)) return;
       for (var x in targetsOf(n)) {
         yield* helper(x);
@@ -297,7 +297,7 @@
       for (var n in nodesInReversedPostOrder) {
         if (n == root) continue;
         bool first = true;
-        var idom = null;
+        N idom;
         for (var p in _graph.sourcesOf(n)) {
           if (immediateDominators[p] != null) {
             if (first) {
diff --git a/lib/src/measurements.dart b/lib/src/measurements.dart
index b919678..d6453b1 100644
--- a/lib/src/measurements.dart
+++ b/lib/src/measurements.dart
@@ -135,7 +135,7 @@
   static const Metric dynamicSend = const Metric('dynamic');
 
   static Map<String, Metric> _nameToMetricMap = () {
-    var res = {};
+    var res = <String, Metric>{};
     visitAllMetrics((m, _) => res[m.name] = m);
     return res;
   }();
diff --git a/pubspec.yaml b/pubspec.yaml
index 0ea5855..16ef8ef 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dart2js_info
-version: 0.2.6
+version: 0.2.7
 description: >
   Libraries and tools to process data produced when running dart2js with
   --dump-info.