make the parser able to parse old versions of the codec

R=sigmund@google.com

Review URL: https://codereview.chromium.org//2459593002 .
diff --git a/lib/json_info_codec.dart b/lib/json_info_codec.dart
index 8382bb0..10a4d96 100644
--- a/lib/json_info_codec.dart
+++ b/lib/json_info_codec.dart
@@ -19,8 +19,12 @@
     result.classes.addAll((elements['class'] as Map).values.map(parseClass));
     result.functions
         .addAll((elements['function'] as Map).values.map(parseFunction));
-    result.closures
-        .addAll((elements['closure'] as Map).values.map(parseClosure));
+
+    // TODO(het): Revert this when the dart2js with the new codec is in stable
+    if (elements['closure'] != null) {
+      result.closures
+          .addAll((elements['closure'] as Map).values.map(parseClosure));
+    }
     result.fields.addAll((elements['field'] as Map).values.map(parseField));
     result.typedefs
         .addAll((elements['typedef'] as Map).values.map(parseTypedef));
@@ -142,17 +146,61 @@
       ..size = 0;
   }
 
-  ProgramInfo parseProgram(Map json) => new ProgramInfo()
-    ..entrypoint = parseId(json['entrypoint'])
-    ..size = json['size']
-    ..dart2jsVersion = json['dart2jsVersion']
-    ..compilationMoment = DateTime.parse(json['compilationMoment'])
-    ..compilationDuration =
-        new Duration(microseconds: json['compilationDuration'])
-    ..toJsonDuration = new Duration(microseconds: json['toJsonDuration'])
-    ..dumpInfoDuration = new Duration(microseconds: json['dumpInfoDuration'])
-    ..noSuchMethodEnabled = json['noSuchMethodEnabled']
-    ..minified = json['minified'];
+  ProgramInfo parseProgram(Map json) {
+    var programInfo = new ProgramInfo()
+      ..entrypoint = parseId(json['entrypoint'])
+      ..size = json['size']
+      ..dart2jsVersion = json['dart2jsVersion']
+      ..noSuchMethodEnabled = json['noSuchMethodEnabled']
+      ..minified = json['minified'];
+
+    // TODO(het): Revert this when the dart2js with the new codec is in stable
+    var compilationDuration = json['compilationDuration'];
+    if (compilationDuration is String) {
+      programInfo.compilationDuration = _parseDuration(compilationDuration);
+    } else {
+      assert(compilationDuration is int);
+      programInfo.compilationDuration =
+          new Duration(microseconds: compilationDuration);
+    }
+
+    var toJsonDuration = json['toJsonDuration'];
+    if (toJsonDuration is String) {
+      programInfo.toJsonDuration = _parseDuration(toJsonDuration);
+    } else {
+      assert(toJsonDuration is int);
+      programInfo.toJsonDuration = new Duration(microseconds: toJsonDuration);
+    }
+
+    var dumpInfoDuration = json['dumpInfoDuration'];
+    if (dumpInfoDuration is String) {
+      programInfo.dumpInfoDuration = _parseDuration(dumpInfoDuration);
+    } else {
+      assert(dumpInfoDuration is int);
+      programInfo.dumpInfoDuration =
+          new Duration(microseconds: dumpInfoDuration);
+    }
+
+    return programInfo;
+  }
+
+  /// Parse a string formatted as "XX:YY:ZZ.ZZZZZ" into a [Duration].
+  Duration _parseDuration(String duration) {
+    if (!duration.contains(':')) {
+      return new Duration(milliseconds: int.parse(duration));
+    }
+    var parts = duration.split(':');
+    var hours = double.parse(parts[0]);
+    var minutes = double.parse(parts[1]);
+    var seconds = double.parse(parts[2]);
+    const secondsInMillis = 1000;
+    const minutesInMillis = 60 * secondsInMillis;
+    const hoursInMillis = 60 * minutesInMillis;
+    var totalMillis = secondsInMillis * seconds +
+        minutesInMillis * minutes +
+        hoursInMillis * hours;
+    return new Duration(milliseconds: totalMillis.round());
+  }
 
   FunctionInfo parseFunction(Map json) {
     FunctionInfo result = parseId(json['id']);
diff --git a/pubspec.yaml b/pubspec.yaml
index 2c7d6e9..6d8739d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dart2js_info
-version: 0.5.0
+version: 0.5.1
 description: >
   Libraries and tools to process data produced when running dart2js with
   --dump-info.