Elements. Remove PropertyAccessorFragment.variable3 and PropertyInducingFragment.getter2/setter2.
It is getter / setter elements that know that they form a
PropertyInducingElement, and the other way around,
PropertyInducingElement that has getter and setter. Fragments OTOH, just
dangle from the elements.
Change-Id: Ide8ece5cb318c75093b0173c661b01f564d1a55a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/435746
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index 2176852..7749641 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -4015,7 +4015,6 @@
element (getter: PropertyAccessorElement)
nextFragment (getter: PropertyAccessorFragment?)
previousFragment (getter: PropertyAccessorFragment?)
- variable3 (getter: PropertyInducingFragment?)
PropertyInducingElement (class extends Object implements VariableElement, Annotatable, HasSinceSdkVersion):
new (constructor: PropertyInducingElement Function())
firstFragment (getter: PropertyInducingFragment)
@@ -4027,14 +4026,12 @@
PropertyInducingFragment (class extends Object implements VariableFragment, Annotatable):
new (constructor: PropertyInducingFragment Function())
element (getter: PropertyInducingElement)
- getter2 (getter: GetterFragment?)
hasInitializer (getter: bool)
isAugmentation (getter: bool)
isSynthetic (getter: bool)
libraryFragment (getter: LibraryFragment)
nextFragment (getter: PropertyInducingFragment?)
previousFragment (getter: PropertyInducingFragment?)
- setter2 (getter: SetterFragment?)
SetterElement (class extends Object implements PropertyAccessorElement):
new (constructor: SetterElement Function())
baseElement (getter: SetterElement)
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 8629c9a..4ec23ae 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -3208,12 +3208,6 @@
@override
PropertyAccessorFragment? get previousFragment;
-
- /// The field or top-level variable associated with this property accessors.
- ///
- /// If this property accessor was explicitly defined (is not synthetic) then
- /// the variable associated with it will be synthetic.
- PropertyInducingFragment? get variable3;
}
/// A variable that has an associated getter and possibly a setter. Note that
@@ -3275,12 +3269,6 @@
@override
PropertyInducingElement get element;
- /// The getter associated with this variable.
- ///
- /// If this variable was explicitly defined (is not synthetic) then the
- /// getter associated with it will be synthetic.
- GetterFragment? get getter2;
-
/// Whether the variable has an initializer at declaration.
bool get hasInitializer;
@@ -3305,18 +3293,6 @@
@override
PropertyInducingFragment? get previousFragment;
-
- /// The setter associated with this variable.
- ///
- /// Returns `null` if the variable is effectively `final` and therefore
- /// doesn't have a setter associated with it.
- ///
- /// This can happen either because the variable is explicitly defined as
- /// being `final` or because the variable is induced by an explicit getter
- /// that does not have a corresponding setter. If this variable was
- /// explicitly defined (is not synthetic) then the setter associated with
- /// it will be synthetic.
- SetterFragment? get setter2;
}
/// A setter.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 9fa779c..3872637 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3184,10 +3184,11 @@
///
/// Such fields are `index`, `_name`, and `values`.
bool get isSyntheticEnumField {
+ // TODO(scheglov): move to element
return enclosingElement3 is EnumFragmentImpl &&
isSynthetic &&
element.getter2?.isSynthetic == true &&
- setter == null;
+ element.setter2 == null;
}
@override
@@ -4490,12 +4491,6 @@
GetterFragmentImpl.forVariable(super.variable) : super.forVariable();
@override
- PropertyAccessorFragmentImpl? get correspondingGetter => null;
-
- @override
- PropertyAccessorFragmentImpl? get correspondingSetter => variable2?.setter;
-
- @override
bool get isGetter => true;
@override
@@ -8829,16 +8824,6 @@
/// `PropertyAccessorElement`.
abstract class PropertyAccessorElementOrMember
implements ExecutableElementOrMember {
- /// The accessor representing the getter that corresponds to (has the same
- /// name as) this setter, or `null` if this accessor is not a setter or
- /// if there is no corresponding getter.
- PropertyAccessorElementOrMember? get correspondingGetter;
-
- /// The accessor representing the setter that corresponds to (has the same
- /// name as) this getter, or `null` if this accessor is not a getter or
- /// if there is no corresponding setter.
- PropertyAccessorElementOrMember? get correspondingSetter;
-
/// Whether the accessor represents a getter.
bool get isGetter;
@@ -8847,15 +8832,6 @@
@override
TypeImpl get returnType;
-
- /// The field or top-level variable associated with this accessor.
- ///
- /// If this accessor was explicitly defined (is not synthetic) then the
- /// variable associated with it will be synthetic.
- ///
- /// If this accessor is an augmentation, and [augmentationTarget] is `null`,
- /// the variable is `null`.
- PropertyInducingElementOrMember? get variable2;
}
sealed class PropertyAccessorFragmentImpl extends ExecutableFragmentImpl
@@ -8885,12 +8861,6 @@
}
@override
- PropertyAccessorFragmentImpl? get correspondingGetter;
-
- @override
- PropertyAccessorFragmentImpl? get correspondingSetter;
-
- @override
PropertyAccessorFragmentImpl get declaration => this;
@override
@@ -8946,14 +8916,6 @@
}
@override
- PropertyInducingFragmentImpl? get variable2 {
- return element.variable3?.firstFragment;
- }
-
- @override
- PropertyInducingFragment? get variable3 => variable2;
-
- @override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExecutableElement(
this,
@@ -9088,15 +9050,6 @@
@override
Fragment get enclosingFragment => enclosingElement3 as Fragment;
- /// The getter associated with this variable.
- ///
- /// If this variable was explicitly defined (is not synthetic) then the
- /// getter associated with it will be synthetic.
- GetterFragmentImpl? get getter => element.getter2?.firstFragment;
-
- @override
- GetterFragmentImpl? get getter2 => getter;
-
/// Return `true` if this variable needs the setter.
bool get hasSetter {
if (isConst) {
@@ -9127,20 +9080,6 @@
@override
MetadataImpl get metadata2 => metadata;
- /// The setter associated with this variable, or `null` if the variable
- /// is effectively `final` and therefore does not have a setter associated
- /// with it.
- ///
- /// This can happen either because the variable is explicitly defined as
- /// being `final` or because the variable is induced by an explicit getter
- /// that does not have a corresponding setter. If this variable was
- /// explicitly defined (is not synthetic) then the setter associated with
- /// it will be synthetic.
- SetterFragmentImpl? get setter => element.setter2?.firstFragment;
-
- @override
- SetterFragmentImpl? get setter2 => setter;
-
bool get shouldUseTypeForInitializerInference {
return hasModifier(Modifier.SHOULD_USE_TYPE_FOR_INITIALIZER_INFERENCE);
}
@@ -9310,12 +9249,6 @@
SetterFragmentImpl.forVariable(super.variable) : super.forVariable();
@override
- PropertyAccessorFragmentImpl? get correspondingGetter => variable2?.getter;
-
- @override
- PropertyAccessorFragmentImpl? get correspondingSetter => null;
-
- @override
bool get isGetter => false;
@override
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index ec814bc..123c639 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -1026,8 +1026,10 @@
var result = SetterElementImpl(setterReference, resultFragment);
- var field = executable.variable3!;
- var resultField = FieldFragmentImpl(name2: field.name3, nameOffset: -1);
+ var resultField = FieldFragmentImpl(
+ name2: executable.name3,
+ nameOffset: -1,
+ );
resultField.enclosingElement3 = class_.firstFragment;
var elementName = executable.name3!;
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index d9c2f37..e052ba6 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -532,15 +532,11 @@
@override
GetterElement2OrMember? get getter2 {
- var baseGetter = declaration.getter;
+ var baseGetter = baseElement.getter2;
if (baseGetter == null) {
return null;
}
- return GetterMember._(
- declaration: baseGetter,
- substitution: substitution,
- typeParameters: baseGetter.typeParameters,
- );
+ return GetterMember.forSubstitution(baseGetter, substitution);
}
@override
@@ -586,15 +582,11 @@
@override
SetterElement2OrMember? get setter2 {
- var baseSetter = declaration.setter;
+ var baseSetter = baseElement.setter2;
if (baseSetter == null) {
return null;
}
- return SetterMember._(
- declaration: baseSetter,
- substitution: substitution,
- typeParameters: baseSetter.typeParameters,
- );
+ return SetterMember.forSubstitution(baseSetter, substitution);
}
@override
@@ -676,11 +668,11 @@
@override
SetterElement2OrMember? get correspondingSetter2 {
- var setter = correspondingSetter;
- if (setter is SetterMember) {
- return setter;
+ var baseSetter = baseElement.variable3!.setter2;
+ if (baseSetter == null) {
+ return null;
}
- return setter?.asElement2 as SetterElementImpl?;
+ return SetterMember.forSubstitution(baseSetter, substitution);
}
@override
@@ -721,14 +713,21 @@
return visitor.visitGetterElement(this);
}
+ static GetterElement2OrMember forSubstitution(
+ GetterElement2OrMember element,
+ MapSubstitution substitution,
+ ) {
+ // TODO(scheglov): avoid type cast
+ return ExecutableMember.from(element, substitution)
+ as GetterElement2OrMember;
+ }
+
static GetterElement2OrMember forTargetType(
GetterElement2OrMember element,
InterfaceType targetType,
) {
var substitution = Substitution.fromInterfaceType(targetType);
- // TODO(scheglov): avoid type cast
- return ExecutableMember.from(element, substitution)
- as GetterElement2OrMember;
+ return forSubstitution(element, substitution);
}
}
@@ -1216,30 +1215,6 @@
});
@override
- PropertyAccessorElementOrMember? get correspondingGetter {
- var baseGetter = declaration.correspondingGetter;
- if (baseGetter == null) {
- return null;
- }
- return PropertyAccessorMember(
- declaration: baseGetter,
- substitution: substitution,
- );
- }
-
- @override
- PropertyAccessorElementOrMember? get correspondingSetter {
- var baseSetter = declaration.correspondingSetter;
- if (baseSetter == null) {
- return null;
- }
- return PropertyAccessorMember(
- declaration: baseSetter,
- substitution: substitution,
- );
- }
-
- @override
PropertyAccessorFragmentImpl get declaration =>
_declaration as PropertyAccessorFragmentImpl;
@@ -1265,17 +1240,6 @@
Source get source => _declaration.source!;
@override
- PropertyInducingElementOrMember? get variable2 {
- var variable = declaration.variable2;
- switch (variable) {
- case FieldFragmentImpl():
- return FieldMember(declaration: variable, substitution: substitution);
- default:
- return variable;
- }
- }
-
- @override
PropertyInducingElement2OrMember? get variable3 {
var variable = baseElement.variable3;
switch (variable) {
@@ -1332,11 +1296,11 @@
@override
GetterElement2OrMember? get correspondingGetter2 {
- var getter = correspondingGetter;
- if (getter is GetterMember) {
- return getter;
+ var baseGetter = baseElement.variable3!.getter2;
+ if (baseGetter == null) {
+ return null;
}
- return getter?.asElement2 as GetterElementImpl?;
+ return GetterMember.forSubstitution(baseGetter, substitution);
}
@override
@@ -1377,14 +1341,21 @@
return visitor.visitSetterElement(this);
}
+ static SetterElement2OrMember forSubstitution(
+ SetterElement2OrMember element,
+ MapSubstitution substitution,
+ ) {
+ // TODO(scheglov): avoid type cast
+ return ExecutableMember.from(element, substitution)
+ as SetterElement2OrMember;
+ }
+
static SetterElement2OrMember forTargetType(
SetterElement2OrMember element,
InterfaceType targetType,
) {
var substitution = Substitution.fromInterfaceType(targetType);
- // TODO(scheglov): avoid type cast
- return ExecutableMember.from(element, substitution)
- as SetterElement2OrMember;
+ return forSubstitution(element, substitution);
}
}
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 0b3a574..19b614e 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -597,7 +597,7 @@
if (!definesSetter) {
// The field just defines a getter, so treat it as a getter for
// duplicate checking purposes.
- fragment = fragment.getter!;
+ fragment = fragment.element.getter2!.firstFragment;
}
}
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index 3290e12..73b9aaa 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -154,7 +154,9 @@
deprecatedElement.fields = [_field('message', stringType, isFinal: true)];
deprecatedElement.getters =
- deprecatedElement.fields.map((f) => f.getter!).toList();
+ deprecatedElement.fields
+ .map((f) => f.element.getter2!.firstFragment)
+ .toList();
deprecatedElement.constructors = [
_constructor(
@@ -192,7 +194,9 @@
];
doubleElement.getters =
- doubleElement.fields.map((field) => field.getter!).toList();
+ doubleElement.fields
+ .map((field) => field.element.getter2!.firstFragment)
+ .toList();
doubleElement.methods = [
_method(
@@ -1217,8 +1221,8 @@
);
_coreUnit.getters = <GetterFragmentImpl>[
- deprecatedVariable.getter!,
- overrideVariable.getter!,
+ deprecatedVariable.element.getter2!.firstFragment,
+ overrideVariable.element.getter2!.firstFragment,
];
_coreUnit.topLevelVariables = <TopLevelVariableFragmentImpl>[
@@ -1259,7 +1263,7 @@
classElement.getters = getters;
classElement.fields =
getters
- .map((accessor) => accessor.variable2)
+ .map((accessor) => accessor.element.variable3!.firstFragment)
.cast<FieldFragmentImpl>()
.toList();
}
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 5789929..591d79f 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -361,8 +361,18 @@
expect(fooNode.length, 7);
// Synthetic elements don't have nodes.
- expect(parsedLibrary.getFragmentDeclaration(fooElement.getter2!), isNull);
- expect(parsedLibrary.getFragmentDeclaration(fooElement.setter2!), isNull);
+ expect(
+ parsedLibrary.getFragmentDeclaration(
+ fooElement.element.getter2!.firstFragment,
+ ),
+ isNull,
+ );
+ expect(
+ parsedLibrary.getFragmentDeclaration(
+ fooElement.element.setter2!.firstFragment,
+ ),
+ isNull,
+ );
}
test_getParsedLibrary_inconsistent() async {
@@ -621,8 +631,18 @@
expect(fooNode.declaredFragment!.name2, 'foo');
// Synthetic elements don't have nodes.
- expect(resolvedLibrary.getFragmentDeclaration(fooElement.getter2!), isNull);
- expect(resolvedLibrary.getFragmentDeclaration(fooElement.setter2!), isNull);
+ expect(
+ resolvedLibrary.getFragmentDeclaration(
+ fooElement.element.getter2!.firstFragment,
+ ),
+ isNull,
+ );
+ expect(
+ resolvedLibrary.getFragmentDeclaration(
+ fooElement.element.setter2!.firstFragment,
+ ),
+ isNull,
+ );
}
test_getResolvedLibrary_inconsistent() async {
diff --git a/pkg/linter/lib/src/rules/analyzer_public_api.dart b/pkg/linter/lib/src/rules/analyzer_public_api.dart
index 1734f43..1b27267 100644
--- a/pkg/linter/lib/src/rules/analyzer_public_api.dart
+++ b/pkg/linter/lib/src/rules/analyzer_public_api.dart
@@ -276,11 +276,10 @@
offset = fragment.nameOffset2!;
length = fragment.name2!.length;
break;
- } else if (fragment case PropertyAccessorFragment(
- :var variable3?,
- ) when variable3.nameOffset2 != null) {
- offset = variable3.nameOffset2!;
- length = variable3.name2!.length;
+ } else if (fragment case PropertyAccessorFragment()
+ when fragment.element.variable3!.firstFragment.nameOffset2 != null) {
+ offset = fragment.element.variable3!.firstFragment.nameOffset2!;
+ length = fragment.element.variable3!.name3!.length;
break;
} else if (fragment is ConstructorFragment &&
fragment.typeNameOffset != null) {