Skip to content

Commit 68b060e

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Verify write/read roundtrip for LibraryManifest.
Fixes for found bugs. Change-Id: I873e43277b620afc3b712dcac1ace915991edf85 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/419685 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent dc7e9da commit 68b060e

File tree

4 files changed

+90
-26
lines changed

4 files changed

+90
-26
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class ManifestAnnotation extends ManifestNode {
5050
@override
5151
void write(BufferedSink sink) {
5252
sink.writeEnum(_ManifestNodeKind.annotation);
53-
name.write(sink);
53+
name.writeNoTag(sink);
5454
}
5555
}
5656

@@ -136,6 +136,10 @@ class ManifestSimpleIdentifier extends ManifestNode {
136136
@override
137137
void write(BufferedSink sink) {
138138
sink.writeEnum(_ManifestNodeKind.simpleIdentifier);
139+
writeNoTag(sink);
140+
}
141+
142+
void writeNoTag(BufferedSink sink) {
139143
sink.writeStringUtf8(name);
140144
sink.writeOptionalObject(element, (it) => it.write(sink));
141145
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class InstanceMethodItem extends InstanceMemberItem {
248248
sink.writeEnum(_ManifestItemKind2.instanceMethod);
249249
name.write(sink);
250250
id.write(sink);
251-
functionType.write(sink);
251+
functionType.writeNoTag(sink);
252252
}
253253
}
254254

@@ -315,7 +315,7 @@ class InterfaceConstructorItem extends InstanceMemberItem {
315315
id.write(sink);
316316
sink.writeBool(isConst);
317317
sink.writeBool(isFactory);
318-
functionType.write(sink);
318+
functionType.writeNoTag(sink);
319319
}
320320
}
321321

@@ -377,6 +377,10 @@ class ManifestAnnotation {
377377
return true;
378378
}
379379

380+
void write(BufferedSink sink) {
381+
ast.write(sink);
382+
}
383+
380384
static ManifestAnnotation encode(
381385
EncodeContext context,
382386
ElementAnnotationImpl annotation,
@@ -441,7 +445,7 @@ class TopLevelFunctionItem extends TopLevelItem {
441445
sink.writeUri(libraryUri);
442446
name.write(sink);
443447
id.write(sink);
444-
functionType.write(sink);
448+
functionType.writeNoTag(sink);
445449
}
446450
}
447451

@@ -510,6 +514,7 @@ class TopLevelGetterItem extends TopLevelItem {
510514
sink.writeUri(libraryUri);
511515
name.write(sink);
512516
id.write(sink);
517+
sink.writeList(metadata, (annotation) => annotation.write(sink));
513518
returnType.write(sink);
514519
}
515520
}

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

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,6 @@ sealed class ManifestFunctionFormalParameter {
4040
required this.isRequired,
4141
required this.type,
4242
});
43-
44-
factory ManifestFunctionFormalParameter.read(SummaryDataReader reader) {
45-
var kind = reader.readEnum(_ManifestFunctionFormalParameterKind.values);
46-
switch (kind) {
47-
case _ManifestFunctionFormalParameterKind.positional:
48-
return ManifestFunctionPositionalFormalParameter.read(reader);
49-
case _ManifestFunctionFormalParameterKind.named:
50-
return ManifestFunctionNamedFormalParameter.read(reader);
51-
}
52-
}
53-
54-
void write(BufferedSink sink);
5543
}
5644

5745
class ManifestFunctionNamedFormalParameter
@@ -87,9 +75,7 @@ class ManifestFunctionNamedFormalParameter
8775
element.name3 == name;
8876
}
8977

90-
@override
9178
void write(BufferedSink sink) {
92-
sink.writeEnum(_ManifestFunctionFormalParameterKind.named);
9379
sink.writeBool(isRequired);
9480
type.write(sink);
9581
sink.writeStringUtf8(name);
@@ -139,9 +125,7 @@ class ManifestFunctionPositionalFormalParameter
139125
type.match(context, element.type);
140126
}
141127

142-
@override
143128
void write(BufferedSink sink) {
144-
sink.writeEnum(_ManifestFunctionFormalParameterKind.positional);
145129
sink.writeBool(isRequired);
146130
type.write(sink);
147131
}
@@ -256,6 +240,10 @@ final class ManifestFunctionType extends ManifestType {
256240
@override
257241
void write(BufferedSink sink) {
258242
sink.writeEnum(_ManifestTypeKind.function);
243+
writeNoTag(sink);
244+
}
245+
246+
void writeNoTag(BufferedSink sink) {
259247
sink.writeList(typeParameters, (e) => e.write(sink));
260248
returnType.write(sink);
261249
sink.writeList(positional, (e) => e.write(sink));
@@ -638,7 +626,7 @@ class ManifestTypeParameter {
638626
}
639627

640628
void write(BufferedSink sink) {
641-
sink.writeOptionalObject(bound, (bound) => bound.write(sink));
629+
bound.writeOptional(sink);
642630
}
643631

644632
static bool matchList(
@@ -744,11 +732,6 @@ final class ManifestVoidType extends ManifestType {
744732
}
745733
}
746734

747-
enum _ManifestFunctionFormalParameterKind {
748-
positional,
749-
named,
750-
}
751-
752735
enum _ManifestTypeKind {
753736
dynamic,
754737
function,

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

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

55
import 'dart:async';
6+
import 'dart:typed_data';
67

78
import 'package:analyzer/dart/analysis/results.dart';
89
import 'package:analyzer/dart/ast/ast.dart';
@@ -16,11 +17,15 @@ import 'package:analyzer/src/dart/analysis/driver_event.dart' as driver_events;
1617
import 'package:analyzer/src/dart/analysis/file_state.dart';
1718
import 'package:analyzer/src/dart/analysis/status.dart';
1819
import 'package:analyzer/src/error/codes.dart';
20+
import 'package:analyzer/src/fine/library_manifest.dart';
1921
import 'package:analyzer/src/fine/requirements.dart';
2022
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';
2125
import 'package:analyzer/src/test_utilities/lint_registration_mixin.dart';
2226
import 'package:analyzer/src/utilities/extensions/async.dart';
2327
import 'package:analyzer_utilities/testing/tree_string_sink.dart';
28+
import 'package:collection/collection.dart';
2429
import 'package:linter/src/rules.dart';
2530
import 'package:test/test.dart';
2631
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11628,6 +11633,11 @@ int get b => 0;
1162811633
collector.take();
1162911634
}
1163011635

11636+
_assertLibraryManifestSerialization(
11637+
driver: driver,
11638+
libraryUri: libraryUri,
11639+
);
11640+
1163111641
modifyFile2(testFile, updatedCode);
1163211642
driver.changeFile2(testFile);
1163311643

@@ -11636,6 +11646,68 @@ int get b => 0;
1163611646
setId('expectedUpdatedEvents');
1163711647
await assertEventsText(collector, expectedUpdatedEvents);
1163811648
}
11649+
11650+
static void _assertLibraryManifestSerialization({
11651+
required AnalysisDriver driver,
11652+
required Uri libraryUri,
11653+
}) {
11654+
var idProvider = IdProvider();
11655+
11656+
String manifestAsStr(LibraryManifest manifest) {
11657+
var buffer = StringBuffer();
11658+
LibraryManifestPrinter(
11659+
configuration: DriverEventsPrinterConfiguration()
11660+
..withElementManifests = true,
11661+
sink: TreeStringSink(sink: buffer, indent: ''),
11662+
idProvider: idProvider,
11663+
).write(manifest);
11664+
return buffer.toString().trim();
11665+
}
11666+
11667+
Uint8List manifestAsBytes(LibraryManifest manifest) {
11668+
var byteSink = BufferedSink();
11669+
manifest.write(byteSink);
11670+
return byteSink.takeBytes();
11671+
}
11672+
11673+
// Write the current manifest as string, and as bytes.
11674+
String currentStr;
11675+
Uint8List currentBytes;
11676+
{
11677+
var elementFactory = driver.libraryContext.elementFactory;
11678+
var libraryElement = elementFactory.libraryOfUri2(libraryUri);
11679+
// SAFETY: this function is invoked when manifests are enabled.
11680+
var manifest = libraryElement.manifest!;
11681+
currentStr = manifestAsStr(manifest);
11682+
currentBytes = manifestAsBytes(manifest);
11683+
}
11684+
11685+
// Read from bytes; write as string and again as bytes.
11686+
String readStr;
11687+
Uint8List readBytes;
11688+
{
11689+
var manifest = LibraryManifest.read(
11690+
SummaryDataReader(currentBytes),
11691+
);
11692+
readStr = manifestAsStr(manifest);
11693+
readBytes = manifestAsBytes(manifest);
11694+
}
11695+
11696+
// The strings must be identical.
11697+
if (readStr != currentStr) {
11698+
print('${'-' * 16} current');
11699+
print(currentStr);
11700+
print('${'-' * 16} read');
11701+
print(readStr);
11702+
print('-' * 32);
11703+
fail('Library manifest strings are different');
11704+
}
11705+
11706+
// The bytes must be identical.
11707+
if (!const ListEquality<int>().equals(currentBytes, readBytes)) {
11708+
fail('Library manifest bytes are different');
11709+
}
11710+
}
1163911711
}
1164011712

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

0 commit comments

Comments
 (0)