Skip to content

Commit 24ebc7a

Browse files
committed
Fine. Support for extensions.
Change-Id: I3ebae3c6228b1b2c95e224e2e6624e46212d3b2f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/430461 Reviewed-by: Brian Wilkerson <[email protected]>
1 parent f14ce9e commit 24ebc7a

File tree

5 files changed

+608
-0
lines changed

5 files changed

+608
-0
lines changed

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

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class LibraryManifest {
2626

2727
final Map<LookupName, ClassItem> declaredClasses;
2828
final Map<LookupName, EnumItem> declaredEnums;
29+
final Map<LookupName, ExtensionItem> declaredExtensions;
2930
final Map<LookupName, ExtensionTypeItem> declaredExtensionTypes;
3031
final Map<LookupName, MixinItem> declaredMixins;
3132
final Map<LookupName, TopLevelGetterItem> declaredGetters;
@@ -37,6 +38,7 @@ class LibraryManifest {
3738
required this.reExportMap,
3839
required this.declaredClasses,
3940
required this.declaredEnums,
41+
required this.declaredExtensions,
4042
required this.declaredExtensionTypes,
4143
required this.declaredMixins,
4244
required this.declaredGetters,
@@ -54,6 +56,9 @@ class LibraryManifest {
5456
declaredEnums: reader.readLookupNameMap(
5557
readValue: () => EnumItem.read(reader),
5658
),
59+
declaredExtensions: reader.readLookupNameMap(
60+
readValue: () => ExtensionItem.read(reader),
61+
),
5762
declaredExtensionTypes: reader.readLookupNameMap(
5863
readValue: () => ExtensionTypeItem.read(reader),
5964
),
@@ -81,6 +86,7 @@ class LibraryManifest {
8186
...<Map<LookupName, TopLevelItem>>[
8287
declaredClasses,
8388
declaredEnums,
89+
declaredExtensions,
8490
declaredExtensionTypes,
8591
declaredMixins,
8692
declaredGetters,
@@ -98,6 +104,7 @@ class LibraryManifest {
98104
ManifestItemId? getExportedId(LookupName name) {
99105
return declaredClasses[name]?.id ??
100106
declaredEnums[name]?.id ??
107+
declaredExtensions[name]?.id ??
101108
declaredExtensionTypes[name]?.id ??
102109
declaredMixins[name]?.id ??
103110
declaredGetters[name]?.id ??
@@ -110,6 +117,7 @@ class LibraryManifest {
110117
reExportMap.write(sink);
111118
declaredClasses.write(sink);
112119
declaredEnums.write(sink);
120+
declaredExtensions.write(sink);
113121
declaredExtensionTypes.write(sink);
114122
declaredMixins.write(sink);
115123
declaredGetters.write(sink);
@@ -287,6 +295,33 @@ class LibraryManifestBuilder {
287295
});
288296
}
289297

298+
void _addExtension({
299+
required EncodeContext encodingContext,
300+
required Map<LookupName, ExtensionItem> newItems,
301+
required ExtensionElementImpl2 element,
302+
required LookupName lookupName,
303+
}) {
304+
var extensionItem = _getOrBuildElementItem(element, () {
305+
return ExtensionItem.fromElement(
306+
id: ManifestItemId.generate(),
307+
context: encodingContext,
308+
element: element,
309+
);
310+
});
311+
newItems[lookupName] = extensionItem;
312+
313+
encodingContext.withTypeParameters(element.typeParameters2, (
314+
typeParameters,
315+
) {
316+
extensionItem.beforeUpdatingMembers();
317+
_addInstanceElementMembers(
318+
encodingContext: encodingContext,
319+
instanceElement: element,
320+
instanceItem: extensionItem,
321+
);
322+
});
323+
}
324+
290325
void _addExtensionType({
291326
required EncodeContext encodingContext,
292327
required Map<LookupName, TopLevelItem> newItems,
@@ -652,6 +687,7 @@ class LibraryManifestBuilder {
652687
var libraryUri = libraryElement.uri;
653688
var newClassItems = <LookupName, ClassItem>{};
654689
var newEnumItems = <LookupName, EnumItem>{};
690+
var newExtensionItems = <LookupName, ExtensionItem>{};
655691
var newExtensionTypeItems = <LookupName, ExtensionTypeItem>{};
656692
var newMixinItems = <LookupName, MixinItem>{};
657693
var newTopLevelGetters = <LookupName, TopLevelGetterItem>{};
@@ -680,6 +716,13 @@ class LibraryManifestBuilder {
680716
element: element,
681717
lookupName: lookupName,
682718
);
719+
case ExtensionElementImpl2():
720+
_addExtension(
721+
encodingContext: encodingContext,
722+
newItems: newExtensionItems,
723+
element: element,
724+
lookupName: lookupName,
725+
);
683726
case ExtensionTypeElementImpl2():
684727
_addExtensionType(
685728
encodingContext: encodingContext,
@@ -731,6 +774,7 @@ class LibraryManifestBuilder {
731774
reExportMap: {},
732775
declaredClasses: newClassItems,
733776
declaredEnums: newEnumItems,
777+
declaredExtensions: newExtensionItems,
734778
declaredExtensionTypes: newExtensionTypeItems,
735779
declaredMixins: newMixinItems,
736780
declaredGetters: newTopLevelGetters,
@@ -909,6 +953,7 @@ class LibraryManifestBuilder {
909953
reExportMap: {},
910954
declaredClasses: {},
911955
declaredEnums: {},
956+
declaredExtensions: {},
912957
declaredExtensionTypes: {},
913958
declaredMixins: {},
914959
declaredGetters: {},
@@ -1041,6 +1086,10 @@ class _LibraryMatch {
10411086
if (!_matchEnum(name: name, element: element)) {
10421087
structureMismatched.add(element);
10431088
}
1089+
case ExtensionElementImpl2():
1090+
if (!_matchExtension(name: name, element: element)) {
1091+
structureMismatched.add(element);
1092+
}
10441093
case ExtensionTypeElementImpl2():
10451094
if (!_matchExtensionType(name: name, element: element)) {
10461095
structureMismatched.add(element);
@@ -1144,6 +1193,31 @@ class _LibraryMatch {
11441193
return true;
11451194
}
11461195

1196+
bool _matchExtension({
1197+
required LookupName? name,
1198+
required ExtensionElementImpl2 element,
1199+
}) {
1200+
var item = manifest.declaredExtensions[name];
1201+
if (item == null) {
1202+
return false;
1203+
}
1204+
1205+
var matchContext = MatchContext(parent: null);
1206+
if (!item.match(matchContext, element)) {
1207+
return false;
1208+
}
1209+
1210+
_addMatchingElementItem(element, item, matchContext);
1211+
1212+
_matchInstanceElementExecutables(
1213+
matchContext: matchContext,
1214+
element: element,
1215+
item: item,
1216+
);
1217+
1218+
return true;
1219+
}
1220+
11471221
bool _matchExtensionType({
11481222
required LookupName? name,
11491223
required ExtensionTypeElementImpl2 element,

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,78 @@ class EnumItem extends InterfaceItem<EnumElementImpl2> {
144144
}
145145
}
146146

147+
/// The item for [ExtensionElementImpl2].
148+
class ExtensionItem<E extends ExtensionElementImpl2> extends InstanceItem<E> {
149+
final ManifestType extendedType;
150+
151+
ExtensionItem({
152+
required super.id,
153+
required super.metadata,
154+
required super.typeParameters,
155+
required super.declaredConflicts,
156+
required super.declaredFields,
157+
required super.declaredGetters,
158+
required super.declaredSetters,
159+
required super.declaredMethods,
160+
required super.declaredConstructors,
161+
required super.inheritedConstructors,
162+
required this.extendedType,
163+
});
164+
165+
factory ExtensionItem.fromElement({
166+
required ManifestItemId id,
167+
required EncodeContext context,
168+
required ExtensionElementImpl2 element,
169+
}) {
170+
return context.withTypeParameters(element.typeParameters2, (
171+
typeParameters,
172+
) {
173+
return ExtensionItem(
174+
id: id,
175+
metadata: ManifestMetadata.encode(context, element.metadata2),
176+
typeParameters: typeParameters,
177+
declaredConflicts: {},
178+
declaredFields: {},
179+
declaredGetters: {},
180+
declaredSetters: {},
181+
declaredMethods: {},
182+
declaredConstructors: {},
183+
inheritedConstructors: {},
184+
extendedType: element.extendedType.encode(context),
185+
);
186+
});
187+
}
188+
189+
factory ExtensionItem.read(SummaryDataReader reader) {
190+
return ExtensionItem(
191+
id: ManifestItemId.read(reader),
192+
metadata: ManifestMetadata.read(reader),
193+
typeParameters: ManifestTypeParameter.readList(reader),
194+
declaredConflicts: reader.readLookupNameToIdMap(),
195+
declaredFields: InstanceItemFieldItem.readMap(reader),
196+
declaredGetters: InstanceItemGetterItem.readMap(reader),
197+
declaredSetters: InstanceItemSetterItem.readMap(reader),
198+
declaredMethods: InstanceItemMethodItem.readMap(reader),
199+
declaredConstructors: InterfaceItemConstructorItem.readMap(reader),
200+
inheritedConstructors: reader.readLookupNameToIdMap(),
201+
extendedType: ManifestType.read(reader),
202+
);
203+
}
204+
205+
@override
206+
bool match(MatchContext context, E element) {
207+
context.addTypeParameters(element.typeParameters2);
208+
return super.match(context, element) &&
209+
extendedType.match(context, element.extendedType);
210+
}
211+
212+
@override
213+
void write(BufferedSink sink) {
214+
super.write(sink);
215+
extendedType.write(sink);
216+
}
217+
}
218+
147219
class ExtensionTypeItem extends InterfaceItem<ExtensionTypeElementImpl2> {
148220
ExtensionTypeItem({
149221
required super.id,

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ class RequirementsManifest {
423423
var instanceItem =
424424
libraryManifest.declaredClasses[instanceName] ??
425425
libraryManifest.declaredEnums[instanceName] ??
426+
libraryManifest.declaredExtensions[instanceName] ??
426427
libraryManifest.declaredExtensionTypes[instanceName] ??
427428
libraryManifest.declaredMixins[instanceName];
428429
if (instanceItem is! InstanceItem) {
@@ -889,6 +890,7 @@ class RequirementsManifest {
889890
var instanceItem =
890891
manifest.declaredClasses[instanceName] ??
891892
manifest.declaredEnums[instanceName] ??
893+
manifest.declaredExtensions[instanceName] ??
892894
manifest.declaredExtensionTypes[instanceName] ??
893895
manifest.declaredMixins[instanceName];
894896

0 commit comments

Comments
 (0)