Skip to content

Commit a0bb3a5

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Record dependencies on FieldElementImpl.getter/setter invocation.
Change-Id: Ic7910d7493c93e55db3da607422ba89996ef29b6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/445362 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent fc5aa1d commit a0bb3a5

File tree

3 files changed

+331
-0
lines changed

3 files changed

+331
-0
lines changed

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2646,6 +2646,16 @@ class FieldElementImpl extends PropertyInducingElementImpl
26462646
];
26472647
}
26482648

2649+
@override
2650+
GetterElementImpl? get getter {
2651+
globalResultRequirements?.record_fieldElement_getter(
2652+
element: this,
2653+
name: name,
2654+
);
2655+
2656+
return super.getter;
2657+
}
2658+
26492659
/// Whether the type of this fragment references a type parameter of the
26502660
/// enclosing element. This includes not only explicitly specified type
26512661
/// annotations, but also inferred types.
@@ -2731,6 +2741,16 @@ class FieldElementImpl extends PropertyInducingElementImpl
27312741
@override
27322742
String? get name3 => name;
27332743

2744+
@override
2745+
SetterElementImpl? get setter {
2746+
globalResultRequirements?.record_fieldElement_setter(
2747+
element: this,
2748+
name: name,
2749+
);
2750+
2751+
return super.setter;
2752+
}
2753+
27342754
@override
27352755
List<FieldFragmentImpl> get _fragments => fragments;
27362756

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,30 @@ class RequirementsManifest {
779779
// TODO(scheglov): implement.
780780
}
781781

782+
void record_fieldElement_getter({
783+
required FieldElementImpl element,
784+
String? name,
785+
}) {
786+
if (name != null) {
787+
record_instanceElement_getGetter(
788+
element: element.enclosingElement,
789+
name: name,
790+
);
791+
}
792+
}
793+
794+
void record_fieldElement_setter({
795+
required FieldElementImpl element,
796+
String? name,
797+
}) {
798+
if (name != null) {
799+
record_instanceElement_getSetter(
800+
element: element.enclosingElement,
801+
name: name,
802+
);
803+
}
804+
}
805+
782806
/// Record that [id] was looked up in the import prefix scope that
783807
/// imports [importedLibraries].
784808
void record_importPrefixScope_lookup({

pkg/analyzer/test/src/dart/analysis/driver_test.dart

Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6146,6 +6146,145 @@ class A {
61466146
);
61476147
}
61486148

6149+
test_dependency_class_instanceGetter_change_getField_getter() async {
6150+
_ManualRequirements.install((state) {
6151+
var A = state.singleUnit.scopeInstanceElement('A');
6152+
A.getField('foo')?.getter;
6153+
});
6154+
6155+
await _runChangeScenarioTA(
6156+
initialA: r'''
6157+
class A {
6158+
int get foo => 0;
6159+
}
6160+
''',
6161+
testCode: r'''
6162+
import 'a.dart';
6163+
''',
6164+
operation: _FineOperationTestFileGetErrors(),
6165+
expectedInitialEvents: r'''
6166+
[status] working
6167+
[operation] linkLibraryCycle SDK
6168+
[future] getErrors T1
6169+
ErrorsResult #0
6170+
path: /home/test/lib/test.dart
6171+
uri: package:test/test.dart
6172+
flags: isLibrary
6173+
errors
6174+
7 +8 UNUSED_IMPORT
6175+
[operation] linkLibraryCycle
6176+
package:test/a.dart
6177+
declaredClasses
6178+
A: #M0
6179+
declaredFields
6180+
foo: #M1
6181+
declaredGetters
6182+
foo: #M2
6183+
interface: #M3
6184+
map
6185+
foo: #M2
6186+
requirements
6187+
topLevels
6188+
dart:core
6189+
int: #M4
6190+
[operation] linkLibraryCycle
6191+
package:test/test.dart
6192+
requirements
6193+
[operation] analyzeFile
6194+
file: /home/test/lib/test.dart
6195+
library: /home/test/lib/test.dart
6196+
[stream]
6197+
ResolvedUnitResult #1
6198+
path: /home/test/lib/test.dart
6199+
uri: package:test/test.dart
6200+
flags: exists isLibrary
6201+
errors
6202+
7 +8 UNUSED_IMPORT
6203+
[operation] analyzedLibrary
6204+
file: /home/test/lib/test.dart
6205+
requirements
6206+
topLevels
6207+
dart:core
6208+
A: <null>
6209+
package:test/a.dart
6210+
A: #M0
6211+
instances
6212+
package:test/a.dart
6213+
A
6214+
requestedFields
6215+
foo: #M1
6216+
requestedGetters
6217+
foo: #M2
6218+
[status] idle
6219+
''',
6220+
updatedA: r'''
6221+
class A {
6222+
double get foo => 0;
6223+
}
6224+
''',
6225+
expectedUpdatedEvents: r'''
6226+
[status] working
6227+
[operation] linkLibraryCycle
6228+
package:test/a.dart
6229+
declaredClasses
6230+
A: #M0
6231+
declaredFields
6232+
foo: #M5
6233+
declaredGetters
6234+
foo: #M6
6235+
interface: #M7
6236+
map
6237+
foo: #M6
6238+
requirements
6239+
topLevels
6240+
dart:core
6241+
double: #M8
6242+
[future] getErrors T2
6243+
ErrorsResult #2
6244+
path: /home/test/lib/test.dart
6245+
uri: package:test/test.dart
6246+
flags: isLibrary
6247+
errors
6248+
7 +8 UNUSED_IMPORT
6249+
[operation] readLibraryCycleBundle
6250+
package:test/test.dart
6251+
[operation] getErrorsCannotReuse
6252+
instanceFieldIdMismatch
6253+
libraryUri: package:test/a.dart
6254+
interfaceName: A
6255+
fieldName: foo
6256+
expectedId: #M1
6257+
actualId: #M5
6258+
[operation] analyzeFile
6259+
file: /home/test/lib/test.dart
6260+
library: /home/test/lib/test.dart
6261+
[stream]
6262+
ResolvedUnitResult #3
6263+
path: /home/test/lib/test.dart
6264+
uri: package:test/test.dart
6265+
flags: exists isLibrary
6266+
errors
6267+
7 +8 UNUSED_IMPORT
6268+
[operation] analyzedLibrary
6269+
file: /home/test/lib/test.dart
6270+
requirements
6271+
topLevels
6272+
dart:core
6273+
A: <null>
6274+
package:test/a.dart
6275+
A: #M0
6276+
instances
6277+
package:test/a.dart
6278+
A
6279+
requestedFields
6280+
foo: #M5
6281+
requestedGetters
6282+
foo: #M6
6283+
[status] idle
6284+
''',
6285+
);
6286+
}
6287+
61496288
test_dependency_class_instanceGetter_change_getGetter() async {
61506289
_ManualRequirements.install((state) {
61516290
var A = state.singleUnit.scopeInstanceElement('A');
@@ -9915,6 +10054,154 @@ class A {
991510054
);
991610055
}
991710056

10057+
test_dependency_class_instanceSetter_change_getField_setter() async {
10058+
_ManualRequirements.install((state) {
10059+
var A = state.singleUnit.scopeInstanceElement('A');
10060+
A.getField('foo')?.setter;
10061+
});
10062+
10063+
await _runChangeScenarioTA(
10064+
initialA: r'''
10065+
class A {
10066+
int get foo => 0;
10067+
set foo(int _) {}
10068+
}
10069+
''',
10070+
testCode: r'''
10071+
import 'a.dart';
10072+
''',
10073+
operation: _FineOperationTestFileGetErrors(),
10074+
expectedInitialEvents: r'''
10075+
[status] working
10076+
[operation] linkLibraryCycle SDK
10077+
[future] getErrors T1
10078+
ErrorsResult #0
10079+
path: /home/test/lib/test.dart
10080+
uri: package:test/test.dart
10081+
flags: isLibrary
10082+
errors
10083+
7 +8 UNUSED_IMPORT
10084+
[operation] linkLibraryCycle
10085+
package:test/a.dart
10086+
declaredClasses
10087+
A: #M0
10088+
declaredFields
10089+
foo: #M1
10090+
declaredGetters
10091+
foo: #M2
10092+
declaredSetters
10093+
foo=: #M3
10094+
interface: #M4
10095+
map
10096+
foo: #M2
10097+
foo=: #M3
10098+
requirements
10099+
topLevels
10100+
dart:core
10101+
int: #M5
10102+
[operation] linkLibraryCycle
10103+
package:test/test.dart
10104+
requirements
10105+
[operation] analyzeFile
10106+
file: /home/test/lib/test.dart
10107+
library: /home/test/lib/test.dart
10108+
[stream]
10109+
ResolvedUnitResult #1
10110+
path: /home/test/lib/test.dart
10111+
uri: package:test/test.dart
10112+
flags: exists isLibrary
10113+
errors
10114+
7 +8 UNUSED_IMPORT
10115+
[operation] analyzedLibrary
10116+
file: /home/test/lib/test.dart
10117+
requirements
10118+
topLevels
10119+
dart:core
10120+
A: <null>
10121+
package:test/a.dart
10122+
A: #M0
10123+
instances
10124+
package:test/a.dart
10125+
A
10126+
requestedFields
10127+
foo: #M1
10128+
requestedSetters
10129+
foo=: #M3
10130+
[status] idle
10131+
''',
10132+
updatedA: r'''
10133+
class A {
10134+
int get foo => 0;
10135+
set foo(double _) {}
10136+
}
10137+
''',
10138+
expectedUpdatedEvents: r'''
10139+
[status] working
10140+
[operation] linkLibraryCycle
10141+
package:test/a.dart
10142+
declaredClasses
10143+
A: #M0
10144+
declaredFields
10145+
foo: #M1
10146+
declaredGetters
10147+
foo: #M2
10148+
declaredSetters
10149+
foo=: #M6
10150+
interface: #M7
10151+
map
10152+
foo: #M2
10153+
foo=: #M6
10154+
requirements
10155+
topLevels
10156+
dart:core
10157+
double: #M8
10158+
int: #M5
10159+
[future] getErrors T2
10160+
ErrorsResult #2
10161+
path: /home/test/lib/test.dart
10162+
uri: package:test/test.dart
10163+
flags: isLibrary
10164+
errors
10165+
7 +8 UNUSED_IMPORT
10166+
[operation] readLibraryCycleBundle
10167+
package:test/test.dart
10168+
[operation] getErrorsCannotReuse
10169+
instanceMethodIdMismatch
10170+
libraryUri: package:test/a.dart
10171+
interfaceName: A
10172+
methodName: foo=
10173+
expectedId: #M3
10174+
actualId: #M6
10175+
[operation] analyzeFile
10176+
file: /home/test/lib/test.dart
10177+
library: /home/test/lib/test.dart
10178+
[stream]
10179+
ResolvedUnitResult #3
10180+
path: /home/test/lib/test.dart
10181+
uri: package:test/test.dart
10182+
flags: exists isLibrary
10183+
errors
10184+
7 +8 UNUSED_IMPORT
10185+
[operation] analyzedLibrary
10186+
file: /home/test/lib/test.dart
10187+
requirements
10188+
topLevels
10189+
dart:core
10190+
A: <null>
10191+
package:test/a.dart
10192+
A: #M0
10193+
instances
10194+
package:test/a.dart
10195+
A
10196+
requestedFields
10197+
foo: #M1
10198+
requestedSetters
10199+
foo=: #M6
10200+
[status] idle
10201+
''',
10202+
);
10203+
}
10204+
991810205
test_dependency_class_instanceSetter_change_getSetter() async {
991910206
_ManualRequirements.install((state) {
992010207
var A = state.singleUnit.scopeInstanceElement('A');

0 commit comments

Comments
 (0)