Include more information when deserializing ProgramInfo

Also:
* use durations instead of int in ProgramInfo
* fix some strong mode errors
* add a test for parsing from a real program

R=sigmund@google.com

Review URL: https://codereview.chromium.org//2380273003 .
diff --git a/bin/deferred_library_size.dart b/bin/deferred_library_size.dart
index 349459c..129e95f 100644
--- a/bin/deferred_library_size.dart
+++ b/bin/deferred_library_size.dart
@@ -35,7 +35,7 @@
   });
   // Sort by size, largest first.
   importSizes.sort((a, b) => b.size - a.size);
-  var longest = importSizes.fold('Percent of code deferred'.length,
+  int longest = importSizes.fold('Percent of code deferred'.length,
       (longest, importSize) => max(longest, importSize.import.length));
 
   _printRow(label, data, {int width: 15}) {
diff --git a/bin/function_size_analysis.dart b/bin/function_size_analysis.dart
index e97166d..ac68130 100644
--- a/bin/function_size_analysis.dart
+++ b/bin/function_size_analysis.dart
@@ -21,7 +21,7 @@
     {bool filter(Info info), bool showLibrarySizes: false}) {
   var realTotal = info.program.size;
   if (filter == null) filter = (i) => true;
-  var reported = []
+  var reported = <BasicInfo>[]
     ..addAll(info.functions.where(filter))
     ..addAll(info.fields.where(filter));
 
@@ -69,9 +69,11 @@
     dominatedSize[n] = size;
     return size;
   }
+
   helper(mainMethod);
   reported.forEach((n) => dominatedSize.putIfAbsent(n, () => n.size));
-  reported.sort((a, b) => (dominatedSize[b] + nodeData[b].maxSize) -
+  reported.sort((a, b) =>
+      (dominatedSize[b] + nodeData[b].maxSize) -
       (dominatedSize[a] + nodeData[a].maxSize));
 
   if (showLibrarySizes) {
@@ -129,6 +131,7 @@
       max += n.size;
       n.deps.forEach(helper);
     }
+
     helper(this);
     _maxSize = max;
   }
diff --git a/lib/info.dart b/lib/info.dart
index f258275..9661dcc 100644
--- a/lib/info.dart
+++ b/lib/info.dart
@@ -123,14 +123,14 @@
   /// Major version indicating breaking changes in the format. A new version
   /// means that an old deserialization algorithm will not work with the new
   /// format.
-  final int version = 3;
+  final int version = 4;
 
   /// Minor version indicating non-breaking changes in the format. A change in
   /// this version number means that the json parsing in this library from a
   /// previous will continue to work after the change. This is typically
   /// increased when adding new entries to the file format.
   // Note: the dump-info.viewer app was written using a json parser version 3.2.
-  final int minorVersion = 6;
+  final int minorVersion = 0;
 
   AllInfo();
 
@@ -143,9 +143,8 @@
   String dart2jsVersion;
   DateTime compilationMoment;
   Duration compilationDuration;
-  // TODO(sigmund): use Duration.
-  int toJsonDuration;
-  int dumpInfoDuration;
+  Duration toJsonDuration;
+  Duration dumpInfoDuration;
   bool noSuchMethodEnabled;
   bool minified;
 
diff --git a/lib/json_info_codec.dart b/lib/json_info_codec.dart
index 8b59aa2..5176ce3 100644
--- a/lib/json_info_codec.dart
+++ b/lib/json_info_codec.dart
@@ -145,8 +145,16 @@
   }
 
   ProgramInfo parseProgram(Map json) => new ProgramInfo()
+    ..entrypoint = parseId(json['entrypoint'])
     ..size = json['size']
-    ..entrypoint = parseId(json['entrypoint']);
+    ..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'];
 
   FunctionInfo parseFunction(Map json) {
     FunctionInfo result = parseId(json['id']);
@@ -297,9 +305,9 @@
       'size': info.size,
       'dart2jsVersion': info.dart2jsVersion,
       'compilationMoment': '${info.compilationMoment}',
-      'compilationDuration': '${info.compilationDuration}',
-      'toJsonDuration': info.toJsonDuration,
-      'dumpInfoDuration': '${info.dumpInfoDuration}',
+      'compilationDuration': info.compilationDuration.inMicroseconds,
+      'toJsonDuration': info.toJsonDuration.inMicroseconds,
+      'dumpInfoDuration': info.dumpInfoDuration.inMicroseconds,
       'noSuchMethodEnabled': info.noSuchMethodEnabled,
       'minified': info.minified,
     };
diff --git a/pubspec.yaml b/pubspec.yaml
index 98ef967..a5f9d21 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dart2js_info
-version: 0.2.7+2
+version: 0.3.0
 description: >
   Libraries and tools to process data produced when running dart2js with
   --dump-info.
diff --git a/test/hello_world/hello_world.dart b/test/hello_world/hello_world.dart
new file mode 100644
index 0000000..b79ce55
--- /dev/null
+++ b/test/hello_world/hello_world.dart
@@ -0,0 +1,3 @@
+main() {
+  print("Hello, World!");
+}
\ No newline at end of file
diff --git a/test/hello_world/hello_world.js.info.json b/test/hello_world/hello_world.js.info.json
new file mode 100644
index 0000000..dafb598
--- /dev/null
+++ b/test/hello_world/hello_world.js.info.json
@@ -0,0 +1,1869 @@
+{
+  "elements": {
+    "library": {
+      "0": {
+        "id": "library/0",
+        "kind": "library",
+        "name": "<unnamed>",
+        "size": 85,
+        "children": [
+          "function/0"
+        ],
+        "canonicalUri": "file:///usr/local/google/home/het/Code/dart2js_info/test/hello_world/hello_world.dart"
+      },
+      "1": {
+        "id": "library/1",
+        "kind": "library",
+        "name": "dart.core",
+        "size": 0,
+        "children": [
+          "function/1",
+          "class/36",
+          "class/39",
+          "class/40",
+          "class/42",
+          "class/46",
+          "class/47",
+          "class/48"
+        ],
+        "canonicalUri": "dart:core"
+      },
+      "2": {
+        "id": "library/2",
+        "kind": "library",
+        "name": "dart._internal",
+        "size": 0,
+        "children": [
+          "field/12"
+        ],
+        "canonicalUri": "dart:_internal"
+      },
+      "3": {
+        "id": "library/3",
+        "kind": "library",
+        "name": "dart2js._js_primitives",
+        "size": 483,
+        "children": [
+          "function/2"
+        ],
+        "canonicalUri": "dart:_js_primitives"
+      },
+      "4": {
+        "id": "library/4",
+        "kind": "library",
+        "name": "_foreign_helper",
+        "size": 0,
+        "children": [
+          "class/100"
+        ],
+        "canonicalUri": "dart:_foreign_helper"
+      },
+      "5": {
+        "id": "library/5",
+        "kind": "library",
+        "name": "dart2js._embedded_names",
+        "size": 0,
+        "children": [
+          "field/37",
+          "field/38",
+          "class/102",
+          "class/103"
+        ],
+        "canonicalUri": "dart:_js_embedded_names"
+      },
+      "6": {
+        "id": "library/6",
+        "kind": "library",
+        "name": "_js_helper",
+        "size": 0,
+        "children": [
+          "field/50",
+          "field/56",
+          "class/106",
+          "class/108",
+          "class/109",
+          "class/110",
+          "class/118",
+          "class/120",
+          "class/121",
+          "class/143",
+          "class/145",
+          "class/146",
+          "class/151",
+          "class/154",
+          "class/162",
+          "class/163"
+        ],
+        "canonicalUri": "dart:_js_helper"
+      },
+      "7": {
+        "id": "library/7",
+        "kind": "library",
+        "name": "dart.collection",
+        "size": 0,
+        "children": [
+          "field/84"
+        ],
+        "canonicalUri": "dart:collection"
+      },
+      "11": {
+        "id": "library/11",
+        "kind": "library",
+        "name": "_interceptors",
+        "size": 0,
+        "children": [
+          "class/293"
+        ],
+        "canonicalUri": "dart:_interceptors"
+      }
+    },
+    "class": {
+      "36": {
+        "id": "class/36",
+        "kind": "class",
+        "name": "CyclicInitializationError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/1",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/0"
+        ]
+      },
+      "39": {
+        "id": "class/39",
+        "kind": "class",
+        "name": "ConcurrentModificationError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/1",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/1"
+        ]
+      },
+      "40": {
+        "id": "class/40",
+        "kind": "class",
+        "name": "StateError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/1",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/2"
+        ]
+      },
+      "42": {
+        "id": "class/42",
+        "kind": "class",
+        "name": "UnsupportedError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/1",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/3"
+        ]
+      },
+      "46": {
+        "id": "class/46",
+        "kind": "class",
+        "name": "IndexError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/1",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/4",
+          "field/5"
+        ]
+      },
+      "47": {
+        "id": "class/47",
+        "kind": "class",
+        "name": "RangeError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/1",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/6",
+          "field/7"
+        ]
+      },
+      "48": {
+        "id": "class/48",
+        "kind": "class",
+        "name": "ArgumentError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/1",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/8",
+          "field/9",
+          "field/10",
+          "field/11"
+        ]
+      },
+      "100": {
+        "id": "class/100",
+        "kind": "class",
+        "name": "JS_CONST",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/4",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/13"
+        ]
+      },
+      "102": {
+        "id": "class/102",
+        "kind": "class",
+        "name": "JsBuiltin",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/5",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/14",
+          "field/15",
+          "field/16",
+          "field/17",
+          "field/18",
+          "field/19",
+          "field/20",
+          "field/21"
+        ]
+      },
+      "103": {
+        "id": "class/103",
+        "kind": "class",
+        "name": "JsGetName",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/5",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/22",
+          "field/23",
+          "field/24",
+          "field/25",
+          "field/26",
+          "field/27",
+          "field/28",
+          "field/29",
+          "field/30",
+          "field/31",
+          "field/32",
+          "field/33",
+          "field/34",
+          "field/35",
+          "field/36"
+        ]
+      },
+      "106": {
+        "id": "class/106",
+        "kind": "class",
+        "name": "LinkedHashMapCell",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/39",
+          "field/40",
+          "field/41",
+          "field/42"
+        ]
+      },
+      "108": {
+        "id": "class/108",
+        "kind": "class",
+        "name": "JsLinkedHashMap",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/43",
+          "field/44",
+          "field/45",
+          "field/46",
+          "field/47",
+          "field/48",
+          "field/49"
+        ]
+      },
+      "109": {
+        "id": "class/109",
+        "kind": "class",
+        "name": "TypeVariable",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/51",
+          "field/52",
+          "field/53"
+        ]
+      },
+      "110": {
+        "id": "class/110",
+        "kind": "class",
+        "name": "TypeImpl",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/54",
+          "field/55"
+        ]
+      },
+      "118": {
+        "id": "class/118",
+        "kind": "class",
+        "name": "GeneralConstantMap",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/57"
+        ]
+      },
+      "120": {
+        "id": "class/120",
+        "kind": "class",
+        "name": "ConstantProtoMap",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/58"
+        ]
+      },
+      "121": {
+        "id": "class/121",
+        "kind": "class",
+        "name": "ConstantStringMap",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/59",
+          "field/60",
+          "field/61"
+        ]
+      },
+      "143": {
+        "id": "class/143",
+        "kind": "class",
+        "name": "RuntimeError",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/62"
+        ]
+      },
+      "145": {
+        "id": "class/145",
+        "kind": "class",
+        "name": "CastErrorImplementation",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/63"
+        ]
+      },
+      "146": {
+        "id": "class/146",
+        "kind": "class",
+        "name": "TypeErrorImplementation",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/64"
+        ]
+      },
+      "151": {
+        "id": "class/151",
+        "kind": "class",
+        "name": "BoundClosure",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/65",
+          "field/66",
+          "field/67",
+          "field/68",
+          "field/69",
+          "field/70"
+        ]
+      },
+      "154": {
+        "id": "class/154",
+        "kind": "class",
+        "name": "Closure",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": true
+        },
+        "children": [
+          "field/71"
+        ]
+      },
+      "162": {
+        "id": "class/162",
+        "kind": "class",
+        "name": "Primitives",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/72"
+        ]
+      },
+      "163": {
+        "id": "class/163",
+        "kind": "class",
+        "name": "ReflectionInfo",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/6",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/73",
+          "field/74",
+          "field/75",
+          "field/76",
+          "field/77",
+          "field/78",
+          "field/79",
+          "field/80",
+          "field/81",
+          "field/82",
+          "field/83"
+        ]
+      },
+      "293": {
+        "id": "class/293",
+        "kind": "class",
+        "name": "ArrayIterator",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "parent": "library/11",
+        "modifiers": {
+          "abstract": false
+        },
+        "children": [
+          "field/85",
+          "field/86",
+          "field/87",
+          "field/88"
+        ]
+      }
+    },
+    "function": {
+      "0": {
+        "id": "function/0",
+        "kind": "function",
+        "name": "main",
+        "size": 62,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3",
+        "parent": "library/0",
+        "children": [],
+        "modifiers": {
+          "static": false,
+          "const": false,
+          "factory": false,
+          "external": false
+        },
+        "returnType": null,
+        "inferredReturnType": "[null]",
+        "parameters": [],
+        "sideEffects": "Depends on [] field store static store, Changes [] field static.",
+        "inlinedCount": 0,
+        "code": "main: function() {\n  H.printString(\"Hello, World!\");\n}\n",
+        "type": "() -> dynamic",
+        "measurements": null
+      },
+      "1": {
+        "id": "function/1",
+        "kind": "function",
+        "name": "print",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "86",
+        "parent": "library/1",
+        "children": [],
+        "modifiers": {
+          "static": false,
+          "const": false,
+          "factory": false,
+          "external": false
+        },
+        "returnType": null,
+        "inferredReturnType": "[null]",
+        "parameters": [
+          {
+            "name": "object",
+            "type": "Value mask: [\"Hello, World!\"] type: [exact=JSString]",
+            "declaredType": "Object"
+          }
+        ],
+        "sideEffects": "Depends on [] field store static store, Changes [] field static.",
+        "inlinedCount": 1,
+        "code": null,
+        "type": "(Object) -> void",
+        "measurements": null
+      },
+      "2": {
+        "id": "function/2",
+        "kind": "function",
+        "name": "printString",
+        "size": 460,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "275",
+        "parent": "library/3",
+        "children": [],
+        "modifiers": {
+          "static": false,
+          "const": false,
+          "factory": false,
+          "external": false
+        },
+        "returnType": null,
+        "inferredReturnType": "[null]",
+        "parameters": [
+          {
+            "name": "string",
+            "type": "[exact=JSString]",
+            "declaredType": "String"
+          }
+        ],
+        "sideEffects": "Depends on [] field store static store, Changes [] field static.",
+        "inlinedCount": 0,
+        "code": "printString: function(string) {\n  if (typeof dartPrint == \"function\") {\n    dartPrint(string);\n    return;\n  }\n  if (typeof console == \"object\" && typeof console.log != \"undefined\") {\n    console.log(string);\n    return;\n  }\n  if (typeof window == \"object\")\n    return;\n  if (typeof print == \"function\") {\n    print(string);\n    return;\n  }\n  throw \"Unable to print message: \" + String(string);\n}\n",
+        "type": "(String) -> void",
+        "measurements": null
+      }
+    },
+    "typedef": {},
+    "field": {
+      "0": {
+        "id": "field/0",
+        "kind": "field",
+        "name": "variableName",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3644",
+        "parent": "class/36",
+        "children": [],
+        "inferredType": "[exact=JSString]",
+        "code": null,
+        "type": "String"
+      },
+      "1": {
+        "id": "field/1",
+        "kind": "field",
+        "name": "modifiedObject",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3629",
+        "parent": "class/39",
+        "children": [],
+        "inferredType": "Union of [[subclass=JSArray], [subclass=JsLinkedHashMap]]",
+        "code": null,
+        "type": "Object"
+      },
+      "2": {
+        "id": "field/2",
+        "kind": "field",
+        "name": "message",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3622",
+        "parent": "class/40",
+        "children": [],
+        "inferredType": "Value mask: [\"No element\"] type: [exact=JSString]",
+        "code": null,
+        "type": "String"
+      },
+      "3": {
+        "id": "field/3",
+        "kind": "field",
+        "name": "message",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3549",
+        "parent": "class/42",
+        "children": [],
+        "inferredType": "[exact=JSString]",
+        "code": null,
+        "type": "String"
+      },
+      "4": {
+        "id": "field/4",
+        "kind": "field",
+        "name": "indexable",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3602",
+        "parent": "class/46",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "5": {
+        "id": "field/5",
+        "kind": "field",
+        "name": "length",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3603",
+        "parent": "class/46",
+        "children": [],
+        "inferredType": "[subclass=JSInt]",
+        "code": null,
+        "type": "int"
+      },
+      "6": {
+        "id": "field/6",
+        "kind": "field",
+        "name": "start",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3554",
+        "parent": "class/47",
+        "children": [],
+        "inferredType": "[null]",
+        "code": null,
+        "type": "num"
+      },
+      "7": {
+        "id": "field/7",
+        "kind": "field",
+        "name": "end",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3555",
+        "parent": "class/47",
+        "children": [],
+        "inferredType": "[null]",
+        "code": null,
+        "type": "num"
+      },
+      "8": {
+        "id": "field/8",
+        "kind": "field",
+        "name": "_hasValue",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2579",
+        "parent": "class/48",
+        "children": [],
+        "inferredType": "Value mask: [true] type: [exact=JSBool]",
+        "code": null,
+        "type": "bool"
+      },
+      "9": {
+        "id": "field/9",
+        "kind": "field",
+        "name": "invalidValue",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2580",
+        "parent": "class/48",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "10": {
+        "id": "field/10",
+        "kind": "field",
+        "name": "name",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2581",
+        "parent": "class/48",
+        "children": [],
+        "inferredType": "Value mask: [\"index\"] type: [null|exact=JSString]",
+        "code": null,
+        "type": "String"
+      },
+      "11": {
+        "id": "field/11",
+        "kind": "field",
+        "name": "message",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2582",
+        "parent": "class/48",
+        "children": [],
+        "inferredType": "[null|exact=JSString]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "12": {
+        "id": "field/12",
+        "kind": "field",
+        "name": "printToZone",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "252",
+        "parent": "library/2",
+        "children": [],
+        "inferredType": "[null]",
+        "code": null,
+        "type": "Function"
+      },
+      "13": {
+        "id": "field/13",
+        "kind": "field",
+        "name": "code",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3926",
+        "parent": "class/100",
+        "children": [],
+        "inferredType": "Value mask: [\"function getTagFallback(o) {\n  var constructor = o.constructor;\n  if (typeof constructor == \"function\") {\n    var name = constructor.name;\n    // If the name is a non-empty string, we use that as the type name of this\n    // object.  There are various cases where that does not work, so we have to\n    // detect them and fall through to the toString() based implementation.\n\n    if (typeof name == \"string\" &&\n\n        // Sometimes the string is empty.  This test also catches minified\n        // shadow dom polyfil wrapper for Window on Firefox where the faked\n        // constructor name does not 'stick'.  The shortest real DOM object\n        // names have three characters (e.g. URL, CSS).\n        name.length > 2 &&\n\n        // On Firefox we often get \"Object\" as the constructor name, even for\n        // more specialized DOM objects.\n        name !== \"Object\" &&\n\n        // This can happen in Opera.\n        name !== \"Function.prototype\") {\n      return name;\n    }\n  }\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n}\"] type: [exact=JSString]",
+        "code": null,
+        "type": "String"
+      },
+      "14": {
+        "id": "field/14",
+        "kind": "field",
+        "name": "index",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3019",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JSUInt31]",
+        "code": null,
+        "type": "int"
+      },
+      "15": {
+        "id": "field/15",
+        "kind": "field",
+        "name": "isCheckPropertyToJsConstructorName",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3023",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JsBuiltin]",
+        "code": null,
+        "type": "JsBuiltin",
+        "const": true
+      },
+      "16": {
+        "id": "field/16",
+        "kind": "field",
+        "name": "isFunctionType",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3024",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JsBuiltin]",
+        "code": null,
+        "type": "JsBuiltin",
+        "const": true
+      },
+      "17": {
+        "id": "field/17",
+        "kind": "field",
+        "name": "rawRtiToJsConstructorName",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3026",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JsBuiltin]",
+        "code": null,
+        "type": "JsBuiltin",
+        "const": true
+      },
+      "18": {
+        "id": "field/18",
+        "kind": "field",
+        "name": "rawRuntimeType",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3027",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JsBuiltin]",
+        "code": null,
+        "type": "JsBuiltin",
+        "const": true
+      },
+      "19": {
+        "id": "field/19",
+        "kind": "field",
+        "name": "isSubtype",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3028",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JsBuiltin]",
+        "code": null,
+        "type": "JsBuiltin",
+        "const": true
+      },
+      "20": {
+        "id": "field/20",
+        "kind": "field",
+        "name": "isGivenTypeRti",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3029",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JsBuiltin]",
+        "code": null,
+        "type": "JsBuiltin",
+        "const": true
+      },
+      "21": {
+        "id": "field/21",
+        "kind": "field",
+        "name": "getType",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3031",
+        "parent": "class/102",
+        "children": [],
+        "inferredType": "[exact=JsBuiltin]",
+        "code": null,
+        "type": "JsBuiltin",
+        "const": true
+      },
+      "22": {
+        "id": "field/22",
+        "kind": "field",
+        "name": "index",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3698",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JSUInt31]",
+        "code": null,
+        "type": "int"
+      },
+      "23": {
+        "id": "field/23",
+        "kind": "field",
+        "name": "CALL_CATCH_ALL",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3710",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "24": {
+        "id": "field/24",
+        "kind": "field",
+        "name": "REQUIRED_PARAMETER_PROPERTY",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3713",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "25": {
+        "id": "field/25",
+        "kind": "field",
+        "name": "DEFAULT_VALUES_PROPERTY",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3714",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "26": {
+        "id": "field/26",
+        "kind": "field",
+        "name": "CALL_NAME_PROPERTY",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3715",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "27": {
+        "id": "field/27",
+        "kind": "field",
+        "name": "OPERATOR_AS_PREFIX",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3717",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "28": {
+        "id": "field/28",
+        "kind": "field",
+        "name": "SIGNATURE_NAME",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3718",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "29": {
+        "id": "field/29",
+        "kind": "field",
+        "name": "FUNCTION_TYPE_VOID_RETURN_TAG",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3720",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "30": {
+        "id": "field/30",
+        "kind": "field",
+        "name": "FUNCTION_TYPE_RETURN_TYPE_TAG",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3721",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "31": {
+        "id": "field/31",
+        "kind": "field",
+        "name": "FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3722",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "32": {
+        "id": "field/32",
+        "kind": "field",
+        "name": "FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3723",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "33": {
+        "id": "field/33",
+        "kind": "field",
+        "name": "FUNCTION_TYPE_NAMED_PARAMETERS_TAG",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3724",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "34": {
+        "id": "field/34",
+        "kind": "field",
+        "name": "NULL_CLASS_TYPE_NAME",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3726",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "35": {
+        "id": "field/35",
+        "kind": "field",
+        "name": "OBJECT_CLASS_TYPE_NAME",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3727",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "36": {
+        "id": "field/36",
+        "kind": "field",
+        "name": "FUNCTION_CLASS_TYPE_NAME",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3728",
+        "parent": "class/103",
+        "children": [],
+        "inferredType": "[exact=JsGetName]",
+        "code": null,
+        "type": "JsGetName",
+        "const": true
+      },
+      "37": {
+        "id": "field/37",
+        "kind": "field",
+        "name": "MANGLED_GLOBAL_NAMES",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "308",
+        "parent": "library/5",
+        "children": [],
+        "inferredType": "Value mask: [\"mangledGlobalNames\"] type: [exact=JSString]",
+        "code": null,
+        "type": "dynamic",
+        "const": true
+      },
+      "38": {
+        "id": "field/38",
+        "kind": "field",
+        "name": "STATIC_FUNCTION_NAME_PROPERTY_NAME",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "303",
+        "parent": "library/5",
+        "children": [],
+        "inferredType": "Value mask: [\"$static_name\"] type: [exact=JSString]",
+        "code": null,
+        "type": "dynamic",
+        "const": true
+      },
+      "39": {
+        "id": "field/39",
+        "kind": "field",
+        "name": "hashMapCellKey",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3499",
+        "parent": "class/106",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "40": {
+        "id": "field/40",
+        "kind": "field",
+        "name": "hashMapCellValue",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3500",
+        "parent": "class/106",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "41": {
+        "id": "field/41",
+        "kind": "field",
+        "name": "_next",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3501",
+        "parent": "class/106",
+        "children": [],
+        "inferredType": "[null|exact=LinkedHashMapCell]",
+        "code": null,
+        "type": "LinkedHashMapCell"
+      },
+      "42": {
+        "id": "field/42",
+        "kind": "field",
+        "name": "_previous",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3502",
+        "parent": "class/106",
+        "children": [],
+        "inferredType": "[null|exact=LinkedHashMapCell]",
+        "code": null,
+        "type": "LinkedHashMapCell"
+      },
+      "43": {
+        "id": "field/43",
+        "kind": "field",
+        "name": "_length",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3418",
+        "parent": "class/108",
+        "children": [],
+        "inferredType": "[subclass=JSPositiveInt]",
+        "code": null,
+        "type": "int"
+      },
+      "44": {
+        "id": "field/44",
+        "kind": "field",
+        "name": "_strings",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3419",
+        "parent": "class/108",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "45": {
+        "id": "field/45",
+        "kind": "field",
+        "name": "_nums",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3420",
+        "parent": "class/108",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "46": {
+        "id": "field/46",
+        "kind": "field",
+        "name": "_rest",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3421",
+        "parent": "class/108",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "47": {
+        "id": "field/47",
+        "kind": "field",
+        "name": "_first",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3422",
+        "parent": "class/108",
+        "children": [],
+        "inferredType": "[null|exact=LinkedHashMapCell]",
+        "code": null,
+        "type": "LinkedHashMapCell"
+      },
+      "48": {
+        "id": "field/48",
+        "kind": "field",
+        "name": "_last",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3423",
+        "parent": "class/108",
+        "children": [],
+        "inferredType": "[null|exact=LinkedHashMapCell]",
+        "code": null,
+        "type": "LinkedHashMapCell"
+      },
+      "49": {
+        "id": "field/49",
+        "kind": "field",
+        "name": "_modifications",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3424",
+        "parent": "class/108",
+        "children": [],
+        "inferredType": "[exact=JSUInt31]",
+        "code": null,
+        "type": "int"
+      },
+      "50": {
+        "id": "field/50",
+        "kind": "field",
+        "name": "_USE_ES6_MAPS",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "688",
+        "parent": "library/6",
+        "children": [],
+        "inferredType": "[exact=JSBool]",
+        "code": null,
+        "type": "dynamic",
+        "const": true
+      },
+      "51": {
+        "id": "field/51",
+        "kind": "field",
+        "name": "owner",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2570",
+        "parent": "class/109",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "Type"
+      },
+      "52": {
+        "id": "field/52",
+        "kind": "field",
+        "name": "name",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2571",
+        "parent": "class/109",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "String"
+      },
+      "53": {
+        "id": "field/53",
+        "kind": "field",
+        "name": "bound",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2572",
+        "parent": "class/109",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "int"
+      },
+      "54": {
+        "id": "field/54",
+        "kind": "field",
+        "name": "_typeName",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3914",
+        "parent": "class/110",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "String"
+      },
+      "55": {
+        "id": "field/55",
+        "kind": "field",
+        "name": "_unmangledName",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3915",
+        "parent": "class/110",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "String"
+      },
+      "56": {
+        "id": "field/56",
+        "kind": "field",
+        "name": "_constructorNameFallback",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "591",
+        "parent": "library/6",
+        "children": [],
+        "inferredType": "[exact=JS_CONST]",
+        "code": null,
+        "type": "dynamic",
+        "const": true
+      },
+      "57": {
+        "id": "field/57",
+        "kind": "field",
+        "name": "_jsData",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3121",
+        "parent": "class/118",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "58": {
+        "id": "field/58",
+        "kind": "field",
+        "name": "_protoValue",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3096",
+        "parent": "class/120",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "V"
+      },
+      "59": {
+        "id": "field/59",
+        "kind": "field",
+        "name": "_length",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3100",
+        "parent": "class/121",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "int"
+      },
+      "60": {
+        "id": "field/60",
+        "kind": "field",
+        "name": "_jsObject",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3101",
+        "parent": "class/121",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "61": {
+        "id": "field/61",
+        "kind": "field",
+        "name": "_keys",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3102",
+        "parent": "class/121",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "List<K>"
+      },
+      "62": {
+        "id": "field/62",
+        "kind": "field",
+        "name": "message",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "4090",
+        "parent": "class/143",
+        "children": [],
+        "inferredType": "Value mask: [\"Intercepted function with no arguments.\"] type: [exact=JSString]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "63": {
+        "id": "field/63",
+        "kind": "field",
+        "name": "message",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "4118",
+        "parent": "class/145",
+        "children": [],
+        "inferredType": "[exact=JSString]",
+        "code": null,
+        "type": "String"
+      },
+      "64": {
+        "id": "field/64",
+        "kind": "field",
+        "name": "message",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3004",
+        "parent": "class/146",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "String"
+      },
+      "65": {
+        "id": "field/65",
+        "kind": "field",
+        "name": "_self",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3943",
+        "parent": "class/151",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "66": {
+        "id": "field/66",
+        "kind": "field",
+        "name": "_target",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3944",
+        "parent": "class/151",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "67": {
+        "id": "field/67",
+        "kind": "field",
+        "name": "_receiver",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3945",
+        "parent": "class/151",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "68": {
+        "id": "field/68",
+        "kind": "field",
+        "name": "_name",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3946",
+        "parent": "class/151",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "String"
+      },
+      "69": {
+        "id": "field/69",
+        "kind": "field",
+        "name": "selfFieldNameCache",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3958",
+        "parent": "class/151",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "String"
+      },
+      "70": {
+        "id": "field/70",
+        "kind": "field",
+        "name": "receiverFieldNameCache",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3960",
+        "parent": "class/151",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "String"
+      },
+      "71": {
+        "id": "field/71",
+        "kind": "field",
+        "name": "functionCounter",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2633",
+        "parent": "class/154",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "int"
+      },
+      "72": {
+        "id": "field/72",
+        "kind": "field",
+        "name": "DOLLAR_CHAR_VALUE",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "2669",
+        "parent": "class/162",
+        "children": [],
+        "inferredType": "[exact=JSUInt31]",
+        "code": null,
+        "type": "int",
+        "const": true
+      },
+      "73": {
+        "id": "field/73",
+        "kind": "field",
+        "name": "REQUIRED_PARAMETERS_INFO",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3973",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[exact=JSUInt31]",
+        "code": null,
+        "type": "int",
+        "const": true
+      },
+      "74": {
+        "id": "field/74",
+        "kind": "field",
+        "name": "OPTIONAL_PARAMETERS_INFO",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3974",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[exact=JSUInt31]",
+        "code": null,
+        "type": "int",
+        "const": true
+      },
+      "75": {
+        "id": "field/75",
+        "kind": "field",
+        "name": "FUNCTION_TYPE_INDEX",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3975",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[exact=JSUInt31]",
+        "code": null,
+        "type": "int",
+        "const": true
+      },
+      "76": {
+        "id": "field/76",
+        "kind": "field",
+        "name": "jsFunction",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3977",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "77": {
+        "id": "field/77",
+        "kind": "field",
+        "name": "data",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3978",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[exact=JSFixedArray]",
+        "code": null,
+        "type": "List"
+      },
+      "78": {
+        "id": "field/78",
+        "kind": "field",
+        "name": "isAccessor",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3979",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[exact=JSBool]",
+        "code": null,
+        "type": "bool"
+      },
+      "79": {
+        "id": "field/79",
+        "kind": "field",
+        "name": "requiredParameterCount",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3980",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[subclass=JSInt]",
+        "code": null,
+        "type": "int"
+      },
+      "80": {
+        "id": "field/80",
+        "kind": "field",
+        "name": "optionalParameterCount",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3981",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[subclass=JSInt]",
+        "code": null,
+        "type": "int"
+      },
+      "81": {
+        "id": "field/81",
+        "kind": "field",
+        "name": "areOptionalParametersNamed",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3982",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[exact=JSBool]",
+        "code": null,
+        "type": "bool"
+      },
+      "82": {
+        "id": "field/82",
+        "kind": "field",
+        "name": "functionType",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3983",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "dynamic"
+      },
+      "83": {
+        "id": "field/83",
+        "kind": "field",
+        "name": "cachedSortedIndices",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3984",
+        "parent": "class/163",
+        "children": [],
+        "inferredType": "[null]",
+        "code": null,
+        "type": "List"
+      },
+      "84": {
+        "id": "field/84",
+        "kind": "field",
+        "name": "_toStringVisiting",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "713",
+        "parent": "library/7",
+        "children": [],
+        "inferredType": "Container mask: Union of [[subclass=ConstantMap], [subclass=JSArray], [subclass=JsLinkedHashMap]] length: null type: [exact=JSExtendableArray]",
+        "code": null,
+        "type": "List"
+      },
+      "85": {
+        "id": "field/85",
+        "kind": "field",
+        "name": "_iterable",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3880",
+        "parent": "class/293",
+        "children": [],
+        "inferredType": "[subclass=JSArray]",
+        "code": null,
+        "type": "JSArray<E>"
+      },
+      "86": {
+        "id": "field/86",
+        "kind": "field",
+        "name": "_length",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3881",
+        "parent": "class/293",
+        "children": [],
+        "inferredType": "[subclass=JSUInt32]",
+        "code": null,
+        "type": "int"
+      },
+      "87": {
+        "id": "field/87",
+        "kind": "field",
+        "name": "_index",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3882",
+        "parent": "class/293",
+        "children": [],
+        "inferredType": "[subclass=JSPositiveInt]",
+        "code": null,
+        "type": "int"
+      },
+      "88": {
+        "id": "field/88",
+        "kind": "field",
+        "name": "_current",
+        "size": 0,
+        "outputUnit": "outputUnit/0",
+        "coverageId": "3883",
+        "parent": "class/293",
+        "children": [],
+        "inferredType": "[null|subclass=Object]",
+        "code": null,
+        "type": "E"
+      }
+    },
+    "constant": {}
+  },
+  "holding": {
+    "function/0": [
+      {
+        "id": "function/2",
+        "mask": "null"
+      },
+      {
+        "id": "function/1",
+        "mask": "inlined"
+      }
+    ]
+  },
+  "dependencies": {
+    "function/0": [
+      "function/1",
+      "field/51",
+      "field/52",
+      "field/53",
+      "function/2"
+    ],
+    "field/11": [],
+    "field/17": [
+      "field/14"
+    ],
+    "field/84": [],
+    "field/27": [
+      "field/22"
+    ],
+    "field/19": [],
+    "field/50": [],
+    "field/56": [
+      "field/13"
+    ],
+    "function/1": [
+      "field/12"
+    ]
+  },
+  "outputUnits": [
+    {
+      "id": "outputUnit/0",
+      "kind": "outputUnit",
+      "name": null,
+      "size": 10124,
+      "imports": [
+        null
+      ]
+    }
+  ],
+  "dump_version": 3,
+  "deferredFiles": {},
+  "dump_minor_version": "6",
+  "program": {
+    "entrypoint": "function/0",
+    "size": 10124,
+    "dart2jsVersion": null,
+    "compilationMoment": "2016-09-30 13:44:11.847439",
+    "compilationDuration": "0:00:03.717112",
+    "toJsonDuration": 4,
+    "dumpInfoDuration": "0",
+    "noSuchMethodEnabled": false,
+    "minified": false
+  }
+}
\ No newline at end of file
diff --git a/test/parse_test.dart b/test/parse_test.dart
index e3c6570..d51f113 100644
--- a/test/parse_test.dart
+++ b/test/parse_test.dart
@@ -2,26 +2,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert';
+import 'dart:io';
+
 import 'package:dart2js_info/info.dart';
 import 'package:test/test.dart';
 
 main() {
   group('parse', () {
-    test('empty', () {
-      var json = {
-        'elements': {
-          'library': {},
-          'class': {},
-          'function': {},
-          'field': {},
-          'typedef': {},
-        },
-        'holding': {},
-        'program': {'size': 10},
-        'outputUnits': [],
-      };
+    test('hello_world', () {
+      var helloWorld = new File('test/hello_world/hello_world.js.info.json');
+      var json = JSON.decode(helloWorld.readAsStringSync());
+      var decoded = new AllInfoJsonCodec().decode(json);
 
-      expect(new AllInfoJsonCodec().decode(json).program.size, 10);
-    });
+      var program = decoded.program;
+      expect(program, isNotNull);
+
+      expect(program.entrypoint, isNotNull);
+      expect(program.size, 10124);
+      expect(program.compilationMoment,
+          DateTime.parse("2016-09-30 13:44:11.847439"));
+      expect(program.compilationDuration,
+          new Duration(seconds: 3, microseconds: 717112));
+      expect(program.noSuchMethodEnabled, false);
+      expect(program.minified, false);
+    }, skip: "need to update dart2js first");
   });
 }