@@ -105,15 +105,14 @@ class LibraryManifestBuilder {
105105 required ClassElementImpl2 element,
106106 required LookupName lookupName,
107107 }) {
108- var item = itemMap[element];
109- if (item is ! ClassItem ) {
110- item = ClassItem .fromElement (
108+ var item = _getOrBuildElementItem (element, () {
109+ return ClassItem .fromElement (
111110 name: lookupName,
112111 id: ManifestItemId .generate (),
113112 context: encodingContext,
114113 element: element,
115114 );
116- }
115+ });
117116 newItems[lookupName] = item;
118117
119118 var classItem = item;
@@ -190,16 +189,14 @@ class LibraryManifestBuilder {
190189 required GetterElement2OrMember element,
191190 required LookupName lookupName,
192191 }) {
193- var item = itemMap[element];
194- if (item is ! InstanceGetterItem ) {
195- item = InstanceGetterItem .fromElement (
192+ var item = _getOrBuildElementItem (element, () {
193+ return InstanceGetterItem .fromElement (
196194 name: lookupName,
197195 id: ManifestItemId .generate (),
198196 context: encodingContext,
199197 element: element,
200198 );
201- itemMap[element] = item;
202- }
199+ });
203200 instanceItem.members[lookupName] = item;
204201 }
205202
@@ -209,16 +206,14 @@ class LibraryManifestBuilder {
209206 required MethodElement2OrMember element,
210207 required LookupName lookupName,
211208 }) {
212- var item = itemMap[element];
213- if (item is ! InstanceMethodItem ) {
214- item = InstanceMethodItem .fromElement (
209+ var item = _getOrBuildElementItem (element, () {
210+ return InstanceMethodItem .fromElement (
215211 name: lookupName,
216212 id: ManifestItemId .generate (),
217213 context: encodingContext,
218214 element: element,
219215 );
220- itemMap[element] = item;
221- }
216+ });
222217 instanceItem.members[lookupName] = item;
223218 }
224219
@@ -232,17 +227,14 @@ class LibraryManifestBuilder {
232227 // So, we include all of them, including private.
233228 // This is a general rule for "static" elements.
234229
235- var item = itemMap[element];
236- // TODO(scheglov): rewrite checks with != null
237- if (item is ! InterfaceConstructorItem ) {
238- item = InterfaceConstructorItem .fromElement (
230+ var item = _getOrBuildElementItem (element, () {
231+ return InterfaceConstructorItem .fromElement (
239232 name: lookupName,
240233 id: ManifestItemId .generate (),
241234 context: encodingContext,
242235 element: element,
243236 );
244- itemMap[element] = item;
245- }
237+ });
246238 interfaceItem.members[lookupName] = item;
247239 }
248240
@@ -305,15 +297,14 @@ class LibraryManifestBuilder {
305297 required TopLevelFunctionElementImpl element,
306298 required LookupName lookupName,
307299 }) {
308- var item = itemMap[element];
309- if (item is ! TopLevelFunctionItem ) {
310- item = TopLevelFunctionItem .fromElement (
300+ var item = _getOrBuildElementItem (element, () {
301+ return TopLevelFunctionItem .fromElement (
311302 name: lookupName,
312303 id: ManifestItemId .generate (),
313304 context: encodingContext,
314305 element: element,
315306 );
316- }
307+ });
317308 newItems[lookupName] = item;
318309 }
319310
@@ -323,15 +314,14 @@ class LibraryManifestBuilder {
323314 required GetterElementImpl element,
324315 required LookupName lookupName,
325316 }) {
326- var item = itemMap[element];
327- if (item is ! TopLevelGetterItem ) {
328- item = TopLevelGetterItem .fromElement (
317+ var item = _getOrBuildElementItem (element, () {
318+ return TopLevelGetterItem .fromElement (
329319 name: lookupName,
330320 id: ManifestItemId .generate (),
331321 context: encodingContext,
332322 element: element,
333323 );
334- }
324+ });
335325 newItems[lookupName] = item;
336326 }
337327
@@ -457,6 +447,24 @@ class LibraryManifestBuilder {
457447 LibraryManifest _getInputManifest (Uri uri) {
458448 return inputManifests[uri] ?? LibraryManifest (uri: uri, items: {});
459449 }
450+
451+ /// Returns either the existing item from [itemMap] , or builds a new one.
452+ Item _getOrBuildElementItem< Element extends Element2 ,
453+ Item extends ManifestItem > (
454+ Element element,
455+ Item Function () build,
456+ ) {
457+ // We assume that when matching elements against the structure of
458+ // the item, we put into [itemMap] only the type of the item that
459+ // corresponds the type of the element.
460+ var item = itemMap[element] as Item ? ;
461+ if (item == null ) {
462+ item = build ();
463+ // To reuse items for inherited members.
464+ itemMap[element] = item;
465+ }
466+ return item;
467+ }
460468}
461469
462470/// Compares structures of [library] children against [manifest] .
0 commit comments