Skip to content

Commit f637435

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Support for extension types.
Change-Id: I82bcaafd877b1192806343ea46e2c6a5594f131a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/430520 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent f2d416b commit f637435

File tree

6 files changed

+886
-0
lines changed

6 files changed

+886
-0
lines changed

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

Lines changed: 80 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, 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,

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ final class ManifestElement {
207207
enum ManifestElementKind {
208208
class_,
209209
enum_,
210+
extensionType,
210211
mixin_,
211212
topLevelVariable,
212213
topLevelGetter,
@@ -224,6 +225,8 @@ enum ManifestElementKind {
224225
return ManifestElementKind.class_;
225226
case EnumElement():
226227
return ManifestElementKind.enum_;
228+
case ExtensionTypeElement():
229+
return ManifestElementKind.extensionType;
227230
case MixinElement():
228231
return ManifestElementKind.mixin_;
229232
case TopLevelVariableElement():

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

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

147+
class ExtensionTypeItem extends InterfaceItem<ExtensionTypeElementImpl2> {
148+
ExtensionTypeItem({
149+
required super.id,
150+
required super.metadata,
151+
required super.typeParameters,
152+
required super.declaredConflicts,
153+
required super.declaredFields,
154+
required super.declaredGetters,
155+
required super.declaredSetters,
156+
required super.declaredMethods,
157+
required super.declaredConstructors,
158+
required super.inheritedConstructors,
159+
required super.interface,
160+
required super.supertype,
161+
required super.mixins,
162+
required super.interfaces,
163+
});
164+
165+
factory ExtensionTypeItem.fromElement({
166+
required ManifestItemId id,
167+
required EncodeContext context,
168+
required ExtensionTypeElementImpl2 element,
169+
}) {
170+
return context.withTypeParameters(element.typeParameters2, (
171+
typeParameters,
172+
) {
173+
return ExtensionTypeItem(
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+
interface: ManifestInterface.empty(),
185+
supertype: element.supertype?.encode(context),
186+
mixins: element.mixins.encode(context),
187+
interfaces: element.interfaces.encode(context),
188+
);
189+
});
190+
}
191+
192+
factory ExtensionTypeItem.read(SummaryDataReader reader) {
193+
return ExtensionTypeItem(
194+
id: ManifestItemId.read(reader),
195+
metadata: ManifestMetadata.read(reader),
196+
typeParameters: ManifestTypeParameter.readList(reader),
197+
declaredConflicts: reader.readLookupNameToIdMap(),
198+
declaredFields: InstanceItemFieldItem.readMap(reader),
199+
declaredGetters: InstanceItemGetterItem.readMap(reader),
200+
declaredSetters: InstanceItemSetterItem.readMap(reader),
201+
declaredMethods: InstanceItemMethodItem.readMap(reader),
202+
declaredConstructors: InterfaceItemConstructorItem.readMap(reader),
203+
inheritedConstructors: reader.readLookupNameToIdMap(),
204+
supertype: ManifestType.readOptional(reader),
205+
mixins: ManifestType.readList(reader),
206+
interfaces: ManifestType.readList(reader),
207+
interface: ManifestInterface.read(reader),
208+
);
209+
}
210+
}
211+
147212
/// The item for [InstanceElementImpl2].
148213
sealed class InstanceItem<E extends InstanceElementImpl2>
149214
extends TopLevelItem<E> {

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

Lines changed: 4 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.declaredExtensionTypes[instanceName] ??
426427
libraryManifest.declaredMixins[instanceName];
427428
if (instanceItem is! InstanceItem) {
428429
return TopLevelNotInterface(
@@ -507,6 +508,7 @@ class RequirementsManifest {
507508
var interfaceItem =
508509
libraryManifest.declaredClasses[interfaceName] ??
509510
libraryManifest.declaredEnums[interfaceName] ??
511+
libraryManifest.declaredExtensionTypes[interfaceName] ??
510512
libraryManifest.declaredMixins[interfaceName];
511513
if (interfaceItem is! InterfaceItem) {
512514
return TopLevelNotInterface(
@@ -887,6 +889,7 @@ class RequirementsManifest {
887889
var instanceItem =
888890
manifest.declaredClasses[instanceName] ??
889891
manifest.declaredEnums[instanceName] ??
892+
manifest.declaredExtensionTypes[instanceName] ??
890893
manifest.declaredMixins[instanceName];
891894

892895
// SAFETY: every instance element must be in the manifest.
@@ -919,6 +922,7 @@ class RequirementsManifest {
919922
var interfaceItem =
920923
manifest.declaredClasses[interfaceName] ??
921924
manifest.declaredEnums[interfaceName] ??
925+
manifest.declaredExtensionTypes[interfaceName] ??
922926
manifest.declaredMixins[interfaceName];
923927

924928
// SAFETY: every interface element must be in the manifest.

0 commit comments

Comments
 (0)