Fine. Record InstanceElement.fields/getters/setters access.

Change-Id: I111c048b9a8e9a1e8aad60d2eab68c64eacf9398
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431362
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 7040b1b..542b443 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4489,6 +4489,7 @@
 
   @override
   List<FieldElementImpl2> get fields {
+    globalResultRequirements?.record_instanceElement_fields(element: this);
     _readMembers();
     return firstFragment.fields.map((e) => e.asElement2).toList();
   }
@@ -4502,6 +4503,7 @@
 
   @override
   List<GetterElementImpl> get getters {
+    globalResultRequirements?.record_instanceElement_getters(element: this);
     _readMembers();
     return firstFragment.getters.map((e) => e.element).toList();
   }
@@ -4557,6 +4559,7 @@
 
   @override
   List<SetterElementImpl> get setters {
+    globalResultRequirements?.record_instanceElement_setters(element: this);
     _readMembers();
     return firstFragment.setters.map((e) => e.element).toList();
   }
@@ -4586,7 +4589,15 @@
       name: name,
     );
 
-    return fields.firstWhereOrNull((e) => e.name3 == name);
+    return globalResultRequirements.withoutRecording(
+      reason: r'''
+The result depends only on the requested field, which we have already
+recorded above.
+''',
+      operation: () {
+        return fields.firstWhereOrNull((e) => e.name3 == name);
+      },
+    );
   }
 
   @Deprecated('Use getField instead')
@@ -4601,7 +4612,15 @@
       name: name,
     );
 
-    return getters.firstWhereOrNull((e) => e.name3 == name);
+    return globalResultRequirements.withoutRecording(
+      reason: r'''
+The result depends only on the requested getter, which we have already
+recorded above.
+''',
+      operation: () {
+        return getters.firstWhereOrNull((e) => e.name3 == name);
+      },
+    );
   }
 
   @Deprecated('Use getGetter instead')
@@ -4639,7 +4658,15 @@
       name: name,
     );
 
-    return setters.firstWhereOrNull((e) => e.name3 == name);
+    return globalResultRequirements.withoutRecording(
+      reason: r'''
+The result depends only on the requested setter, which we have already
+recorded above.
+''',
+      operation: () {
+        return setters.firstWhereOrNull((e) => e.name3 == name);
+      },
+    );
   }
 
   @Deprecated('Use getSetter instead')
diff --git a/pkg/analyzer/lib/src/fine/requirement_failure.dart b/pkg/analyzer/lib/src/fine/requirement_failure.dart
index dc457ec..1416fce 100644
--- a/pkg/analyzer/lib/src/fine/requirement_failure.dart
+++ b/pkg/analyzer/lib/src/fine/requirement_failure.dart
@@ -44,6 +44,22 @@
   ExportLibraryMissing({required this.uri});
 }
 
+class InstanceChildrenIdsMismatch extends RequirementFailure {
+  final Uri libraryUri;
+  final LookupName instanceName;
+  final String childrenPropertyName;
+  final ManifestItemIdList expectedIds;
+  final ManifestItemIdList actualIds;
+
+  InstanceChildrenIdsMismatch({
+    required this.libraryUri,
+    required this.instanceName,
+    required this.childrenPropertyName,
+    required this.expectedIds,
+    required this.actualIds,
+  });
+}
+
 class InstanceFieldIdMismatch extends RequirementFailure {
   final Uri libraryUri;
   final LookupName interfaceName;
@@ -76,20 +92,6 @@
   });
 }
 
-class InstanceMethodIdsMismatch extends RequirementFailure {
-  final Uri libraryUri;
-  final LookupName interfaceName;
-  final ManifestItemIdList expectedIds;
-  final ManifestItemIdList actualIds;
-
-  InstanceMethodIdsMismatch({
-    required this.libraryUri,
-    required this.interfaceName,
-    required this.expectedIds,
-    required this.actualIds,
-  });
-}
-
 class InterfaceConstructorIdMismatch extends RequirementFailure {
   final Uri libraryUri;
   final LookupName interfaceName;
diff --git a/pkg/analyzer/lib/src/fine/requirements.dart b/pkg/analyzer/lib/src/fine/requirements.dart
index 3015341..5bd1325 100644
--- a/pkg/analyzer/lib/src/fine/requirements.dart
+++ b/pkg/analyzer/lib/src/fine/requirements.dart
@@ -202,6 +202,9 @@
   final Map<LookupName, ManifestItemId?> requestedSetters;
   final Map<LookupName, ManifestItemId?> requestedMethods;
 
+  ManifestItemIdList? allDeclaredFields;
+  ManifestItemIdList? allDeclaredGetters;
+  ManifestItemIdList? allDeclaredSetters;
   ManifestItemIdList? allDeclaredMethods;
 
   InstanceItemRequirements({
@@ -209,6 +212,9 @@
     required this.requestedGetters,
     required this.requestedSetters,
     required this.requestedMethods,
+    required this.allDeclaredFields,
+    required this.allDeclaredGetters,
+    required this.allDeclaredSetters,
     required this.allDeclaredMethods,
   });
 
@@ -218,6 +224,9 @@
       requestedGetters: {},
       requestedSetters: {},
       requestedMethods: {},
+      allDeclaredFields: null,
+      allDeclaredGetters: null,
+      allDeclaredSetters: null,
       allDeclaredMethods: null,
     );
   }
@@ -228,6 +237,9 @@
       requestedGetters: reader.readNameToIdMap(),
       requestedSetters: reader.readNameToIdMap(),
       requestedMethods: reader.readNameToIdMap(),
+      allDeclaredFields: ManifestItemIdList.readOptional(reader),
+      allDeclaredGetters: ManifestItemIdList.readOptional(reader),
+      allDeclaredSetters: ManifestItemIdList.readOptional(reader),
       allDeclaredMethods: ManifestItemIdList.readOptional(reader),
     );
   }
@@ -237,6 +249,9 @@
     sink.writeNameToIdMap(requestedGetters);
     sink.writeNameToIdMap(requestedSetters);
     sink.writeNameToIdMap(requestedMethods);
+    allDeclaredFields.writeOptional(sink);
+    allDeclaredGetters.writeOptional(sink);
+    allDeclaredSetters.writeOptional(sink);
     allDeclaredMethods.writeOptional(sink);
   }
 }
@@ -510,13 +525,56 @@
           }
         }
 
+        if (requirements.allDeclaredFields case var required?) {
+          var actualItems = instanceItem.declaredFields.values;
+          var actualIds = actualItems.map((item) => item.id);
+          if (!required.equalToIterable(actualIds)) {
+            return InstanceChildrenIdsMismatch(
+              libraryUri: libraryUri,
+              instanceName: instanceName,
+              childrenPropertyName: 'fields',
+              expectedIds: required,
+              actualIds: ManifestItemIdList(actualIds.toList()),
+            );
+          }
+        }
+
+        if (requirements.allDeclaredGetters case var required?) {
+          var actualItems = instanceItem.declaredGetters.values;
+          var actualIds = actualItems.map((item) => item.id);
+          if (!required.equalToIterable(actualIds)) {
+            return InstanceChildrenIdsMismatch(
+              libraryUri: libraryUri,
+              instanceName: instanceName,
+              childrenPropertyName: 'getters',
+              expectedIds: required,
+              actualIds: ManifestItemIdList(actualIds.toList()),
+            );
+          }
+        }
+
+        if (requirements.allDeclaredSetters case var required?) {
+          var actualItems = instanceItem.declaredSetters.values;
+          var actualIds = actualItems.map((item) => item.id);
+          if (!required.equalToIterable(actualIds)) {
+            return InstanceChildrenIdsMismatch(
+              libraryUri: libraryUri,
+              instanceName: instanceName,
+              childrenPropertyName: 'setters',
+              expectedIds: required,
+              actualIds: ManifestItemIdList(actualIds.toList()),
+            );
+          }
+        }
+
         if (requirements.allDeclaredMethods case var required?) {
           var actualItems = instanceItem.declaredMethods.values;
           var actualIds = actualItems.map((item) => item.id);
           if (!required.equalToIterable(actualIds)) {
-            return InstanceMethodIdsMismatch(
+            return InstanceChildrenIdsMismatch(
               libraryUri: libraryUri,
-              interfaceName: instanceName,
+              instanceName: instanceName,
+              childrenPropertyName: 'methods',
               expectedIds: required,
               actualIds: ManifestItemIdList(actualIds.toList()),
             );
@@ -641,6 +699,24 @@
     }
   }
 
+  void record_instanceElement_fields({required InstanceElementImpl2 element}) {
+    if (_recordingLockLevel != 0) {
+      return;
+    }
+
+    var itemRequirements = _getInstanceItem(element);
+    if (itemRequirements == null) {
+      return;
+    }
+
+    var item = itemRequirements.item;
+    var requirements = itemRequirements.requirements;
+
+    requirements.allDeclaredFields ??= ManifestItemIdList(
+      item.declaredFields.values.map((item) => item.id).toList(),
+    );
+  }
+
   void record_instanceElement_getField({
     required InstanceElementImpl2 element,
     required String name,
@@ -710,6 +786,24 @@
     requirements.requestedSetters[methodName] = methodId;
   }
 
+  void record_instanceElement_getters({required InstanceElementImpl2 element}) {
+    if (_recordingLockLevel != 0) {
+      return;
+    }
+
+    var itemRequirements = _getInstanceItem(element);
+    if (itemRequirements == null) {
+      return;
+    }
+
+    var item = itemRequirements.item;
+    var requirements = itemRequirements.requirements;
+
+    requirements.allDeclaredGetters ??= ManifestItemIdList(
+      item.declaredGetters.values.map((item) => item.id).toList(),
+    );
+  }
+
   void record_instanceElement_methods({required InstanceElementImpl2 element}) {
     if (_recordingLockLevel != 0) {
       return;
@@ -728,6 +822,24 @@
     );
   }
 
+  void record_instanceElement_setters({required InstanceElementImpl2 element}) {
+    if (_recordingLockLevel != 0) {
+      return;
+    }
+
+    var itemRequirements = _getInstanceItem(element);
+    if (itemRequirements == null) {
+      return;
+    }
+
+    var item = itemRequirements.item;
+    var requirements = itemRequirements.requirements;
+
+    requirements.allDeclaredSetters ??= ManifestItemIdList(
+      item.declaredSetters.values.map((item) => item.id).toList(),
+    );
+  }
+
   void record_interface_all({required InterfaceElementImpl2 element}) {
     var itemRequirements = _getInterfaceItem(element);
     if (itemRequirements == null) {
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 08782e8..1b8bb5e 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -7941,9 +7941,10 @@
 [operation] readLibraryCycleBundle
   package:test/test.dart
 [operation] getErrorsCannotReuse
-  instanceMethodIdsMismatch
+  instanceChildrenIdsMismatch
     libraryUri: package:test/a.dart
-    interfaceName: A
+    instanceName: A
+    childrenPropertyName: methods
     expectedIds: #M1
     actualIds: #M1 #M3
 [operation] analyzeFile
@@ -15389,6 +15390,538 @@
     );
   }
 
+  test_dependency_instanceElement_fields_add() async {
+    _ManualRequirements.install((state) {
+      var A = state.singleUnit.scopeInstanceElement('A');
+      A.fields;
+    });
+
+    await _runChangeScenarioTA(
+      initialA: r'''
+class A {
+  static final int foo = 0;
+}
+''',
+      testCode: r'''
+import 'a.dart';
+''',
+      operation: _FineOperationTestFileGetErrors(),
+      expectedInitialEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[future] getErrors T1
+  ErrorsResult #0
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          foo: #M1
+        declaredGetters
+          foo: #M2
+        interface: #M3
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #1
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredFields: #M1
+[status] idle
+''',
+      updatedA: r'''
+class A {
+  static final int foo = 0;
+  static final int bar = 0;
+}
+''',
+      expectedUpdatedEvents: r'''
+[status] working
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          bar: #M5
+          foo: #M1
+        declaredGetters
+          bar: #M6
+          foo: #M2
+        interface: #M3
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[future] getErrors T2
+  ErrorsResult #2
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] readLibraryCycleBundle
+  package:test/test.dart
+[operation] getErrorsCannotReuse
+  instanceChildrenIdsMismatch
+    libraryUri: package:test/a.dart
+    instanceName: A
+    childrenPropertyName: fields
+    expectedIds: #M1
+    actualIds: #M1 #M5
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #3
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredFields: #M1 #M5
+[status] idle
+''',
+    );
+  }
+
+  test_dependency_instanceElement_getters_add() async {
+    _ManualRequirements.install((state) {
+      var A = state.singleUnit.scopeInstanceElement('A');
+      A.getters;
+    });
+
+    await _runChangeScenarioTA(
+      initialA: r'''
+class A {
+  int get foo => 0;
+}
+''',
+      testCode: r'''
+import 'a.dart';
+''',
+      operation: _FineOperationTestFileGetErrors(),
+      expectedInitialEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[future] getErrors T1
+  ErrorsResult #0
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          foo: #M1
+        declaredGetters
+          foo: #M2
+        interface: #M3
+          map
+            foo: #M2
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #1
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredGetters: #M2
+[status] idle
+''',
+      updatedA: r'''
+class A {
+  int get foo => 0;
+  int get bar => 0;
+}
+''',
+      expectedUpdatedEvents: r'''
+[status] working
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          bar: #M5
+          foo: #M1
+        declaredGetters
+          bar: #M6
+          foo: #M2
+        interface: #M7
+          map
+            bar: #M6
+            foo: #M2
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[future] getErrors T2
+  ErrorsResult #2
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] readLibraryCycleBundle
+  package:test/test.dart
+[operation] getErrorsCannotReuse
+  instanceChildrenIdsMismatch
+    libraryUri: package:test/a.dart
+    instanceName: A
+    childrenPropertyName: getters
+    expectedIds: #M2
+    actualIds: #M2 #M6
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #3
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredGetters: #M2 #M6
+[status] idle
+''',
+    );
+  }
+
+  test_dependency_instanceElement_methods_add() async {
+    _ManualRequirements.install((state) {
+      var A = state.singleUnit.scopeInstanceElement('A');
+      A.methods;
+    });
+
+    await _runChangeScenarioTA(
+      initialA: r'''
+class A {
+  void foo() {}
+}
+''',
+      testCode: r'''
+import 'a.dart';
+''',
+      operation: _FineOperationTestFileGetErrors(),
+      expectedInitialEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[future] getErrors T1
+  ErrorsResult #0
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredMethods
+          foo: #M1
+        interface: #M2
+          map
+            foo: #M1
+  requirements
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #1
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredMethods: #M1
+[status] idle
+''',
+      updatedA: r'''
+class A {
+  void foo() {}
+  void bar() {}
+}
+''',
+      expectedUpdatedEvents: r'''
+[status] working
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredMethods
+          bar: #M3
+          foo: #M1
+        interface: #M4
+          map
+            bar: #M3
+            foo: #M1
+  requirements
+[future] getErrors T2
+  ErrorsResult #2
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] readLibraryCycleBundle
+  package:test/test.dart
+[operation] getErrorsCannotReuse
+  instanceChildrenIdsMismatch
+    libraryUri: package:test/a.dart
+    instanceName: A
+    childrenPropertyName: methods
+    expectedIds: #M1
+    actualIds: #M1 #M3
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #3
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredMethods: #M1 #M3
+[status] idle
+''',
+    );
+  }
+
+  test_dependency_instanceElement_setters_add() async {
+    _ManualRequirements.install((state) {
+      var A = state.singleUnit.scopeInstanceElement('A');
+      A.setters;
+    });
+
+    await _runChangeScenarioTA(
+      initialA: r'''
+class A {
+  set foo(int _) {}
+}
+''',
+      testCode: r'''
+import 'a.dart';
+''',
+      operation: _FineOperationTestFileGetErrors(),
+      expectedInitialEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[future] getErrors T1
+  ErrorsResult #0
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          foo: #M1
+        declaredSetters
+          foo=: #M2
+        interface: #M3
+          map
+            foo=: #M2
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #1
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredSetters: #M2
+[status] idle
+''',
+      updatedA: r'''
+class A {
+  set foo(int _) {}
+  set bar(int _) {}
+}
+''',
+      expectedUpdatedEvents: r'''
+[status] working
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          bar: #M5
+          foo: #M1
+        declaredSetters
+          bar=: #M6
+          foo=: #M2
+        interface: #M7
+          map
+            bar=: #M6
+            foo=: #M2
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[future] getErrors T2
+  ErrorsResult #2
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] readLibraryCycleBundle
+  package:test/test.dart
+[operation] getErrorsCannotReuse
+  instanceChildrenIdsMismatch
+    libraryUri: package:test/a.dart
+    instanceName: A
+    childrenPropertyName: setters
+    expectedIds: #M2
+    actualIds: #M2 #M6
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[stream]
+  ResolvedUnitResult #3
+    path: /home/test/lib/test.dart
+    uri: package:test/test.dart
+    flags: exists isLibrary
+    errors
+      7 +8 UNUSED_IMPORT
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredSetters: #M2 #M6
+[status] idle
+''',
+    );
+  }
+
   test_dependency_mixin_getter_inherited_fromGeneric_on_changeTypeArgument() async {
     configuration.withStreamResolvedUnitResults = false;
     await _runChangeScenarioTA(
@@ -45471,6 +46004,59 @@
     );
   }
 
+  test_req_instanceElement_fields() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  static final int foo = 0;
+}
+''');
+
+    newFile(testFile.path, r'''
+import 'a.dart';
+''');
+
+    _ManualRequirements.install((state) {
+      var A = state.singleUnit.scopeInstanceElement('A');
+      A.fields;
+    });
+
+    await _runManualRequirementsRecording(
+      expectedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          foo: #M1
+        declaredGetters
+          foo: #M2
+        interface: #M3
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredFields: #M1
+[status] idle
+''',
+    );
+  }
+
   test_req_instanceElement_getField() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {
@@ -45851,6 +46437,61 @@
     );
   }
 
+  test_req_instanceElement_getters() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  int get foo => 0;
+}
+''');
+
+    newFile(testFile.path, r'''
+import 'a.dart';
+''');
+
+    _ManualRequirements.install((state) {
+      var A = state.singleUnit.scopeInstanceElement('A');
+      A.getters;
+    });
+
+    await _runManualRequirementsRecording(
+      expectedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          foo: #M1
+        declaredGetters
+          foo: #M2
+        interface: #M3
+          map
+            foo: #M2
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredGetters: #M2
+[status] idle
+''',
+    );
+  }
+
   test_req_instanceElement_methods() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {
@@ -46021,6 +46662,61 @@
     );
   }
 
+  test_req_instanceElement_setters() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {
+  set foo(int _) {}
+}
+''');
+
+    newFile(testFile.path, r'''
+import 'a.dart';
+''');
+
+    _ManualRequirements.install((state) {
+      var A = state.singleUnit.scopeInstanceElement('A');
+      A.setters;
+    });
+
+    await _runManualRequirementsRecording(
+      expectedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/a.dart
+    declaredClasses
+      A: #M0
+        declaredFields
+          foo: #M1
+        declaredSetters
+          foo=: #M2
+        interface: #M3
+          map
+            foo=: #M2
+  requirements
+    topLevels
+      dart:core
+        int: #M4
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        A: <null>
+      package:test/a.dart
+        A: #M0
+    instances
+      package:test/a.dart
+        A
+          allDeclaredSetters: #M2
+[status] idle
+''',
+    );
+  }
+
   test_req_interfaceElement_getConstructor_named() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {
diff --git a/pkg/analyzer/test/src/dart/analysis/result_printer.dart b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
index 9a49e03..43c74b6 100644
--- a/pkg/analyzer/test/src/dart/analysis/result_printer.dart
+++ b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
@@ -111,44 +111,59 @@
     sink.writeElements('instances', libEntries, (libEntry) {
       var interfaceEntries = libEntry.value.sorted;
       sink.writeElements('${libEntry.key}', interfaceEntries, (instanceEntry) {
+        var instanceRequirements = instanceEntry.value;
         sink.writelnWithIndent(instanceEntry.key.asString);
+
         sink.withIndent(() {
-          sink.writeElements(
+          void writeRequested(
+            String name,
+            Map<LookupName, ManifestItemId?> nameToIdMap,
+          ) {
+            sink.writeElements(name, nameToIdMap.sorted, _writeNamedId);
+          }
+
+          writeRequested(
             'requestedFields',
-            instanceEntry.value.requestedFields.sorted,
-            _writeNamedId,
+            instanceRequirements.requestedFields,
           );
-        });
-        sink.withIndent(() {
-          sink.writeElements(
+          writeRequested(
             'requestedGetters',
-            instanceEntry.value.requestedGetters.sorted,
-            _writeNamedId,
+            instanceRequirements.requestedGetters,
           );
-        });
-        sink.withIndent(() {
-          sink.writeElements(
+          writeRequested(
             'requestedSetters',
-            instanceEntry.value.requestedSetters.sorted,
-            _writeNamedId,
+            instanceRequirements.requestedSetters,
           );
-        });
-        sink.withIndent(() {
-          sink.writeElements(
+          writeRequested(
             'requestedMethods',
-            instanceEntry.value.requestedMethods.sorted,
-            _writeNamedId,
+            instanceRequirements.requestedMethods,
           );
         });
 
         sink.withIndent(() {
-          var idList = instanceEntry.value.allDeclaredMethods;
-          if (idList != null) {
-            if (idList.ids.isNotEmpty) {
+          void writeAllDeclared(String name, ManifestItemIdList? idList) {
+            if (idList != null && idList.ids.isNotEmpty) {
               var idListStr = idList.asString(idProvider);
-              sink.writelnWithIndent('allDeclaredMethods: $idListStr');
+              sink.writelnWithIndent('$name: $idListStr');
             }
           }
+
+          writeAllDeclared(
+            'allDeclaredFields',
+            instanceRequirements.allDeclaredFields,
+          );
+          writeAllDeclared(
+            'allDeclaredGetters',
+            instanceRequirements.allDeclaredGetters,
+          );
+          writeAllDeclared(
+            'allDeclaredSetters',
+            instanceRequirements.allDeclaredSetters,
+          );
+          writeAllDeclared(
+            'allDeclaredMethods',
+            instanceRequirements.allDeclaredMethods,
+          );
         });
       });
     });
@@ -501,11 +516,12 @@
           'expectedId': idProvider.manifestId(failure.expectedId),
           'actualId': idProvider.manifestId(failure.actualId),
         });
-      case InstanceMethodIdsMismatch():
-        sink.writelnWithIndent('instanceMethodIdsMismatch');
+      case InstanceChildrenIdsMismatch():
+        sink.writelnWithIndent('instanceChildrenIdsMismatch');
         sink.writeProperties({
           'libraryUri': failure.libraryUri,
-          'interfaceName': failure.interfaceName.asString,
+          'instanceName': failure.instanceName.asString,
+          'childrenPropertyName': failure.childrenPropertyName,
           'expectedIds': failure.expectedIds.asString(idProvider),
           'actualIds': failure.actualIds.asString(idProvider),
         });