Elements. Migrate AstRewriter.

Change-Id: I111acffc6a74ee72e371bcdad2f0db2f1d4b0d20
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/411100
Reviewed-by: Phil Quitslund <pquitslund@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 580db6d..5f8574a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -6698,7 +6698,7 @@
   final Token name;
 
   @override
-  final ExtensionElement element;
+  final ExtensionElementImpl2 element2;
 
   TypeArgumentListImpl? _typeArguments;
 
@@ -6715,7 +6715,7 @@
     required this.name,
     required TypeArgumentListImpl? typeArguments,
     required ArgumentListImpl argumentList,
-    required this.element,
+    required this.element2,
   })  : _typeArguments = typeArguments,
         _argumentList = argumentList {
     _becomeParentOf(importPrefix);
@@ -6733,10 +6733,9 @@
   @override
   Token get beginToken => importPrefix?.name ?? name;
 
-  @experimental
   @override
-  ExtensionElementImpl2 get element2 =>
-      (element as ExtensionElementImpl).element;
+  ExtensionElementImpl get element =>
+      element2.firstFragment;
 
   @override
   Token get endToken => _argumentList.endToken;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 643ecf4..037b8e0 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -6756,6 +6756,8 @@
 
   @override
   ConstructorElement? get unnamedConstructor {
+    // TODO(scheglov): this is a hack
+    firstFragment.constructors;
     return constructors.firstWhereOrNull((element) => element.name.isEmpty);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index efc51f3..b84a934 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// ignore_for_file: analyzer_use_new_elements
-
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
@@ -47,16 +45,14 @@
     var typeNode = node.constructorName.type;
     var importPrefix = typeNode.importPrefix;
     if (importPrefix == null) {
-      var element = nameScope.lookup(typeNode.name2.lexeme).getter;
-      if (element is FunctionElement ||
-          element is MethodElement ||
-          element is PropertyAccessorElement) {
+      var element = nameScope.lookup(typeNode.name2.lexeme).getter2;
+      if (element is ExecutableElement2) {
         return _toMethodInvocationOfFunctionReference(
           node: node,
           function: SimpleIdentifierImpl(typeNode.name2),
         );
-      } else if (element is TypeAliasElementImpl &&
-          element.aliasedElement is GenericFunctionTypeElement) {
+      } else if (element is TypeAliasElementImpl2 &&
+          element.aliasedElement2 is GenericFunctionTypeElement2) {
         return _toMethodInvocationOfAliasedTypeLiteral(
           node: node,
           function: SimpleIdentifierImpl(typeNode.name2),
@@ -65,11 +61,11 @@
       }
     } else {
       var prefixName = importPrefix.name.lexeme;
-      var prefixElement = nameScope.lookup(prefixName).getter;
-      if (prefixElement is PrefixElement) {
+      var prefixElement = nameScope.lookup(prefixName).getter2;
+      if (prefixElement is PrefixElement2) {
         var prefixedName = typeNode.name2.lexeme;
-        var element = prefixElement.scope.lookup(prefixedName).getter;
-        if (element is FunctionElement) {
+        var element = prefixElement.scope.lookup(prefixedName).getter2;
+        if (element is TopLevelFunctionElement) {
           return _toMethodInvocationOfFunctionReference(
             node: node,
             function: PrefixedIdentifierImpl(
@@ -78,8 +74,8 @@
               identifier: SimpleIdentifierImpl(typeNode.name2),
             ),
           );
-        } else if (element is TypeAliasElementImpl &&
-            element.aliasedElement is GenericFunctionTypeElement) {
+        } else if (element is TypeAliasElementImpl2 &&
+            element.aliasedElement2 is GenericFunctionTypeElement2) {
           return _toMethodInvocationOfAliasedTypeLiteral(
             node: node,
             function: PrefixedIdentifierImpl(
@@ -138,23 +134,23 @@
         // This isn't a constructor invocation because it's in a cascade.
         return node;
       }
-      var element = nameScope.lookup(methodName.name).getter;
-      if (element is InterfaceElement) {
+      var element = nameScope.lookup(methodName.name).getter2;
+      if (element is InterfaceElement2) {
         return _toInstanceCreation_type(
           node: node,
           typeIdentifier: methodName,
         );
-      } else if (element is ExtensionElement) {
+      } else if (element is ExtensionElementImpl2) {
         var extensionOverride = ExtensionOverrideImpl(
           importPrefix: null,
           name: methodName.token,
-          element: element,
+          element2: element,
           typeArguments: node.typeArguments,
           argumentList: node.argumentList,
         );
         NodeReplacer.replace(node, extensionOverride);
         return extensionOverride;
-      } else if (element is TypeAliasElement &&
+      } else if (element is TypeAliasElement2 &&
           element.aliasedType is InterfaceType) {
         return _toInstanceCreation_type(
           node: node,
@@ -167,8 +163,8 @@
         // This isn't a constructor invocation because a null aware operator is
         // being used.
       }
-      var element = nameScope.lookup(target.name).getter;
-      if (element is InterfaceElement) {
+      var element = nameScope.lookup(target.name).getter2;
+      if (element is InterfaceElement2) {
         // class C { C.named(); }
         // C.named()
         return _toInstanceCreation_type_constructor(
@@ -177,29 +173,29 @@
           constructorIdentifier: methodName,
           classElement: element,
         );
-      } else if (element is PrefixElement) {
+      } else if (element is PrefixElement2) {
         // Possible cases: p.C() or p.C<>()
-        var prefixedElement = element.scope.lookup(methodName.name).getter;
-        if (prefixedElement is InterfaceElement) {
+        var prefixedElement = element.scope.lookup(methodName.name).getter2;
+        if (prefixedElement is InterfaceElement2) {
           return _toInstanceCreation_prefix_type(
             node: node,
             prefixIdentifier: target,
             typeIdentifier: methodName,
           );
-        } else if (prefixedElement is ExtensionElement) {
+        } else if (prefixedElement is ExtensionElementImpl2) {
           var extensionOverride = ExtensionOverrideImpl(
             importPrefix: ImportPrefixReferenceImpl(
               name: target.token,
               period: operator,
-            )..element = element,
+            )..element2 = element,
             name: node.methodName.token,
-            element: prefixedElement,
+            element2: prefixedElement,
             typeArguments: node.typeArguments,
             argumentList: node.argumentList,
           );
           NodeReplacer.replace(node, extensionOverride);
           return extensionOverride;
-        } else if (prefixedElement is TypeAliasElement &&
+        } else if (prefixedElement is TypeAliasElement2 &&
             prefixedElement.aliasedType is InterfaceType) {
           return _toInstanceCreation_prefix_type(
             node: node,
@@ -207,7 +203,7 @@
             typeIdentifier: methodName,
           );
         }
-      } else if (element is TypeAliasElement) {
+      } else if (element is TypeAliasElement2) {
         var aliasedType = element.aliasedType;
         if (aliasedType is InterfaceType) {
           // class C { C.named(); }
@@ -217,32 +213,32 @@
             node: node,
             typeIdentifier: target,
             constructorIdentifier: methodName,
-            classElement: aliasedType.element,
+            classElement: aliasedType.element3,
           );
         }
       }
     } else if (target is PrefixedIdentifierImpl) {
       // Possible case: p.C.n()
-      var prefixElement = nameScope.lookup(target.prefix.name).getter;
-      target.prefix.staticElement = prefixElement;
-      if (prefixElement is PrefixElement) {
+      var prefixElement = nameScope.lookup(target.prefix.name).getter2;
+      target.prefix.element = prefixElement;
+      if (prefixElement is PrefixElement2) {
         var prefixedName = target.identifier.name;
-        var element = prefixElement.scope.lookup(prefixedName).getter;
-        if (element is InterfaceElement) {
+        var element = prefixElement.scope.lookup(prefixedName).getter2;
+        if (element is InterfaceElement2) {
           return _instanceCreation_prefix_type_name(
             node: node,
             typeNameIdentifier: target,
             constructorIdentifier: methodName,
             classElement: element,
           );
-        } else if (element is TypeAliasElement) {
+        } else if (element is TypeAliasElement2) {
           var aliasedType = element.aliasedType;
           if (aliasedType is InterfaceType) {
             return _instanceCreation_prefix_type_name(
               node: node,
               typeNameIdentifier: target,
               constructorIdentifier: methodName,
-              classElement: aliasedType.element,
+              classElement: aliasedType.element3,
             );
           }
         }
@@ -280,20 +276,20 @@
       return node;
     }
     var prefix = node.prefix;
-    var prefixElement = nameScope.lookup(prefix.name).getter;
-    if (parent is ConstantPattern && prefixElement is PrefixElement) {
-      var element = prefixElement.scope.lookup(node.identifier.name).getter;
-      if (element is TypeDefiningElement) {
+    var prefixElement = nameScope.lookup(prefix.name).getter2;
+    if (parent is ConstantPattern && prefixElement is PrefixElement2) {
+      var element = prefixElement.scope.lookup(node.identifier.name).getter2;
+      if (element is TypeDefiningElement2) {
         return _toPatternTypeLiteral(parent, node);
       }
     }
-    if (prefixElement is InterfaceElement) {
+    if (prefixElement is InterfaceElement2) {
       // Example:
       //     class C { C.named(); }
       //     C.named
       return _toConstructorReference_prefixed(
           node: node, classElement: prefixElement);
-    } else if (prefixElement is TypeAliasElement) {
+    } else if (prefixElement is TypeAliasElement2) {
       var aliasedType = prefixElement.aliasedType;
       if (aliasedType is InterfaceType) {
         // Example:
@@ -302,7 +298,7 @@
         //     X.named
         return _toConstructorReference_prefixed(
           node: node,
-          classElement: aliasedType.element,
+          classElement: aliasedType.element3,
         );
       }
     }
@@ -351,16 +347,16 @@
       return node;
     }
 
-    Element? element;
+    Element2? element;
     if (receiverIdentifier is SimpleIdentifierImpl) {
-      element = nameScope.lookup(receiverIdentifier.name).getter;
+      element = nameScope.lookup(receiverIdentifier.name).getter2;
     } else if (receiverIdentifier is PrefixedIdentifierImpl) {
       var prefixElement =
-          nameScope.lookup(receiverIdentifier.prefix.name).getter;
-      if (prefixElement is PrefixElement) {
+          nameScope.lookup(receiverIdentifier.prefix.name).getter2;
+      if (prefixElement is PrefixElement2) {
         element = prefixElement.scope
             .lookup(receiverIdentifier.identifier.name)
-            .getter;
+            .getter2;
       } else {
         // This expression is something like `foo.List<int>.filled` where `foo`
         // is not an import prefix.
@@ -370,7 +366,7 @@
       }
     }
 
-    if (element is InterfaceElement) {
+    if (element is InterfaceElement2) {
       // Example:
       //     class C<T> { C.named(); }
       //     C<int>.named
@@ -380,7 +376,7 @@
         typeArguments: typeArguments,
         classElement: element,
       );
-    } else if (element is TypeAliasElement) {
+    } else if (element is TypeAliasElement2) {
       var aliasedType = element.aliasedType;
       if (aliasedType is InterfaceType) {
         // Example:
@@ -391,7 +387,7 @@
           node: node,
           receiver: receiverIdentifier,
           typeArguments: typeArguments,
-          classElement: aliasedType.element,
+          classElement: aliasedType.element3,
         );
       }
     }
@@ -414,8 +410,8 @@
   AstNode simpleIdentifier(Scope nameScope, SimpleIdentifierImpl node) {
     var parent = node.parent;
     if (parent is ConstantPattern) {
-      var element = nameScope.lookup(node.name).getter;
-      if (element is TypeDefiningElement) {
+      var element = nameScope.lookup(node.name).getter2;
+      if (element is TypeDefiningElement2) {
         return _toPatternTypeLiteral(parent, node);
       }
     }
@@ -427,10 +423,9 @@
     required MethodInvocationImpl node,
     required PrefixedIdentifierImpl typeNameIdentifier,
     required SimpleIdentifierImpl constructorIdentifier,
-    required InterfaceElement classElement,
+    required InterfaceElement2 classElement,
   }) {
-    var augmented = classElement.augmented;
-    var constructorElement = augmented.getNamedConstructor(
+    var constructorElement = classElement.getNamedConstructor2(
       constructorIdentifier.name,
     );
     if (constructorElement == null) {
@@ -472,12 +467,12 @@
 
   AstNode _toConstructorReference_prefixed({
     required PrefixedIdentifierImpl node,
-    required InterfaceElement classElement,
+    required InterfaceElement2 classElement,
   }) {
     var name = node.identifier.name;
     var constructorElement = name == 'new'
-        ? classElement.unnamedConstructor
-        : classElement.getNamedConstructor(name);
+        ? classElement.unnamedConstructor2
+        : classElement.getNamedConstructor2(name);
     if (constructorElement == null) {
       return node;
     }
@@ -504,12 +499,12 @@
     required PropertyAccessImpl node,
     required IdentifierImpl receiver,
     required TypeArgumentListImpl? typeArguments,
-    required InterfaceElement classElement,
+    required InterfaceElement2 classElement,
   }) {
     var name = node.propertyName.name;
     var constructorElement = name == 'new'
-        ? classElement.unnamedConstructor
-        : classElement.getNamedConstructor(name);
+        ? classElement.unnamedConstructor2
+        : classElement.getNamedConstructor2(name);
     if (constructorElement == null && typeArguments == null) {
       // If there is no constructor by this name, and no type arguments,
       // do not rewrite the node. If there _are_ type arguments (like
@@ -594,11 +589,10 @@
     required MethodInvocationImpl node,
     required SimpleIdentifierImpl typeIdentifier,
     required SimpleIdentifierImpl constructorIdentifier,
-    required InterfaceElement classElement,
+    required InterfaceElement2 classElement,
   }) {
     var name = constructorIdentifier.name;
-    var augmented = classElement.augmented;
-    var constructorElement = augmented.getNamedConstructor(name);
+    var constructorElement = classElement.getNamedConstructor2(name);
     if (constructorElement == null) {
       return node;
     }
@@ -636,7 +630,7 @@
   MethodInvocation _toMethodInvocationOfAliasedTypeLiteral({
     required InstanceCreationExpressionImpl node,
     required Identifier function,
-    required TypeAliasElementImpl element,
+    required TypeAliasElementImpl2 element,
   }) {
     var typeName = NamedTypeImpl(
       importPrefix: node.constructorName.type.importPrefix,
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 15ec319..7fc3ba7 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -501,7 +501,7 @@
     var node = ExtensionOverrideImpl(
       importPrefix: importPrefix,
       name: StringToken(TokenType.STRING, extensionName, -1),
-      element: element,
+      element2: element.asElement2,
       argumentList: argumentList,
       typeArguments: typeArguments,
     );
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index a72f2f5..74ffd79 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -386,7 +386,7 @@
 }
 
 extension ExtensionElementExtension on ExtensionElement {
-  ExtensionElement2 get asElement2 {
+  ExtensionElementImpl2 get asElement2 {
     return (this as ExtensionElementImpl).element;
   }
 }