Skip to content

Commit b37171c

Browse files
scheglovCommit Queue
authored and
Commit Queue
committed
Fine. Support for type aliases.
Change-Id: I7907ba6b4041bd3723d37a652b883cea6dfc617f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/430540 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 24ebc7a commit b37171c

File tree

6 files changed

+541
-3
lines changed

6 files changed

+541
-3
lines changed

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9675,7 +9675,7 @@ class TypeAliasElementImpl2 extends TypeDefiningElementImpl2
96759675
FragmentedAnnotatableElementMixin<TypeAliasFragment>,
96769676
FragmentedElementMixin<TypeAliasFragment>,
96779677
_HasSinceSdkVersionMixin
9678-
implements TypeAliasElement {
9678+
implements AnnotatableElementImpl, TypeAliasElement {
96799679
@override
96809680
final Reference reference;
96819681

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

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class LibraryManifest {
2929
final Map<LookupName, ExtensionItem> declaredExtensions;
3030
final Map<LookupName, ExtensionTypeItem> declaredExtensionTypes;
3131
final Map<LookupName, MixinItem> declaredMixins;
32+
final Map<LookupName, TypeAliasItem> declaredTypeAliases;
3233
final Map<LookupName, TopLevelGetterItem> declaredGetters;
3334
final Map<LookupName, TopLevelSetterItem> declaredSetters;
3435
final Map<LookupName, TopLevelFunctionItem> declaredFunctions;
@@ -41,6 +42,7 @@ class LibraryManifest {
4142
required this.declaredExtensions,
4243
required this.declaredExtensionTypes,
4344
required this.declaredMixins,
45+
required this.declaredTypeAliases,
4446
required this.declaredGetters,
4547
required this.declaredSetters,
4648
required this.declaredFunctions,
@@ -65,6 +67,9 @@ class LibraryManifest {
6567
declaredMixins: reader.readLookupNameMap(
6668
readValue: () => MixinItem.read(reader),
6769
),
70+
declaredTypeAliases: reader.readLookupNameMap(
71+
readValue: () => TypeAliasItem.read(reader),
72+
),
6873
declaredGetters: reader.readLookupNameMap(
6974
readValue: () => TopLevelGetterItem.read(reader),
7075
),
@@ -89,6 +94,7 @@ class LibraryManifest {
8994
declaredExtensions,
9095
declaredExtensionTypes,
9196
declaredMixins,
97+
declaredTypeAliases,
9298
declaredGetters,
9399
declaredSetters,
94100
declaredFunctions,
@@ -107,6 +113,7 @@ class LibraryManifest {
107113
declaredExtensions[name]?.id ??
108114
declaredExtensionTypes[name]?.id ??
109115
declaredMixins[name]?.id ??
116+
declaredTypeAliases[name]?.id ??
110117
declaredGetters[name]?.id ??
111118
declaredSetters[name]?.id ??
112119
declaredFunctions[name]?.id ??
@@ -120,6 +127,7 @@ class LibraryManifest {
120127
declaredExtensions.write(sink);
121128
declaredExtensionTypes.write(sink);
122129
declaredMixins.write(sink);
130+
declaredTypeAliases.write(sink);
123131
declaredGetters.write(sink);
124132
declaredSetters.write(sink);
125133
declaredFunctions.write(sink);
@@ -654,6 +662,22 @@ class LibraryManifestBuilder {
654662
newItems[lookupName] = item;
655663
}
656664

665+
void _addTypeAlias({
666+
required EncodeContext encodingContext,
667+
required Map<LookupName, TypeAliasItem> newItems,
668+
required TypeAliasElementImpl2 element,
669+
required LookupName lookupName,
670+
}) {
671+
var item = _getOrBuildElementItem(element, () {
672+
return TypeAliasItem.fromElement(
673+
id: ManifestItemId.generate(),
674+
context: encodingContext,
675+
element: element,
676+
);
677+
});
678+
newItems[lookupName] = item;
679+
}
680+
657681
/// Assert that every manifest can be serialized, and when deserialized
658682
/// results in the same manifest.
659683
bool _assertSerialization() {
@@ -690,6 +714,7 @@ class LibraryManifestBuilder {
690714
var newExtensionItems = <LookupName, ExtensionItem>{};
691715
var newExtensionTypeItems = <LookupName, ExtensionTypeItem>{};
692716
var newMixinItems = <LookupName, MixinItem>{};
717+
var newTypeAliasItems = <LookupName, TypeAliasItem>{};
693718
var newTopLevelGetters = <LookupName, TopLevelGetterItem>{};
694719
var newTopLevelSetters = <LookupName, TopLevelSetterItem>{};
695720
var newTopLevelFunctions = <LookupName, TopLevelFunctionItem>{};
@@ -765,8 +790,13 @@ class LibraryManifestBuilder {
765790
element: element,
766791
lookupName: lookupName,
767792
);
768-
769-
// TODO(scheglov): add remaining elements
793+
case TypeAliasElementImpl2():
794+
_addTypeAlias(
795+
encodingContext: encodingContext,
796+
newItems: newTypeAliasItems,
797+
element: element,
798+
lookupName: lookupName,
799+
);
770800
}
771801
}
772802

@@ -777,6 +807,7 @@ class LibraryManifestBuilder {
777807
declaredExtensions: newExtensionItems,
778808
declaredExtensionTypes: newExtensionTypeItems,
779809
declaredMixins: newMixinItems,
810+
declaredTypeAliases: newTypeAliasItems,
780811
declaredGetters: newTopLevelGetters,
781812
declaredSetters: newTopLevelSetters,
782813
declaredFunctions: newTopLevelFunctions,
@@ -956,6 +987,7 @@ class LibraryManifestBuilder {
956987
declaredExtensions: {},
957988
declaredExtensionTypes: {},
958989
declaredMixins: {},
990+
declaredTypeAliases: {},
959991
declaredGetters: {},
960992
declaredSetters: {},
961993
declaredFunctions: {},
@@ -1114,6 +1146,10 @@ class _LibraryMatch {
11141146
if (!_matchTopVariable(name: name, element: element)) {
11151147
structureMismatched.add(element);
11161148
}
1149+
case TypeAliasElementImpl2():
1150+
if (!_matchTypeAlias(name: name, element: element)) {
1151+
structureMismatched.add(element);
1152+
}
11171153
}
11181154
}
11191155
}
@@ -1527,4 +1563,23 @@ class _LibraryMatch {
15271563
_addMatchingElementItem(element, item, matchContext);
15281564
return true;
15291565
}
1566+
1567+
bool _matchTypeAlias({
1568+
required LookupName? name,
1569+
required TypeAliasElementImpl2 element,
1570+
}) {
1571+
var item = manifest.declaredTypeAliases[name];
1572+
if (item == null) {
1573+
return false;
1574+
}
1575+
1576+
var matchContext = MatchContext(parent: null);
1577+
if (!item.match(matchContext, element)) {
1578+
return false;
1579+
}
1580+
1581+
_addMatchingElementItem(element, item, matchContext);
1582+
1583+
return true;
1584+
}
15301585
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ enum ManifestElementKind {
209209
enum_,
210210
extensionType,
211211
mixin_,
212+
typeAlias,
212213
topLevelVariable,
213214
topLevelGetter,
214215
topLevelSetter,
@@ -249,6 +250,8 @@ enum ManifestElementKind {
249250
return ManifestElementKind.instanceMethod;
250251
case ConstructorElement():
251252
return ManifestElementKind.interfaceConstructor;
253+
case TypeAliasElement():
254+
return ManifestElementKind.typeAlias;
252255
default:
253256
throw StateError('Unexpected (${element.runtimeType}) $element');
254257
}

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,58 @@ class TopLevelVariableItem extends TopLevelItem<TopLevelVariableElementImpl2> {
13681368
}
13691369
}
13701370

1371+
class TypeAliasItem extends TopLevelItem<TypeAliasElementImpl2> {
1372+
final List<ManifestTypeParameter> typeParameters;
1373+
final ManifestType aliasedType;
1374+
1375+
TypeAliasItem({
1376+
required super.id,
1377+
required super.metadata,
1378+
required this.typeParameters,
1379+
required this.aliasedType,
1380+
});
1381+
1382+
factory TypeAliasItem.fromElement({
1383+
required ManifestItemId id,
1384+
required EncodeContext context,
1385+
required TypeAliasElementImpl2 element,
1386+
}) {
1387+
return context.withTypeParameters(element.typeParameters2, (
1388+
typeParameters,
1389+
) {
1390+
return TypeAliasItem(
1391+
id: id,
1392+
metadata: ManifestMetadata.encode(context, element.metadata2),
1393+
typeParameters: typeParameters,
1394+
aliasedType: element.aliasedType.encode(context),
1395+
);
1396+
});
1397+
}
1398+
1399+
factory TypeAliasItem.read(SummaryDataReader reader) {
1400+
return TypeAliasItem(
1401+
id: ManifestItemId.read(reader),
1402+
metadata: ManifestMetadata.read(reader),
1403+
typeParameters: ManifestTypeParameter.readList(reader),
1404+
aliasedType: ManifestType.read(reader),
1405+
);
1406+
}
1407+
1408+
@override
1409+
bool match(MatchContext context, TypeAliasElementImpl2 element) {
1410+
context.addTypeParameters(element.typeParameters2);
1411+
return super.match(context, element) &&
1412+
aliasedType.match(context, element.aliasedType);
1413+
}
1414+
1415+
@override
1416+
void write(BufferedSink sink) {
1417+
super.write(sink);
1418+
typeParameters.writeList(sink);
1419+
aliasedType.write(sink);
1420+
}
1421+
}
1422+
13711423
enum _InstanceItemMemberItemKind { field, constructor, method, getter, setter }
13721424

13731425
extension LookupNameToIdMapExtension on Map<LookupName, ManifestItemId> {

0 commit comments

Comments
 (0)