Skip to content

Commit 2b5b551

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Record InstanceElement.fields/getters/setters access.
Change-Id: I111c048b9a8e9a1e8aad60d2eab68c64eacf9398 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431362 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 3033393 commit 2b5b551

File tree

5 files changed

+899
-46
lines changed

5 files changed

+899
-46
lines changed

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4489,6 +4489,7 @@ abstract class InstanceElementImpl2 extends ElementImpl2
44894489

44904490
@override
44914491
List<FieldElementImpl2> get fields {
4492+
globalResultRequirements?.record_instanceElement_fields(element: this);
44924493
_readMembers();
44934494
return firstFragment.fields.map((e) => e.asElement2).toList();
44944495
}
@@ -4502,6 +4503,7 @@ abstract class InstanceElementImpl2 extends ElementImpl2
45024503

45034504
@override
45044505
List<GetterElementImpl> get getters {
4506+
globalResultRequirements?.record_instanceElement_getters(element: this);
45054507
_readMembers();
45064508
return firstFragment.getters.map((e) => e.element).toList();
45074509
}
@@ -4557,6 +4559,7 @@ abstract class InstanceElementImpl2 extends ElementImpl2
45574559

45584560
@override
45594561
List<SetterElementImpl> get setters {
4562+
globalResultRequirements?.record_instanceElement_setters(element: this);
45604563
_readMembers();
45614564
return firstFragment.setters.map((e) => e.element).toList();
45624565
}
@@ -4586,7 +4589,15 @@ abstract class InstanceElementImpl2 extends ElementImpl2
45864589
name: name,
45874590
);
45884591

4589-
return fields.firstWhereOrNull((e) => e.name3 == name);
4592+
return globalResultRequirements.withoutRecording(
4593+
reason: r'''
4594+
The result depends only on the requested field, which we have already
4595+
recorded above.
4596+
''',
4597+
operation: () {
4598+
return fields.firstWhereOrNull((e) => e.name3 == name);
4599+
},
4600+
);
45904601
}
45914602

45924603
@Deprecated('Use getField instead')
@@ -4601,7 +4612,15 @@ abstract class InstanceElementImpl2 extends ElementImpl2
46014612
name: name,
46024613
);
46034614

4604-
return getters.firstWhereOrNull((e) => e.name3 == name);
4615+
return globalResultRequirements.withoutRecording(
4616+
reason: r'''
4617+
The result depends only on the requested getter, which we have already
4618+
recorded above.
4619+
''',
4620+
operation: () {
4621+
return getters.firstWhereOrNull((e) => e.name3 == name);
4622+
},
4623+
);
46054624
}
46064625

46074626
@Deprecated('Use getGetter instead')
@@ -4639,7 +4658,15 @@ recorded above.
46394658
name: name,
46404659
);
46414660

4642-
return setters.firstWhereOrNull((e) => e.name3 == name);
4661+
return globalResultRequirements.withoutRecording(
4662+
reason: r'''
4663+
The result depends only on the requested setter, which we have already
4664+
recorded above.
4665+
''',
4666+
operation: () {
4667+
return setters.firstWhereOrNull((e) => e.name3 == name);
4668+
},
4669+
);
46434670
}
46444671

46454672
@Deprecated('Use getSetter instead')

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

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ final class ExportLibraryMissing extends ExportFailure {
4444
ExportLibraryMissing({required this.uri});
4545
}
4646

47+
class InstanceChildrenIdsMismatch extends RequirementFailure {
48+
final Uri libraryUri;
49+
final LookupName instanceName;
50+
final String childrenPropertyName;
51+
final ManifestItemIdList expectedIds;
52+
final ManifestItemIdList actualIds;
53+
54+
InstanceChildrenIdsMismatch({
55+
required this.libraryUri,
56+
required this.instanceName,
57+
required this.childrenPropertyName,
58+
required this.expectedIds,
59+
required this.actualIds,
60+
});
61+
}
62+
4763
class InstanceFieldIdMismatch extends RequirementFailure {
4864
final Uri libraryUri;
4965
final LookupName interfaceName;
@@ -76,20 +92,6 @@ class InstanceMethodIdMismatch extends RequirementFailure {
7692
});
7793
}
7894

79-
class InstanceMethodIdsMismatch extends RequirementFailure {
80-
final Uri libraryUri;
81-
final LookupName interfaceName;
82-
final ManifestItemIdList expectedIds;
83-
final ManifestItemIdList actualIds;
84-
85-
InstanceMethodIdsMismatch({
86-
required this.libraryUri,
87-
required this.interfaceName,
88-
required this.expectedIds,
89-
required this.actualIds,
90-
});
91-
}
92-
9395
class InterfaceConstructorIdMismatch extends RequirementFailure {
9496
final Uri libraryUri;
9597
final LookupName interfaceName;

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

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,19 @@ class InstanceItemRequirements {
202202
final Map<LookupName, ManifestItemId?> requestedSetters;
203203
final Map<LookupName, ManifestItemId?> requestedMethods;
204204

205+
ManifestItemIdList? allDeclaredFields;
206+
ManifestItemIdList? allDeclaredGetters;
207+
ManifestItemIdList? allDeclaredSetters;
205208
ManifestItemIdList? allDeclaredMethods;
206209

207210
InstanceItemRequirements({
208211
required this.requestedFields,
209212
required this.requestedGetters,
210213
required this.requestedSetters,
211214
required this.requestedMethods,
215+
required this.allDeclaredFields,
216+
required this.allDeclaredGetters,
217+
required this.allDeclaredSetters,
212218
required this.allDeclaredMethods,
213219
});
214220

@@ -218,6 +224,9 @@ class InstanceItemRequirements {
218224
requestedGetters: {},
219225
requestedSetters: {},
220226
requestedMethods: {},
227+
allDeclaredFields: null,
228+
allDeclaredGetters: null,
229+
allDeclaredSetters: null,
221230
allDeclaredMethods: null,
222231
);
223232
}
@@ -228,6 +237,9 @@ class InstanceItemRequirements {
228237
requestedGetters: reader.readNameToIdMap(),
229238
requestedSetters: reader.readNameToIdMap(),
230239
requestedMethods: reader.readNameToIdMap(),
240+
allDeclaredFields: ManifestItemIdList.readOptional(reader),
241+
allDeclaredGetters: ManifestItemIdList.readOptional(reader),
242+
allDeclaredSetters: ManifestItemIdList.readOptional(reader),
231243
allDeclaredMethods: ManifestItemIdList.readOptional(reader),
232244
);
233245
}
@@ -237,6 +249,9 @@ class InstanceItemRequirements {
237249
sink.writeNameToIdMap(requestedGetters);
238250
sink.writeNameToIdMap(requestedSetters);
239251
sink.writeNameToIdMap(requestedMethods);
252+
allDeclaredFields.writeOptional(sink);
253+
allDeclaredGetters.writeOptional(sink);
254+
allDeclaredSetters.writeOptional(sink);
240255
allDeclaredMethods.writeOptional(sink);
241256
}
242257
}
@@ -510,13 +525,56 @@ class RequirementsManifest {
510525
}
511526
}
512527

528+
if (requirements.allDeclaredFields case var required?) {
529+
var actualItems = instanceItem.declaredFields.values;
530+
var actualIds = actualItems.map((item) => item.id);
531+
if (!required.equalToIterable(actualIds)) {
532+
return InstanceChildrenIdsMismatch(
533+
libraryUri: libraryUri,
534+
instanceName: instanceName,
535+
childrenPropertyName: 'fields',
536+
expectedIds: required,
537+
actualIds: ManifestItemIdList(actualIds.toList()),
538+
);
539+
}
540+
}
541+
542+
if (requirements.allDeclaredGetters case var required?) {
543+
var actualItems = instanceItem.declaredGetters.values;
544+
var actualIds = actualItems.map((item) => item.id);
545+
if (!required.equalToIterable(actualIds)) {
546+
return InstanceChildrenIdsMismatch(
547+
libraryUri: libraryUri,
548+
instanceName: instanceName,
549+
childrenPropertyName: 'getters',
550+
expectedIds: required,
551+
actualIds: ManifestItemIdList(actualIds.toList()),
552+
);
553+
}
554+
}
555+
556+
if (requirements.allDeclaredSetters case var required?) {
557+
var actualItems = instanceItem.declaredSetters.values;
558+
var actualIds = actualItems.map((item) => item.id);
559+
if (!required.equalToIterable(actualIds)) {
560+
return InstanceChildrenIdsMismatch(
561+
libraryUri: libraryUri,
562+
instanceName: instanceName,
563+
childrenPropertyName: 'setters',
564+
expectedIds: required,
565+
actualIds: ManifestItemIdList(actualIds.toList()),
566+
);
567+
}
568+
}
569+
513570
if (requirements.allDeclaredMethods case var required?) {
514571
var actualItems = instanceItem.declaredMethods.values;
515572
var actualIds = actualItems.map((item) => item.id);
516573
if (!required.equalToIterable(actualIds)) {
517-
return InstanceMethodIdsMismatch(
574+
return InstanceChildrenIdsMismatch(
518575
libraryUri: libraryUri,
519-
interfaceName: instanceName,
576+
instanceName: instanceName,
577+
childrenPropertyName: 'methods',
520578
expectedIds: required,
521579
actualIds: ManifestItemIdList(actualIds.toList()),
522580
);
@@ -641,6 +699,24 @@ class RequirementsManifest {
641699
}
642700
}
643701

702+
void record_instanceElement_fields({required InstanceElementImpl2 element}) {
703+
if (_recordingLockLevel != 0) {
704+
return;
705+
}
706+
707+
var itemRequirements = _getInstanceItem(element);
708+
if (itemRequirements == null) {
709+
return;
710+
}
711+
712+
var item = itemRequirements.item;
713+
var requirements = itemRequirements.requirements;
714+
715+
requirements.allDeclaredFields ??= ManifestItemIdList(
716+
item.declaredFields.values.map((item) => item.id).toList(),
717+
);
718+
}
719+
644720
void record_instanceElement_getField({
645721
required InstanceElementImpl2 element,
646722
required String name,
@@ -710,6 +786,24 @@ class RequirementsManifest {
710786
requirements.requestedSetters[methodName] = methodId;
711787
}
712788

789+
void record_instanceElement_getters({required InstanceElementImpl2 element}) {
790+
if (_recordingLockLevel != 0) {
791+
return;
792+
}
793+
794+
var itemRequirements = _getInstanceItem(element);
795+
if (itemRequirements == null) {
796+
return;
797+
}
798+
799+
var item = itemRequirements.item;
800+
var requirements = itemRequirements.requirements;
801+
802+
requirements.allDeclaredGetters ??= ManifestItemIdList(
803+
item.declaredGetters.values.map((item) => item.id).toList(),
804+
);
805+
}
806+
713807
void record_instanceElement_methods({required InstanceElementImpl2 element}) {
714808
if (_recordingLockLevel != 0) {
715809
return;
@@ -728,6 +822,24 @@ class RequirementsManifest {
728822
);
729823
}
730824

825+
void record_instanceElement_setters({required InstanceElementImpl2 element}) {
826+
if (_recordingLockLevel != 0) {
827+
return;
828+
}
829+
830+
var itemRequirements = _getInstanceItem(element);
831+
if (itemRequirements == null) {
832+
return;
833+
}
834+
835+
var item = itemRequirements.item;
836+
var requirements = itemRequirements.requirements;
837+
838+
requirements.allDeclaredSetters ??= ManifestItemIdList(
839+
item.declaredSetters.values.map((item) => item.id).toList(),
840+
);
841+
}
842+
731843
void record_interface_all({required InterfaceElementImpl2 element}) {
732844
var itemRequirements = _getInterfaceItem(element);
733845
if (itemRequirements == null) {

0 commit comments

Comments
 (0)