Skip to content

Commit 16cb3ba

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Add LibraryManifest.declaredVariables
Change-Id: Ifd23ee6f4ad9500b89c3e50bec5064b5a64cbac1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/429425 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 13377d1 commit 16cb3ba

File tree

5 files changed

+1043
-221
lines changed

5 files changed

+1043
-221
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,7 +2950,7 @@ class FieldElementImpl2 extends PropertyInducingElementImpl2
29502950
FragmentedAnnotatableElementMixin<FieldFragmentImpl>,
29512951
FragmentedElementMixin<FieldFragmentImpl>,
29522952
_HasSinceSdkVersionMixin
2953-
implements FieldElement2OrMember, AnnotatableElementImpl {
2953+
implements FieldElement2OrMember {
29542954
@override
29552955
final FieldFragmentImpl firstFragment;
29562956

@@ -9108,7 +9108,7 @@ abstract class PropertyInducingElementImpl
91089108
}
91099109

91109110
abstract class PropertyInducingElementImpl2 extends VariableElementImpl2
9111-
implements PropertyInducingElement2OrMember {
9111+
implements PropertyInducingElement2OrMember, AnnotatableElementImpl {
91129112
@override
91139113
PropertyInducingElementImpl get firstFragment;
91149114

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class LibraryManifest {
2828
final Map<LookupName, TopLevelGetterItem> declaredGetters;
2929
final Map<LookupName, TopLevelSetterItem> declaredSetters;
3030
final Map<LookupName, TopLevelFunctionItem> declaredFunctions;
31+
final Map<LookupName, TopLevelVariableItem> declaredVariables;
3132

3233
LibraryManifest({
3334
required this.reExportMap,
@@ -36,6 +37,7 @@ class LibraryManifest {
3637
required this.declaredGetters,
3738
required this.declaredSetters,
3839
required this.declaredFunctions,
40+
required this.declaredVariables,
3941
});
4042

4143
factory LibraryManifest.read(SummaryDataReader reader) {
@@ -56,6 +58,9 @@ class LibraryManifest {
5658
declaredFunctions: reader.readLookupNameMap(
5759
readValue: () => TopLevelFunctionItem.read(reader),
5860
),
61+
declaredVariables: reader.readLookupNameMap(
62+
readValue: () => TopLevelVariableItem.read(reader),
63+
),
5964
);
6065
}
6166

@@ -77,6 +82,7 @@ class LibraryManifest {
7782
declaredGetters.write(sink);
7883
declaredSetters.write(sink);
7984
declaredFunctions.write(sink);
85+
declaredVariables.write(sink);
8086
}
8187
}
8288

@@ -510,6 +516,22 @@ class LibraryManifestBuilder {
510516
newItems[lookupName] = item;
511517
}
512518

519+
void _addTopLevelVariable({
520+
required EncodeContext encodingContext,
521+
required Map<LookupName, TopLevelVariableItem> newItems,
522+
required TopLevelVariableElementImpl2 element,
523+
required LookupName lookupName,
524+
}) {
525+
var item = _getOrBuildElementItem(element, () {
526+
return TopLevelVariableItem.fromElement(
527+
id: ManifestItemId.generate(),
528+
context: encodingContext,
529+
element: element,
530+
);
531+
});
532+
newItems[lookupName] = item;
533+
}
534+
513535
/// Assert that every manifest can be serialized, and when deserialized
514536
/// results in the same manifest.
515537
bool _assertSerialization() {
@@ -546,6 +568,7 @@ class LibraryManifestBuilder {
546568
var newTopLevelGetters = <LookupName, TopLevelGetterItem>{};
547569
var newTopLevelSetters = <LookupName, TopLevelSetterItem>{};
548570
var newTopLevelFunctions = <LookupName, TopLevelFunctionItem>{};
571+
var newTopLevelVariables = <LookupName, TopLevelVariableItem>{};
549572

550573
for (var element in libraryElement.children2) {
551574
var lookupName = element.lookupName?.asLookupName;
@@ -589,6 +612,14 @@ class LibraryManifestBuilder {
589612
element: element,
590613
lookupName: lookupName,
591614
);
615+
case TopLevelVariableElementImpl2():
616+
_addTopLevelVariable(
617+
encodingContext: encodingContext,
618+
newItems: newTopLevelVariables,
619+
element: element,
620+
lookupName: lookupName,
621+
);
622+
592623
// TODO(scheglov): add remaining elements
593624
}
594625
}
@@ -600,6 +631,7 @@ class LibraryManifestBuilder {
600631
declaredGetters: newTopLevelGetters,
601632
declaredSetters: newTopLevelSetters,
602633
declaredFunctions: newTopLevelFunctions,
634+
declaredVariables: newTopLevelVariables,
603635
);
604636
libraryElement.manifest = newManifest;
605637
newManifests[libraryUri] = newManifest;
@@ -750,6 +782,7 @@ class LibraryManifestBuilder {
750782
declaredGetters: {},
751783
declaredSetters: {},
752784
declaredFunctions: {},
785+
declaredVariables: {},
753786
);
754787
}
755788

@@ -876,6 +909,10 @@ class _LibraryMatch {
876909
if (!_matchTopFunction(name: name, element: element)) {
877910
structureMismatched.add(element);
878911
}
912+
case TopLevelVariableElementImpl2():
913+
if (!_matchTopVariable(name: name, element: element)) {
914+
structureMismatched.add(element);
915+
}
879916
}
880917
}
881918
}
@@ -1184,4 +1221,22 @@ class _LibraryMatch {
11841221
_addMatchingElementItem(element, item, matchContext);
11851222
return true;
11861223
}
1224+
1225+
bool _matchTopVariable({
1226+
required LookupName? name,
1227+
required TopLevelVariableElementImpl2 element,
1228+
}) {
1229+
var item = manifest.declaredVariables[name];
1230+
if (item == null) {
1231+
return false;
1232+
}
1233+
1234+
var matchContext = MatchContext(parent: null);
1235+
if (!item.match(matchContext, element)) {
1236+
return false;
1237+
}
1238+
1239+
_addMatchingElementItem(element, item, matchContext);
1240+
return true;
1241+
}
11871242
}

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,59 @@ class TopLevelSetterItem extends TopLevelItem<SetterElementImpl> {
11191119
}
11201120
}
11211121

1122+
class TopLevelVariableItem extends TopLevelItem<TopLevelVariableElementImpl2> {
1123+
final ManifestType type;
1124+
final ManifestNode? constInitializer;
1125+
1126+
TopLevelVariableItem({
1127+
required super.id,
1128+
required super.metadata,
1129+
required this.type,
1130+
required this.constInitializer,
1131+
});
1132+
1133+
factory TopLevelVariableItem.fromElement({
1134+
required ManifestItemId id,
1135+
required EncodeContext context,
1136+
required TopLevelVariableElementImpl2 element,
1137+
}) {
1138+
return TopLevelVariableItem(
1139+
id: id,
1140+
metadata: ManifestMetadata.encode(context, element.metadata2),
1141+
type: element.type.encode(context),
1142+
constInitializer: element.constantInitializer2?.expression.encode(
1143+
context,
1144+
),
1145+
);
1146+
}
1147+
1148+
factory TopLevelVariableItem.read(SummaryDataReader reader) {
1149+
return TopLevelVariableItem(
1150+
id: ManifestItemId.read(reader),
1151+
metadata: ManifestMetadata.read(reader),
1152+
type: ManifestType.read(reader),
1153+
constInitializer: ManifestNode.readOptional(reader),
1154+
);
1155+
}
1156+
1157+
@override
1158+
bool match(MatchContext context, TopLevelVariableElementImpl2 element) {
1159+
return super.match(context, element) &&
1160+
type.match(context, element.type) &&
1161+
constInitializer.match(
1162+
context,
1163+
element.constantInitializer2?.expression,
1164+
);
1165+
}
1166+
1167+
@override
1168+
void write(BufferedSink sink) {
1169+
super.write(sink);
1170+
type.write(sink);
1171+
constInitializer.writeOptional(sink);
1172+
}
1173+
}
1174+
11221175
enum _InstanceItemMemberItemKind { field, constructor, method, getter, setter }
11231176

11241177
extension LookupNameToIdMapExtension on Map<LookupName, ManifestItemId> {

0 commit comments

Comments
 (0)