@@ -26,6 +26,7 @@ class LibraryManifest {
2626
2727 final Map <LookupName , ClassItem > declaredClasses;
2828 final Map <LookupName , EnumItem > declaredEnums;
29+ final Map <LookupName , ExtensionTypeItem > declaredExtensionTypes;
2930 final Map <LookupName , MixinItem > declaredMixins;
3031 final Map <LookupName , TopLevelGetterItem > declaredGetters;
3132 final Map <LookupName , TopLevelSetterItem > declaredSetters;
@@ -36,6 +37,7 @@ class LibraryManifest {
3637 required this .reExportMap,
3738 required this .declaredClasses,
3839 required this .declaredEnums,
40+ required this .declaredExtensionTypes,
3941 required this .declaredMixins,
4042 required this .declaredGetters,
4143 required this .declaredSetters,
@@ -52,6 +54,9 @@ class LibraryManifest {
5254 declaredEnums: reader.readLookupNameMap (
5355 readValue: () => EnumItem .read (reader),
5456 ),
57+ declaredExtensionTypes: reader.readLookupNameMap (
58+ readValue: () => ExtensionTypeItem .read (reader),
59+ ),
5560 declaredMixins: reader.readLookupNameMap (
5661 readValue: () => MixinItem .read (reader),
5762 ),
@@ -76,6 +81,7 @@ class LibraryManifest {
7681 ...< Map <LookupName , TopLevelItem >> [
7782 declaredClasses,
7883 declaredEnums,
84+ declaredExtensionTypes,
7985 declaredMixins,
8086 declaredGetters,
8187 declaredSetters,
@@ -92,6 +98,7 @@ class LibraryManifest {
9298 ManifestItemId ? getExportedId (LookupName name) {
9399 return declaredClasses[name]? .id ??
94100 declaredEnums[name]? .id ??
101+ declaredExtensionTypes[name]? .id ??
95102 declaredMixins[name]? .id ??
96103 declaredGetters[name]? .id ??
97104 declaredSetters[name]? .id ??
@@ -103,6 +110,7 @@ class LibraryManifest {
103110 reExportMap.write (sink);
104111 declaredClasses.write (sink);
105112 declaredEnums.write (sink);
113+ declaredExtensionTypes.write (sink);
106114 declaredMixins.write (sink);
107115 declaredGetters.write (sink);
108116 declaredSetters.write (sink);
@@ -279,6 +287,33 @@ class LibraryManifestBuilder {
279287 });
280288 }
281289
290+ void _addExtensionType ({
291+ required EncodeContext encodingContext,
292+ required Map <LookupName , TopLevelItem > newItems,
293+ required ExtensionTypeElementImpl2 element,
294+ required LookupName lookupName,
295+ }) {
296+ var extensionTypeItem = _getOrBuildElementItem (element, () {
297+ return ExtensionTypeItem .fromElement (
298+ id: ManifestItemId .generate (),
299+ context: encodingContext,
300+ element: element,
301+ );
302+ });
303+ newItems[lookupName] = extensionTypeItem;
304+
305+ encodingContext.withTypeParameters (element.typeParameters2, (
306+ typeParameters,
307+ ) {
308+ extensionTypeItem.beforeUpdatingMembers ();
309+ _addInterfaceElementMembers (
310+ encodingContext: encodingContext,
311+ instanceElement: element,
312+ interfaceItem: extensionTypeItem,
313+ );
314+ });
315+ }
316+
282317 void _addInstanceElementField ({
283318 required EncodeContext encodingContext,
284319 required InstanceItem instanceItem,
@@ -617,6 +652,7 @@ class LibraryManifestBuilder {
617652 var libraryUri = libraryElement.uri;
618653 var newClassItems = < LookupName , ClassItem > {};
619654 var newEnumItems = < LookupName , EnumItem > {};
655+ var newExtensionTypeItems = < LookupName , ExtensionTypeItem > {};
620656 var newMixinItems = < LookupName , MixinItem > {};
621657 var newTopLevelGetters = < LookupName , TopLevelGetterItem > {};
622658 var newTopLevelSetters = < LookupName , TopLevelSetterItem > {};
@@ -644,6 +680,13 @@ class LibraryManifestBuilder {
644680 element: element,
645681 lookupName: lookupName,
646682 );
683+ case ExtensionTypeElementImpl2 ():
684+ _addExtensionType (
685+ encodingContext: encodingContext,
686+ newItems: newExtensionTypeItems,
687+ element: element,
688+ lookupName: lookupName,
689+ );
647690 case GetterElementImpl ():
648691 _addTopLevelGetter (
649692 encodingContext: encodingContext,
@@ -688,6 +731,7 @@ class LibraryManifestBuilder {
688731 reExportMap: {},
689732 declaredClasses: newClassItems,
690733 declaredEnums: newEnumItems,
734+ declaredExtensionTypes: newExtensionTypeItems,
691735 declaredMixins: newMixinItems,
692736 declaredGetters: newTopLevelGetters,
693737 declaredSetters: newTopLevelSetters,
@@ -865,6 +909,7 @@ class LibraryManifestBuilder {
865909 reExportMap: {},
866910 declaredClasses: {},
867911 declaredEnums: {},
912+ declaredExtensionTypes: {},
868913 declaredMixins: {},
869914 declaredGetters: {},
870915 declaredSetters: {},
@@ -996,6 +1041,10 @@ class _LibraryMatch {
9961041 if (! _matchEnum (name: name, element: element)) {
9971042 structureMismatched.add (element);
9981043 }
1044+ case ExtensionTypeElementImpl2 ():
1045+ if (! _matchExtensionType (name: name, element: element)) {
1046+ structureMismatched.add (element);
1047+ }
9991048 case GetterElementImpl ():
10001049 if (! _matchTopGetter (name: name, element: element)) {
10011050 structureMismatched.add (element);
@@ -1095,6 +1144,37 @@ class _LibraryMatch {
10951144 return true ;
10961145 }
10971146
1147+ bool _matchExtensionType ({
1148+ required LookupName ? name,
1149+ required ExtensionTypeElementImpl2 element,
1150+ }) {
1151+ var item = manifest.declaredExtensionTypes[name];
1152+ if (item is ! ExtensionTypeItem ) {
1153+ return false ;
1154+ }
1155+
1156+ var matchContext = MatchContext (parent: null );
1157+ if (! item.match (matchContext, element)) {
1158+ return false ;
1159+ }
1160+
1161+ _addMatchingElementItem (element, item, matchContext);
1162+
1163+ _matchInterfaceElementConstructors (
1164+ matchContext: matchContext,
1165+ interfaceElement: element,
1166+ item: item,
1167+ );
1168+
1169+ _matchInstanceElementExecutables (
1170+ matchContext: matchContext,
1171+ element: element,
1172+ item: item,
1173+ );
1174+
1175+ return true ;
1176+ }
1177+
10981178 void _matchInstanceElementExecutables ({
10991179 required InstanceElementImpl2 element,
11001180 required InstanceItem item,
0 commit comments