@@ -8,148 +8,95 @@ part of 'graph.dart';
8
8
///
9
9
/// This should be incremented any time the serialize/deserialize formats
10
10
/// change.
11
- const _version = 27 ;
11
+ const _version = 28 ;
12
12
13
13
/// Deserializes an [AssetGraph] from a [Map] .
14
- class _AssetGraphDeserializer {
15
- // Iteration order does not matter
16
- final _idToAssetId = HashMap <int , AssetId >();
17
- final Map _serializedGraph;
18
-
19
- _AssetGraphDeserializer ._(this ._serializedGraph);
20
-
21
- factory _AssetGraphDeserializer (List <int > bytes) {
22
- dynamic decoded;
23
- try {
24
- decoded = jsonDecode (utf8.decode (bytes));
25
- } on FormatException {
26
- throw AssetGraphCorruptedException ();
27
- }
28
- if (decoded is ! Map ) throw AssetGraphCorruptedException ();
29
- if (decoded['version' ] != _version) {
30
- throw AssetGraphCorruptedException ();
31
- }
32
- return _AssetGraphDeserializer ._(decoded);
14
+ AssetGraph deserializeAssetGraph (List <int > bytes) {
15
+ dynamic serializedGraph;
16
+ try {
17
+ serializedGraph = jsonDecode (utf8.decode (bytes));
18
+ } on FormatException {
19
+ throw AssetGraphCorruptedException ();
20
+ }
21
+ if (serializedGraph is ! Map ) throw AssetGraphCorruptedException ();
22
+ if (serializedGraph['version' ] != _version) {
23
+ throw AssetGraphCorruptedException ();
33
24
}
34
25
35
- /// Perform the deserialization, should only be called once.
36
- AssetGraph deserialize () {
37
- var packageLanguageVersions = {
38
- for (var entry
39
- in (_serializedGraph['packageLanguageVersions' ]
40
- as Map <String , dynamic >)
41
- .entries)
42
- entry.key:
43
- entry.value != null
44
- ? LanguageVersion .parse (entry.value as String )
45
- : null ,
46
- };
47
- var graph = AssetGraph ._(
48
- _deserializeDigest (_serializedGraph['buildActionsDigest' ] as String )! ,
49
- _serializedGraph['dart_version' ] as String ,
50
- packageLanguageVersions.build (),
51
- BuiltList <String >.from (_serializedGraph['enabledExperiments' ] as List ),
52
- );
53
-
54
- var packageNames = _serializedGraph['packages' ] as List ;
55
-
56
- // Read in the id => AssetId map from the graph first.
57
- var assetPaths = _serializedGraph['assetPaths' ] as List ;
58
- for (var i = 0 ; i < assetPaths.length; i += 2 ) {
59
- var packageName = packageNames[assetPaths[i + 1 ] as int ] as String ;
60
- _idToAssetId[i ~ / 2 ] = AssetId (packageName, assetPaths[i] as String );
61
- }
62
-
63
- // Read in all the nodes and their outputs.
64
- //
65
- // Note that this does not read in the inputs of generated nodes.
66
- for (var serializedItem in _serializedGraph['nodes' ] as Iterable ) {
67
- graph._add (_deserializeAssetNode (serializedItem as List ));
68
- }
26
+ identityAssetIdSerializer.deserializeWithObjects (
27
+ (serializedGraph['ids' ] as List ).map (
28
+ (id) => assetIdSerializer.deserialize (serializers, id as Object ),
29
+ ),
30
+ );
31
+
32
+ var packageLanguageVersions = {
33
+ for (var entry
34
+ in (serializedGraph['packageLanguageVersions' ] as Map <String , dynamic >)
35
+ .entries)
36
+ entry.key:
37
+ entry.value != null
38
+ ? LanguageVersion .parse (entry.value as String )
39
+ : null ,
40
+ };
41
+ var graph = AssetGraph ._(
42
+ _deserializeDigest (serializedGraph['buildActionsDigest' ] as String )! ,
43
+ serializedGraph['dart_version' ] as String ,
44
+ packageLanguageVersions.build (),
45
+ BuiltList <String >.from (serializedGraph['enabledExperiments' ] as List ),
46
+ );
47
+
48
+ for (var serializedItem in serializedGraph['nodes' ] as Iterable ) {
49
+ graph._add (_deserializeAssetNode (serializedItem as List ));
50
+ }
69
51
70
- final postProcessOutputs =
71
- serializers.deserialize (
72
- _serializedGraph ['postProcessOutputs' ],
73
- specifiedType: postProcessBuildStepOutputsFullType,
74
- )
75
- as Map <String , Map <PostProcessBuildStepId , Set <AssetId >>>;
52
+ final postProcessOutputs =
53
+ serializers.deserialize (
54
+ serializedGraph ['postProcessOutputs' ],
55
+ specifiedType: postProcessBuildStepOutputsFullType,
56
+ )
57
+ as Map <String , Map <PostProcessBuildStepId , Set <AssetId >>>;
76
58
77
- for (final postProcessOutputsForPackage in postProcessOutputs.values) {
78
- for (final entry in postProcessOutputsForPackage.entries) {
79
- graph.updatePostProcessBuildStep (entry.key, outputs: entry.value);
80
- }
59
+ for (final postProcessOutputsForPackage in postProcessOutputs.values) {
60
+ for (final entry in postProcessOutputsForPackage.entries) {
61
+ graph.updatePostProcessBuildStep (entry.key, outputs: entry.value);
81
62
}
82
-
83
- return graph;
84
63
}
85
64
86
- AssetNode _deserializeAssetNode (List serializedNode) =>
87
- serializers.deserializeWith (AssetNode .serializer, serializedNode)
88
- as AssetNode ;
65
+ identityAssetIdSerializer.reset ();
66
+ return graph;
89
67
}
90
68
91
- /// Serializes an [AssetGraph] into a [Map] .
92
- class _AssetGraphSerializer {
93
- // Iteration order does not matter
94
- final _assetIdToId = HashMap <AssetId , int >();
95
-
96
- final AssetGraph _graph;
97
-
98
- _AssetGraphSerializer (this ._graph);
99
-
100
- /// Perform the serialization, should only be called once.
101
- List <int > serialize () {
102
- var pathId = 0 ;
103
- // [path0, packageId0, path1, packageId1, ...]
104
- var assetPaths = < dynamic > [];
105
- var packages = _graph._nodesByPackage.keys.toList (growable: false );
106
- for (var node in _graph.allNodes) {
107
- _assetIdToId[node.id] = pathId;
108
- pathId++ ;
109
- assetPaths
110
- ..add (node.id.path)
111
- ..add (packages.indexOf (node.id.package));
112
- }
69
+ AssetNode _deserializeAssetNode (List serializedNode) =>
70
+ serializers.deserializeWith (AssetNode .serializer, serializedNode)
71
+ as AssetNode ;
113
72
114
- var result = < String , dynamic > {
115
- 'version' : _version,
116
- 'dart_version' : _graph.dartVersion,
117
- 'nodes' : _graph.allNodes
118
- .map ((node) => serializers.serializeWith (AssetNode .serializer, node))
119
- .toList (growable: false ),
120
- 'buildActionsDigest' : _serializeDigest (_graph.buildPhasesDigest),
121
- 'packages' : packages,
122
- 'assetPaths' : assetPaths,
123
- 'packageLanguageVersions' :
124
- _graph.packageLanguageVersions
125
- .map ((pkg, version) => MapEntry (pkg, version? .toString ()))
126
- .toMap (),
127
- 'enabledExperiments' : _graph.enabledExperiments.toList (),
128
- 'postProcessOutputs' : serializers.serialize (
129
- _graph._postProcessBuildStepOutputs,
130
- specifiedType: postProcessBuildStepOutputsFullType,
131
- ),
132
- };
133
- return utf8.encode (json.encode (result));
134
- }
135
-
136
- int findAssetIndex (
137
- AssetId id, {
138
- required AssetId from,
139
- required String field,
140
- }) {
141
- final index = _assetIdToId[id];
142
- if (index == null ) {
143
- log.severe (
144
- 'The $field field in $from references a non-existent asset '
145
- '$id and will corrupt the asset graph. '
146
- 'If you encounter this error please copy '
147
- 'the details from this message and add them to '
148
- 'https://github.com/dart-lang/build/issues/1804.' ,
149
- );
150
- }
151
- return index! ;
152
- }
73
+ /// Serializes an [AssetGraph] into a [Map] .
74
+ List <int > serializeAssetGraph (AssetGraph graph) {
75
+ // Serialize nodes first so all `AssetId` instances are seen by
76
+ // `identityAssetIdSeralizer`.
77
+ final nodes = graph.allNodes
78
+ .map ((node) => serializers.serializeWith (AssetNode .serializer, node))
79
+ .toList (growable: false );
80
+
81
+ var result = < String , dynamic > {
82
+ 'version' : _version,
83
+ 'ids' : identityAssetIdSerializer.serializedObjects,
84
+ 'dart_version' : graph.dartVersion,
85
+ 'nodes' : nodes,
86
+ 'buildActionsDigest' : _serializeDigest (graph.buildPhasesDigest),
87
+ 'packageLanguageVersions' :
88
+ graph.packageLanguageVersions
89
+ .map ((pkg, version) => MapEntry (pkg, version? .toString ()))
90
+ .toMap (),
91
+ 'enabledExperiments' : graph.enabledExperiments.toList (),
92
+ 'postProcessOutputs' : serializers.serialize (
93
+ graph._postProcessBuildStepOutputs,
94
+ specifiedType: postProcessBuildStepOutputsFullType,
95
+ ),
96
+ };
97
+
98
+ identityAssetIdSerializer.reset ();
99
+ return utf8.encode (json.encode (result));
153
100
}
154
101
155
102
Digest ? _deserializeDigest (String ? serializedDigest) =>
0 commit comments