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), });