Skip to content

Commit 462bcaf

Browse files
stereotype441Commit Queue
authored andcommitted
[analyzer] Make two derived classes for PropertyAccessorElementImpl.
Derived class `GetterFragmentImpl` is used for getters and `SetterFragmentImpl` is used for setters. Only `GetterFragmentImpl` implements `GetterFragment` and only `SetterFragmentImpl` implements `SetterFragment`. This ensures that clients performing `is GetterFragment` and `is SetterFragment` checks get the expected behavior. (Previously, any instance of `PropertyAccessorElementImpl` would satisfy *both* `is GetterFragment` and `is SetterFragment` tests). This made it possible for the types of getters defined in `GetterFragment` and `SetterFragment` to be more precise, which in turn allowed some casts to be removed from the analyzer. Change-Id: I243e8f6547d9aed77175e8c14c48af8970bfd528 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/412140 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent b5ff3b8 commit 462bcaf

File tree

16 files changed

+279
-255
lines changed

16 files changed

+279
-255
lines changed

pkg/analysis_server/lib/src/services/refactoring/legacy/convert_getter_to_method.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl
105105
for (
106106
GetterFragment? fragment = element.firstFragment;
107107
fragment != null;
108-
fragment = fragment.nextFragment as GetterFragment?
108+
fragment = fragment.nextFragment
109109
) {
110110
var nameRange = range.fragmentName(fragment);
111111
if (nameRange == null) {

pkg/analyzer/api.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3873,6 +3873,9 @@ package:analyzer/dart/element/element2.dart:
38733873
GetterFragment (class extends Object implements PropertyAccessorFragment):
38743874
new (constructor: GetterFragment Function())
38753875
correspondingSetter2 (getter: SetterFragment?)
3876+
element (getter: GetterElement)
3877+
nextFragment (getter: GetterFragment?)
3878+
previousFragment (getter: GetterFragment?)
38763879
HasSinceSdkVersion (class extends Object):
38773880
new (constructor: HasSinceSdkVersion Function())
38783881
sinceSdkVersion (getter: Version?)
@@ -4203,6 +4206,9 @@ package:analyzer/dart/element/element2.dart:
42034206
SetterFragment (class extends Object implements PropertyAccessorFragment):
42044207
new (constructor: SetterFragment Function())
42054208
correspondingGetter2 (getter: GetterFragment?)
4209+
element (getter: SetterElement)
4210+
nextFragment (getter: SetterFragment?)
4211+
previousFragment (getter: SetterFragment?)
42064212
ShowElementCombinator (see above)
42074213
SuperFormalParameterElement2 (class extends Object implements FormalParameterElement):
42084214
new (constructor: SuperFormalParameterElement2 Function())

pkg/analyzer/lib/dart/element/element2.dart

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,22 +1181,14 @@ abstract class GetterFragment implements PropertyAccessorFragment {
11811181
/// `null` if there is no corresponding setter.
11821182
SetterFragment? get correspondingSetter2;
11831183

1184-
// TODO(brianwilkerson): This should override `nextFragment` to be more
1185-
// specific, but can't because the Impl class supports both getters and
1186-
// setters.
1187-
// @override
1188-
// GetterFragment? get nextFragment;
1184+
@override
1185+
GetterElement get element;
11891186

1190-
// TODO(brianwilkerson): This should override `previousFragment` to be more
1191-
// specific, but can't because the Impl class supports both getters and
1192-
// setters.
1193-
// @override
1194-
// GetterFragment? get previousFragment;
1187+
@override
1188+
GetterFragment? get nextFragment;
11951189

1196-
// TODO(brianwilkerson): This should override `element` to be more specific,
1197-
// but can't because the Impl class supports both getters and setters.
1198-
// @override
1199-
// GetterElement get element;
1190+
@override
1191+
GetterFragment? get previousFragment;
12001192
}
12011193

12021194
/// The interface that is implemented by elements that can have `@Since()`
@@ -2502,22 +2494,14 @@ abstract class SetterFragment implements PropertyAccessorFragment {
25022494
/// `null` if there is no corresponding getter.
25032495
GetterFragment? get correspondingGetter2;
25042496

2505-
// TODO(brianwilkerson): This should override `element` to be more specific,
2506-
// but can't because the Impl class supports both getters and setters.
2507-
// @override
2508-
// SetterElement get element;
2497+
@override
2498+
SetterElement get element;
25092499

2510-
// TODO(brianwilkerson): This should override `nextFragment` to be more
2511-
// specific, but can't because the Impl class supports both getters and
2512-
// setters.
2513-
// @override
2514-
// SetterFragment? get nextFragment;
2500+
@override
2501+
SetterFragment? get nextFragment;
25152502

2516-
// TODO(brianwilkerson): This should override `previousFragment` to be more
2517-
// specific, but can't because the Impl class supports both getters and
2518-
// setters.
2519-
// @override
2520-
// SetterFragment? get previousFragment;
2503+
@override
2504+
SetterFragment? get previousFragment;
25212505
}
25222506

25232507
/// A super formal parameter.

0 commit comments

Comments
 (0)