diff --git a/pkg/dart2js_info/lib/json_info_codec.dart b/pkg/dart2js_info/lib/json_info_codec.dart index ac303543a97..32372300faf 100644 --- a/pkg/dart2js_info/lib/json_info_codec.dart +++ b/pkg/dart2js_info/lib/json_info_codec.dart @@ -415,17 +415,30 @@ class AllInfoToJsonConverter extends Converter }; } - Map visitDependencyInfo(DependencyInfo info) => - {'id': idFor(info.target).serializedId, 'mask': info.mask}; + Map visitDependencyInfo(DependencyInfo info) => { + 'id': idFor(info.target).serializedId, + if (info.mask != null) 'mask': info.mask, + }; Map _visitAllInfoHolding(AllInfo allInfo) { var map = SplayTreeMap(compareNatural); void helper(CodeInfo info) { if (info.uses.isEmpty) return; - map[idFor(info).serializedId] = info.uses - .map(visitDependencyInfo) - .toList() - ..sort((a, b) => a['id'].compareTo(b['id'])); + map[idFor(info).serializedId] = + info.uses.map(visitDependencyInfo).toList() + ..sort((a, b) { + final value = a['id'].compareTo(b['id']); + if (value != 0) return value; + final aMask = a['mask'] as String?; + final bMask = b['mask'] as String?; + if (aMask == null) { + return bMask == null ? 0 : 1; + } + if (bMask == null) { + return -1; + } + return aMask.compareTo(bMask); + }); } allInfo.functions.forEach(helper); @@ -447,14 +460,14 @@ class AllInfoToJsonConverter extends Converter var jsonHolding = _visitAllInfoHolding(info); var jsonDependencies = _visitAllInfoDependencies(info); return { + 'dump_version': isBackwardCompatible ? 5 : info.version, + 'dump_minor_version': isBackwardCompatible ? 1 : info.minorVersion, + 'program': info.program!.accept(this), 'elements': elements, 'holding': jsonHolding, 'dependencies': jsonDependencies, 'outputUnits': info.outputUnits.map((u) => u.accept(this)).toList(), - 'dump_version': isBackwardCompatible ? 5 : info.version, 'deferredFiles': info.deferredFiles, - 'dump_minor_version': isBackwardCompatible ? 1 : info.minorVersion, - 'program': info.program!.accept(this) }; }