Skip to content

Commit 5ee3068

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Assert LibraryManifest serialization, for all libraries.
Change-Id: Ic8ee0c30a5d701e321f70f044e1a09f21dcfcb5d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/419980 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 383cd49 commit 5ee3068

File tree

2 files changed

+29
-72
lines changed

2 files changed

+29
-72
lines changed

pkg/analyzer/lib/src/fine/library_manifest.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:typed_data';
6+
57
import 'package:analyzer/dart/element/element2.dart';
68
import 'package:analyzer/src/dart/analysis/file_state.dart';
79
import 'package:analyzer/src/dart/element/element.dart';
@@ -13,6 +15,7 @@ import 'package:analyzer/src/summary2/data_reader.dart';
1315
import 'package:analyzer/src/summary2/data_writer.dart';
1416
import 'package:analyzer/src/summary2/linked_element_factory.dart';
1517
import 'package:analyzer/src/util/performance/operation_performance.dart';
18+
import 'package:collection/collection.dart';
1619

1720
/// The manifest of a single library.
1821
class LibraryManifest {
@@ -95,6 +98,7 @@ class LibraryManifestBuilder {
9598

9699
_buildManifests();
97100
_addReExports();
101+
assert(_assertSerialization());
98102

99103
return newManifests;
100104
}
@@ -342,6 +346,31 @@ class LibraryManifestBuilder {
342346
newItems[lookupName] = item;
343347
}
344348

349+
/// Assert that every manifest can be serialized, and when deserialized
350+
/// results in the same manifest.
351+
bool _assertSerialization() {
352+
Uint8List manifestAsBytes(LibraryManifest manifest) {
353+
var byteSink = BufferedSink();
354+
manifest.write(byteSink);
355+
return byteSink.takeBytes();
356+
}
357+
358+
newManifests.forEach((uri, manifest) {
359+
var bytes = manifestAsBytes(manifest);
360+
361+
var readManifest = LibraryManifest.read(
362+
SummaryDataReader(bytes),
363+
);
364+
var readBytes = manifestAsBytes(readManifest);
365+
366+
if (!const ListEquality<int>().equals(bytes, readBytes)) {
367+
throw StateError('Library manifest bytes are different: $uri');
368+
}
369+
});
370+
371+
return true;
372+
}
373+
345374
/// Fill `result` with new library manifests.
346375
/// We reuse existing items when they fully match.
347376
/// We build new items for mismatched elements.

pkg/analyzer/test/src/dart/analysis/driver_test.dart

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'dart:async';
6-
import 'dart:typed_data';
76

87
import 'package:analyzer/dart/analysis/results.dart';
98
import 'package:analyzer/dart/ast/ast.dart';
@@ -17,15 +16,11 @@ import 'package:analyzer/src/dart/analysis/driver_event.dart' as driver_events;
1716
import 'package:analyzer/src/dart/analysis/file_state.dart';
1817
import 'package:analyzer/src/dart/analysis/status.dart';
1918
import 'package:analyzer/src/error/codes.dart';
20-
import 'package:analyzer/src/fine/library_manifest.dart';
2119
import 'package:analyzer/src/fine/requirements.dart';
2220
import 'package:analyzer/src/lint/linter.dart';
23-
import 'package:analyzer/src/summary2/data_reader.dart';
24-
import 'package:analyzer/src/summary2/data_writer.dart';
2521
import 'package:analyzer/src/test_utilities/lint_registration_mixin.dart';
2622
import 'package:analyzer/src/utilities/extensions/async.dart';
2723
import 'package:analyzer_utilities/testing/tree_string_sink.dart';
28-
import 'package:collection/collection.dart';
2924
import 'package:linter/src/rules.dart';
3025
import 'package:test/test.dart';
3126
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11710,11 +11705,6 @@ int get b => 0;
1171011705
collector.take();
1171111706
}
1171211707

11713-
_assertLibraryManifestSerialization(
11714-
driver: driver,
11715-
libraryUri: libraryUri,
11716-
);
11717-
1171811708
modifyFile2(testFile, updatedCode);
1171911709
driver.changeFile2(testFile);
1172011710

@@ -11723,68 +11713,6 @@ int get b => 0;
1172311713
setId('expectedUpdatedEvents');
1172411714
await assertEventsText(collector, expectedUpdatedEvents);
1172511715
}
11726-
11727-
static void _assertLibraryManifestSerialization({
11728-
required AnalysisDriver driver,
11729-
required Uri libraryUri,
11730-
}) {
11731-
var idProvider = IdProvider();
11732-
11733-
String manifestAsStr(LibraryManifest manifest) {
11734-
var buffer = StringBuffer();
11735-
LibraryManifestPrinter(
11736-
configuration: DriverEventsPrinterConfiguration()
11737-
..withElementManifests = true,
11738-
sink: TreeStringSink(sink: buffer, indent: ''),
11739-
idProvider: idProvider,
11740-
).write(manifest);
11741-
return buffer.toString().trim();
11742-
}
11743-
11744-
Uint8List manifestAsBytes(LibraryManifest manifest) {
11745-
var byteSink = BufferedSink();
11746-
manifest.write(byteSink);
11747-
return byteSink.takeBytes();
11748-
}
11749-
11750-
// Write the current manifest as string, and as bytes.
11751-
String currentStr;
11752-
Uint8List currentBytes;
11753-
{
11754-
var elementFactory = driver.libraryContext.elementFactory;
11755-
var libraryElement = elementFactory.libraryOfUri2(libraryUri);
11756-
// SAFETY: this function is invoked when manifests are enabled.
11757-
var manifest = libraryElement.manifest!;
11758-
currentStr = manifestAsStr(manifest);
11759-
currentBytes = manifestAsBytes(manifest);
11760-
}
11761-
11762-
// Read from bytes; write as string and again as bytes.
11763-
String readStr;
11764-
Uint8List readBytes;
11765-
{
11766-
var manifest = LibraryManifest.read(
11767-
SummaryDataReader(currentBytes),
11768-
);
11769-
readStr = manifestAsStr(manifest);
11770-
readBytes = manifestAsBytes(manifest);
11771-
}
11772-
11773-
// The strings must be identical.
11774-
if (readStr != currentStr) {
11775-
print('${'-' * 16} current');
11776-
print(currentStr);
11777-
print('${'-' * 16} read');
11778-
print(readStr);
11779-
print('-' * 32);
11780-
fail('Library manifest strings are different');
11781-
}
11782-
11783-
// The bytes must be identical.
11784-
if (!const ListEquality<int>().equals(currentBytes, readBytes)) {
11785-
fail('Library manifest bytes are different');
11786-
}
11787-
}
1178811716
}
1178911717

1179011718
/// A lint that is always reported for all linted files.

0 commit comments

Comments
 (0)