@@ -185,13 +185,41 @@ final class ExportRequirementShowCombinator
185185 }
186186}
187187
188+ /// Includes all requirements from class-like items: classes, enums,
189+ /// extensions (NB), extension types, mixins.
190+ class InterfaceRequirements {
191+ final Map <LookupName , ManifestItemId ?> constructors;
192+
193+ /// These are "methods" in wide meaning: methods, getters, setters.
194+ final Map <LookupName , ManifestItemId ?> methods;
195+
196+ InterfaceRequirements ({required this .constructors, required this .methods});
197+
198+ factory InterfaceRequirements .empty () {
199+ return InterfaceRequirements (constructors: {}, methods: {});
200+ }
201+
202+ factory InterfaceRequirements .read (SummaryDataReader reader) {
203+ return InterfaceRequirements (
204+ constructors: reader.readNameToIdMap (),
205+ methods: reader.readNameToIdMap (),
206+ );
207+ }
208+
209+ void write (BufferedSink sink) {
210+ sink.writeNameToIdMap (constructors);
211+ sink.writeNameToIdMap (methods);
212+ }
213+ }
214+
188215class RequirementsManifest {
189216 /// LibraryUri => TopName => ID
190217 final Map <Uri , Map <LookupName , ManifestItemId ?>> topLevels = {};
191218
192- /// LibraryUri => TopName => MemberName => ID
193- final Map <Uri , Map <LookupName , Map <LookupName , ManifestItemId ?>>>
194- interfaceMembers = {};
219+ /// LibraryUri => TopName => InterfaceRequirements
220+ ///
221+ /// These are "methods" in wide meaning: methods, getters, setters.
222+ final Map <Uri , Map <LookupName , InterfaceRequirements >> interfaces = {};
195223
196224 final List <ExportRequirement > exportRequirements = [];
197225
@@ -200,28 +228,20 @@ class RequirementsManifest {
200228 factory RequirementsManifest .read (SummaryDataReader reader) {
201229 var result = RequirementsManifest ();
202230
203- Map <LookupName , ManifestItemId ?> readNameToIdMap () {
204- return reader.readMap (
205- readKey: () => LookupName .read (reader),
206- readValue:
207- () => reader.readOptionalObject (() => ManifestItemId .read (reader)),
208- );
209- }
210-
211231 result.topLevels.addAll (
212232 reader.readMap (
213233 readKey: () => reader.readUri (),
214- readValue: readNameToIdMap,
234+ readValue: () => reader. readNameToIdMap () ,
215235 ),
216236 );
217237
218- result.interfaceMembers .addAll (
238+ result.interfaces .addAll (
219239 reader.readMap (
220240 readKey: () => reader.readUri (),
221241 readValue: () {
222242 return reader.readMap (
223243 readKey: () => LookupName .read (reader),
224- readValue: readNameToIdMap ,
244+ readValue: () => InterfaceRequirements . read (reader) ,
225245 );
226246 },
227247 ),
@@ -276,7 +296,7 @@ class RequirementsManifest {
276296 }
277297 }
278298
279- for (var libraryEntry in interfaceMembers .entries) {
299+ for (var libraryEntry in interfaces .entries) {
280300 var libraryUri = libraryEntry.key;
281301
282302 var libraryElement = elementFactory.libraryOfUri (libraryUri);
@@ -295,10 +315,25 @@ class RequirementsManifest {
295315 );
296316 }
297317
298- for (var memberEntry in interfaceEntry.value.entries) {
299- var memberName = memberEntry .key;
318+ for (var methodEntry in interfaceEntry.value.constructors .entries) {
319+ var memberName = methodEntry .key;
300320 var memberId = interfaceItem.getMemberId (memberName);
301- var expectedId = memberEntry.value;
321+ var expectedId = methodEntry.value;
322+ if (expectedId != memberId) {
323+ return InstanceMemberIdMismatch (
324+ libraryUri: libraryUri,
325+ interfaceName: interfaceName,
326+ memberName: memberName,
327+ expectedId: expectedId,
328+ actualId: memberId,
329+ );
330+ }
331+ }
332+
333+ for (var methodEntry in interfaceEntry.value.methods.entries) {
334+ var memberName = methodEntry.key;
335+ var memberId = interfaceItem.getMemberId (memberName);
336+ var expectedId = methodEntry.value;
302337 if (expectedId != memberId) {
303338 return InstanceMemberIdMismatch (
304339 libraryUri: libraryUri,
@@ -342,16 +377,17 @@ class RequirementsManifest {
342377 // SAFETY: we don't export elements without name.
343378 interfaceName! ;
344379
345- var interfacesMap = interfaceMembers [libraryElement.uri] ?? = {};
380+ var interfacesMap = interfaces [libraryElement.uri] ?? = {};
346381 var interfaceItem = manifest.items[interfaceName];
347382
348383 // SAFETY: every interface element must be in the manifest.
349384 interfaceItem as InterfaceItem ;
350385
351386 var memberName = name.asLookupName;
352387 var memberId = interfaceItem.getMemberId (memberName);
353- var interfaceMap = interfacesMap[interfaceName] ?? = {};
354- interfaceMap[memberName] = memberId;
388+ var interface =
389+ interfacesMap[interfaceName] ?? = InterfaceRequirements .empty ();
390+ interface .constructors[memberName] = memberId;
355391 }
356392
357393 /// This method is invoked by [InheritanceManager3] to notify the collector
@@ -379,16 +415,17 @@ class RequirementsManifest {
379415 // SAFETY: we don't export elements without name.
380416 interfaceName! ;
381417
382- var interfacesMap = interfaceMembers [libraryElement.uri] ?? = {};
418+ var interfacesMap = interfaces [libraryElement.uri] ?? = {};
383419 var interfaceItem = manifest.items[interfaceName];
384420
385421 // SAFETY: every interface element must be in the manifest.
386422 interfaceItem as InterfaceItem ;
387423
388424 var memberName = nameObj.name.asLookupName;
389425 var memberId = interfaceItem.getMemberId (memberName);
390- var interfaceMap = interfacesMap[interfaceName] ?? = {};
391- interfaceMap[memberName] = memberId;
426+ var interface =
427+ interfacesMap[interfaceName] ?? = InterfaceRequirements .empty ();
428+ interface .methods[memberName] = memberId;
392429 }
393430
394431 /// This method is invoked by an import scope to notify the collector that
@@ -420,37 +457,25 @@ class RequirementsManifest {
420457 }
421458
422459 for (var libUri in bundleLibraryUriList) {
423- interfaceMembers .remove (libUri);
460+ interfaces .remove (libUri);
424461 }
425462 }
426463
427464 void write (BufferedSink sink) {
428- void writeNameToIdMap (Map <LookupName , ManifestItemId ?> map) {
429- sink.writeMap (
430- map,
431- writeKey: (name) => name.write (sink),
432- writeValue: (id) {
433- sink.writeOptionalObject (id, (id) {
434- id.write (sink);
435- });
436- },
437- );
438- }
439-
440465 sink.writeMap (
441466 topLevels,
442467 writeKey: (uri) => sink.writeUri (uri),
443- writeValue: writeNameToIdMap,
468+ writeValue: (map) => sink. writeNameToIdMap (map) ,
444469 );
445470
446471 sink.writeMap (
447- interfaceMembers ,
472+ interfaces ,
448473 writeKey: (uri) => sink.writeUri (uri),
449474 writeValue: (nameToInterfaceMap) {
450475 sink.writeMap (
451476 nameToInterfaceMap,
452477 writeKey: (name) => name.write (sink),
453- writeValue: writeNameToIdMap ,
478+ writeValue: ( interface ) => interface . write (sink) ,
454479 );
455480 },
456481 );
@@ -515,3 +540,22 @@ class RequirementsManifest {
515540}
516541
517542enum _ExportRequirementCombinatorKind { hide, show }
543+
544+ extension _BufferedSinkExtension on BufferedSink {
545+ void writeNameToIdMap (Map <LookupName , ManifestItemId ?> map) {
546+ writeMap (
547+ map,
548+ writeKey: (name) => name.write (this ),
549+ writeValue: (id) => id.writeOptional (this ),
550+ );
551+ }
552+ }
553+
554+ extension _SummaryDataReaderExtension on SummaryDataReader {
555+ Map <LookupName , ManifestItemId ?> readNameToIdMap () {
556+ return readMap (
557+ readKey: () => LookupName .read (this ),
558+ readValue: () => ManifestItemId .readOptional (this ),
559+ );
560+ }
561+ }
0 commit comments