Elements. Make FragmentOrMember implement Fragment.

I few references to `Fragment` were converted to `FragmentImpl` because
it was a convenient time to do.

We added throwing implementations of `Fragment` methods to
`PrefixElementImpl` and `Member` temporarily. We remove
`PrefixElementImpl` completely in the next CL, and eventually `Member`
also will stop implementing `Fragment`, and will implement only
`Element`. But for now it would be a too big change to me to do at once.

Change-Id: I9cf9034a9c45e9baee6ab7421d7ba4d50b6c45c5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431622
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 8459e0a..43bdd18 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -1919,7 +1919,7 @@
   final Token augmentedKeyword;
 
   @override
-  Fragment? fragment;
+  FragmentImpl? fragment;
 
   @generated
   AugmentedExpressionImpl({required this.augmentedKeyword});
@@ -2013,7 +2013,7 @@
   ArgumentListImpl _arguments;
 
   @override
-  ExecutableFragment? fragment;
+  ExecutableFragmentImpl? fragment;
 
   @generated
   AugmentedInvocationImpl({
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 16fa55a..b0e14de 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3949,7 +3949,7 @@
 
 /// A shared internal interface of `Element` and [Member].
 /// Used during migration to avoid referencing `Element`.
-abstract class FragmentOrMember {
+abstract class FragmentOrMember implements Fragment {
   /// The analysis context in which this element is defined.
   AnalysisContext get context;
 
@@ -8273,6 +8273,7 @@
   /// The code of the default value, or `null` if no default value.
   String? get defaultValueCode;
 
+  @override
   FormalParameterElementImpl get element;
 
   /// Whether the parameter is covariant, meaning it is allowed to have a
@@ -8473,7 +8474,8 @@
 /// Currently we write [Element] using the first fragment.
 /// Usually this works (as good as a hack can), but [PrefixElementImpl2]
 /// does not have [FragmentImpl] fragments. So, we use this fake element.
-// TODO(scheglov): resonsider how we write Element2.
+// TODO(scheglov): reconsider how we write Element2.
+// TODO(scheglov): remove this class
 class PrefixElementImpl extends FragmentImpl {
   final PrefixElementImpl2 element2;
 
@@ -8485,10 +8487,37 @@
       );
 
   @override
+  List<Fragment> get children3 => throw UnimplementedError();
+
+  @override
+  Element get element => throw UnimplementedError();
+
+  @override
+  Fragment? get enclosingFragment => throw UnimplementedError();
+
+  @override
   ElementKind get kind => ElementKind.PREFIX;
 
   @override
   Null get library => null;
+
+  @override
+  LibraryFragment? get libraryFragment => throw UnimplementedError();
+
+  @override
+  String? get name2 => throw UnimplementedError();
+
+  @override
+  int? get nameOffset2 => throw UnimplementedError();
+
+  @override
+  Fragment? get nextFragment => throw UnimplementedError();
+
+  @override
+  int get offset => throw UnimplementedError();
+
+  @override
+  Fragment? get previousFragment => throw UnimplementedError();
 }
 
 class PrefixElementImpl2 extends ElementImpl2 implements PrefixElement {
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 3504f7d..0331426 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -747,6 +747,10 @@
   Element get baseElement;
 
   @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  List<Fragment> get children3 => throw UnimplementedError();
+
+  @override
   AnalysisContext get context => _declaration.context;
 
   @override
@@ -759,6 +763,14 @@
   String? get documentationComment => _declaration.documentationComment;
 
   @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  Element get element => throw UnimplementedError();
+
+  @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  Fragment? get enclosingFragment => throw UnimplementedError();
+
+  @override
   int get id => _declaration.id;
 
   @override
@@ -774,6 +786,10 @@
   ElementKind get kind => _declaration.kind;
 
   @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  LibraryFragment? get libraryFragment => throw UnimplementedError();
+
+  @override
   Source? get librarySource => _declaration.librarySource;
 
   @override
@@ -785,12 +801,32 @@
   String? get name => _declaration.name;
 
   @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  String? get name2 => throw UnimplementedError();
+
+  @override
   int get nameLength => _declaration.nameLength;
 
   @override
   int get nameOffset => _declaration.nameOffset;
 
   @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  int? get nameOffset2 => throw UnimplementedError();
+
+  @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  Fragment? get nextFragment => throw UnimplementedError();
+
+  @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  int get offset => throw UnimplementedError();
+
+  @override
+  // TODO(scheglov): stop implementing [Fragment] and remove
+  Fragment? get previousFragment => throw UnimplementedError();
+
+  @override
   AnalysisSession? get session => _declaration.session;
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index abc4fd9..53b5b09 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -283,7 +283,7 @@
 
   AugmentedExpression _readAugmentedExpression() {
     var node = AugmentedExpressionImpl(augmentedKeyword: Tokens.augmented());
-    node.fragment = _reader.readFragmentOrMember() as Fragment?;
+    node.fragment = _reader.readFragmentOrMember() as FragmentImpl?;
     _readExpressionResolution(node);
     return node;
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index b1dd656..a74e2b8 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -92,18 +92,18 @@
   }
 
   @override
-  void visitAugmentedExpression(AugmentedExpression node) {
+  void visitAugmentedExpression(covariant AugmentedExpressionImpl node) {
     _writeByte(Tag.AugmentedExpression);
-    _sink.writeFragment(node.fragment);
+    _sink.writeFragmentOrMember(node.fragment);
     _storeExpression(node);
   }
 
   @override
-  void visitAugmentedInvocation(AugmentedInvocation node) {
+  void visitAugmentedInvocation(covariant AugmentedInvocationImpl node) {
     _writeByte(Tag.AugmentedInvocation);
     _writeOptionalNode(node.typeArguments);
     _writeNode(node.arguments);
-    _sink.writeFragment(node.fragment);
+    _sink.writeFragmentOrMember(node.fragment);
     _storeExpression(node);
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 89f5272..28c7cda 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -718,10 +718,6 @@
     }
   }
 
-  void writeFragment(Fragment? fragment) {
-    writeFragmentOrMember(fragment as FragmentImpl?);
-  }
-
   // TODO(scheglov): Triage places where we write elements.
   // Some of then cannot be members, e.g. type names.
   void writeFragmentOrMember(FragmentOrMember? element) {
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 52ee0b8..14c197b 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -865,10 +865,9 @@
   void _writeFragmentCodeRange(Fragment f) {
     if (configuration.withCodeRanges) {
       if (f is FragmentImpl) {
-        var e = f as FragmentImpl;
-        if (!e.isSynthetic) {
-          _sink.writelnWithIndent('codeOffset: ${e.codeOffset}');
-          _sink.writelnWithIndent('codeLength: ${e.codeLength}');
+        if (!f.isSynthetic) {
+          _sink.writelnWithIndent('codeOffset: ${f.codeOffset}');
+          _sink.writelnWithIndent('codeLength: ${f.codeLength}');
         }
       }
     }