Skip to content

Commit 4d21cd4

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Check that itemMap has item of the right type or null.
Change-Id: I72a20ad328a1c15245a43d410b0c64b854889c89 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/418540 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 1a31b98 commit 4d21cd4

File tree

1 file changed

+36
-28
lines changed

1 file changed

+36
-28
lines changed

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

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)