Skip to content

Commit 0fb8a42

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Support for top-level setters.
Many existing manifest tests involving top level variables were changed to use `final` variables, so that the test expectations don't need to contain distracting references to top level setters. Change-Id: I5a641c2d446f366435a127d66e951d78d784d0b2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/419983 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent b2d139b commit 0fb8a42

File tree

4 files changed

+300
-86
lines changed

4 files changed

+300
-86
lines changed

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,23 @@ class LibraryManifestBuilder {
325325
newItems[lookupName] = item;
326326
}
327327

328+
void _addTopLevelSetter({
329+
required EncodeContext encodingContext,
330+
required Map<LookupName, TopLevelItem> newItems,
331+
required SetterElementImpl element,
332+
required LookupName lookupName,
333+
}) {
334+
var item = _getOrBuildElementItem(element, () {
335+
return TopLevelSetterItem.fromElement(
336+
name: lookupName,
337+
id: ManifestItemId.generate(),
338+
context: encodingContext,
339+
element: element,
340+
);
341+
});
342+
newItems[lookupName] = item;
343+
}
344+
328345
/// Fill `result` with new library manifests.
329346
/// We reuse existing items when they fully match.
330347
/// We build new items for mismatched elements.
@@ -357,6 +374,13 @@ class LibraryManifestBuilder {
357374
element: element,
358375
lookupName: lookupName,
359376
);
377+
case SetterElementImpl():
378+
_addTopLevelSetter(
379+
encodingContext: encodingContext,
380+
newItems: newItems,
381+
element: element,
382+
lookupName: lookupName,
383+
);
360384
case TopLevelFunctionElementImpl():
361385
_addTopLevelFunction(
362386
encodingContext: encodingContext,
@@ -524,6 +548,10 @@ class _LibraryMatch {
524548
if (!_matchTopGetter(name: name, element: element)) {
525549
structureMismatched.add(element);
526550
}
551+
case SetterElementImpl():
552+
if (!_matchTopSetter(name: name, element: element)) {
553+
structureMismatched.add(element);
554+
}
527555
case TopLevelFunctionElementImpl():
528556
if (!_matchTopFunction(name: name, element: element)) {
529557
structureMismatched.add(element);
@@ -718,4 +746,24 @@ class _LibraryMatch {
718746
refExternalIds.addAll(matchContext.externalIds);
719747
return true;
720748
}
749+
750+
bool _matchTopSetter({
751+
required LookupName? name,
752+
required SetterElementImpl element,
753+
}) {
754+
var item = manifest.items[name];
755+
if (item is! TopLevelSetterItem) {
756+
return false;
757+
}
758+
759+
var matchContext = item.match(element);
760+
if (matchContext == null) {
761+
return false;
762+
}
763+
764+
itemMap[element] = item;
765+
refElementsMap[element] = matchContext.elementList;
766+
refExternalIds.addAll(matchContext.externalIds);
767+
return true;
768+
}
721769
}

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

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ class TopLevelGetterItem extends TopLevelItem {
514514
sink.writeUri(libraryUri);
515515
name.write(sink);
516516
id.write(sink);
517-
sink.writeList(metadata, (annotation) => annotation.write(sink));
517+
metadata.writeList(sink);
518518
returnType.write(sink);
519519
}
520520
}
@@ -546,19 +546,98 @@ sealed class TopLevelItem extends ManifestItem {
546546
return TopLevelFunctionItem.read(reader);
547547
case _ManifestItemKind.topLevelGetter:
548548
return TopLevelGetterItem.read(reader);
549+
case _ManifestItemKind.topLevelSetter:
550+
return TopLevelSetterItem.read(reader);
549551
}
550552
}
551553
}
552554

555+
class TopLevelSetterItem extends TopLevelItem {
556+
final List<ManifestAnnotation> metadata;
557+
final ManifestType valueType;
558+
559+
TopLevelSetterItem({
560+
required super.libraryUri,
561+
required super.name,
562+
required super.id,
563+
required this.metadata,
564+
required this.valueType,
565+
});
566+
567+
factory TopLevelSetterItem.fromElement({
568+
required LookupName name,
569+
required ManifestItemId id,
570+
required EncodeContext context,
571+
required SetterElementImpl element,
572+
}) {
573+
return TopLevelSetterItem(
574+
libraryUri: element.library2.uri,
575+
name: name,
576+
id: id,
577+
metadata: element.metadata2.annotations.map((annotation) {
578+
return ManifestAnnotation.encode(context, annotation);
579+
}).toFixedList(),
580+
valueType: element.formalParameters[0].type.encode(context),
581+
);
582+
}
583+
584+
factory TopLevelSetterItem.read(SummaryDataReader reader) {
585+
return TopLevelSetterItem(
586+
libraryUri: reader.readUri(),
587+
name: LookupName.read(reader),
588+
id: ManifestItemId.read(reader),
589+
metadata: reader.readTypedList(() => ManifestAnnotation.read(reader)),
590+
valueType: ManifestType.read(reader),
591+
);
592+
}
593+
594+
MatchContext? match(SetterElementImpl element) {
595+
var context = MatchContext(parent: null);
596+
597+
var annotations = element.metadata2.annotations;
598+
if (annotations.length != metadata.length) {
599+
return null;
600+
}
601+
for (var i = 0; i < metadata.length; i++) {
602+
if (!metadata[i].match(context, annotations[i])) {
603+
return null;
604+
}
605+
}
606+
607+
if (!valueType.match(context, element.formalParameters[0].type)) {
608+
return null;
609+
}
610+
611+
return context;
612+
}
613+
614+
@override
615+
void write(BufferedSink sink) {
616+
sink.writeEnum(_ManifestItemKind.topLevelSetter);
617+
sink.writeUri(libraryUri);
618+
name.write(sink);
619+
id.write(sink);
620+
metadata.writeList(sink);
621+
valueType.write(sink);
622+
}
623+
}
624+
553625
enum _ManifestItemKind {
554626
class_,
555627
export_,
556628
topLevelFunction,
557629
topLevelGetter,
630+
topLevelSetter,
558631
}
559632

560633
enum _ManifestItemKind2 {
561634
instanceGetter,
562635
instanceMethod,
563636
interfaceConstructor,
564637
}
638+
639+
extension ListOfManifestAnnotationExtension on List<ManifestAnnotation> {
640+
void writeList(BufferedSink sink) {
641+
sink.writeList(this, (x) => x.write(sink));
642+
}
643+
}

0 commit comments

Comments
 (0)