@@ -260,36 +260,44 @@ class InterfaceItemRequirements {
260
260
/// If the element was asked for its full interface.
261
261
ManifestItemId ? interfaceId;
262
262
263
- final Map <LookupName , ManifestItemId ?> constructors;
263
+ /// Set if [InstanceElementImpl.constructors] is invoked.
264
+ ManifestItemIdList ? allDeclaredConstructors;
265
+
266
+ /// Requested with [InstanceElementImpl.getNamedConstructor] .
267
+ final Map <LookupName , ManifestItemId ?> requestedConstructors;
264
268
265
269
/// These are "methods" in wide meaning: methods, getters, setters.
266
270
final Map <LookupName , ManifestItemId ?> methods;
267
271
268
272
InterfaceItemRequirements ({
269
273
required this .interfaceId,
270
- required this .constructors,
274
+ required this .allDeclaredConstructors,
275
+ required this .requestedConstructors,
271
276
required this .methods,
272
277
});
273
278
274
279
factory InterfaceItemRequirements .empty () {
275
280
return InterfaceItemRequirements (
276
281
interfaceId: null ,
277
- constructors: {},
282
+ allDeclaredConstructors: null ,
283
+ requestedConstructors: {},
278
284
methods: {},
279
285
);
280
286
}
281
287
282
288
factory InterfaceItemRequirements .read (SummaryDataReader reader) {
283
289
return InterfaceItemRequirements (
284
290
interfaceId: ManifestItemId .readOptional (reader),
285
- constructors: reader.readNameToIdMap (),
291
+ allDeclaredConstructors: ManifestItemIdList .readOptional (reader),
292
+ requestedConstructors: reader.readNameToIdMap (),
286
293
methods: reader.readNameToIdMap (),
287
294
);
288
295
}
289
296
290
297
void write (BufferedSink sink) {
291
298
interfaceId.writeOptional (sink);
292
- sink.writeNameToIdMap (constructors);
299
+ allDeclaredConstructors.writeOptional (sink);
300
+ sink.writeNameToIdMap (requestedConstructors);
293
301
sink.writeNameToIdMap (methods);
294
302
}
295
303
}
@@ -601,8 +609,8 @@ class RequirementsManifest {
601
609
);
602
610
}
603
611
604
- var interfaceRequirements = interfaceEntry.value;
605
- if (interfaceRequirements .interfaceId case var expectedId? ) {
612
+ var requirements = interfaceEntry.value;
613
+ if (requirements .interfaceId case var expectedId? ) {
606
614
var actualId = interfaceItem.interface .id;
607
615
if (expectedId != actualId) {
608
616
return InterfaceIdMismatch (
@@ -614,7 +622,21 @@ class RequirementsManifest {
614
622
}
615
623
}
616
624
617
- var constructors = interfaceRequirements.constructors;
625
+ if (requirements.allDeclaredConstructors case var required ? ) {
626
+ var actualItems = interfaceItem.declaredConstructors.values;
627
+ var actualIds = actualItems.map ((item) => item.id);
628
+ if (! required .equalToIterable (actualIds)) {
629
+ return InterfaceChildrenIdsMismatch (
630
+ libraryUri: libraryUri,
631
+ interfaceName: interfaceName,
632
+ childrenPropertyName: 'constructors' ,
633
+ expectedIds: required ,
634
+ actualIds: ManifestItemIdList (actualIds.toList ()),
635
+ );
636
+ }
637
+ }
638
+
639
+ var constructors = requirements.requestedConstructors;
618
640
for (var constructorEntry in constructors.entries) {
619
641
var constructorName = constructorEntry.key;
620
642
var constructorId = interfaceItem.getConstructorId (constructorName);
@@ -630,7 +652,7 @@ class RequirementsManifest {
630
652
}
631
653
}
632
654
633
- var methods = interfaceRequirements .methods;
655
+ var methods = requirements .methods;
634
656
for (var methodEntry in methods.entries) {
635
657
var methodName = methodEntry.key;
636
658
var methodId = interfaceItem.getInterfaceMethodId (methodName);
@@ -694,6 +716,26 @@ class RequirementsManifest {
694
716
}
695
717
}
696
718
719
+ void record_instanceElement_constructors ({
720
+ required InterfaceElementImpl element,
721
+ }) {
722
+ if (_recordingLockLevel != 0 ) {
723
+ return ;
724
+ }
725
+
726
+ var itemRequirements = _getInterfaceItem (element);
727
+ if (itemRequirements == null ) {
728
+ return ;
729
+ }
730
+
731
+ var item = itemRequirements.item;
732
+ var requirements = itemRequirements.requirements;
733
+
734
+ requirements.allDeclaredConstructors ?? = ManifestItemIdList (
735
+ item.declaredConstructors.values.map ((item) => item.id).toList (),
736
+ );
737
+ }
738
+
697
739
void record_instanceElement_fields ({required InstanceElementImpl element}) {
698
740
if (_recordingLockLevel != 0 ) {
699
741
return ;
@@ -897,7 +939,7 @@ class RequirementsManifest {
897
939
898
940
var constructorName = name.asLookupName;
899
941
var constructorId = item.getConstructorId (constructorName);
900
- requirements.constructors [constructorName] = constructorId;
942
+ requirements.requestedConstructors [constructorName] = constructorId;
901
943
}
902
944
903
945
void record_propertyAccessorElement_variable ({
0 commit comments