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) {