Elements. Changes for google3.

Change-Id: Ia0215da239c3948ccd242e583b79df0085109597
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/402400
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart
index 0ee171b8..8787805 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart
@@ -513,7 +513,7 @@
       return RenameTypeParameterRefactoringImpl(
         workspace,
         sessionHelper,
-        element.asElement2 as TypeParameterElement2,
+        element.asElement2,
       );
     }
     if (enclosingElement is InterfaceElement) {
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index d56914a..93c0fc8 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -1619,7 +1619,7 @@
 /// An `export` directive within a library fragment.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LibraryExport {
+abstract class LibraryExport implements Annotatable {
   /// The combinators that were specified as part of the `export` directive.
   ///
   /// The combinators are in the order in which they were specified.
@@ -1718,7 +1718,7 @@
 /// An `import` directive within a library fragment.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LibraryImport {
+abstract class LibraryImport implements Annotatable {
   /// The combinators that were specified as part of the `import` directive.
   ///
   /// The combinators are in the order in which they were specified.
diff --git a/pkg/analyzer/lib/dart/element/type_provider.dart b/pkg/analyzer/lib/dart/element/type_provider.dart
index f3f7d95..9020343 100644
--- a/pkg/analyzer/lib/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/dart/element/type_provider.dart
@@ -223,6 +223,9 @@
   /// Return `true` if [element] cannot be extended, implemented, or mixed in.
   bool isNonSubtypableClass(InterfaceElement element);
 
+  /// Return `true` if [element] cannot be extended, implemented, or mixed in.
+  bool isNonSubtypableClass2(InterfaceElement2 element);
+
   /// Return 'true' if [id] is the name of a getter on the `Object` type.
   bool isObjectGetter(String id);
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 5848c93..509ada9 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3868,6 +3868,13 @@
   @override
   ExecutableElement2 get baseElement => this;
 
+  @override
+  List<Element2> get children2 => [
+        ...super.children2,
+        ...typeParameters2,
+        ...formalParameters,
+      ];
+
   bool get invokesSuperSelf {
     var firstFragment = this.firstFragment as ExecutableElementImpl;
     return firstFragment.hasModifier(Modifier.INVOKES_SUPER_SELF);
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index e8b8af2..d454664 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -533,9 +533,14 @@
 
   @override
   bool isNonSubtypableClass(InterfaceElement element) {
-    var name = element.name;
+    return isNonSubtypableClass2(element.asElement2);
+  }
+
+  @override
+  bool isNonSubtypableClass2(InterfaceElement2 element) {
+    var name = element.name3;
     if (_nonSubtypableClassNames.contains(name)) {
-      var libraryUriStr = element.library.source.uri.toString();
+      var libraryUriStr = element.library2.uri.toString();
       var ofLibrary = _nonSubtypableClassMap[libraryUriStr];
       return ofLibrary != null && ofLibrary.contains(name);
     }
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index ac1c3ec..c166a83 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -46,6 +46,9 @@
 
 extension ConstructorElement2Extension on ConstructorElement2 {
   ConstructorElement get asElement {
+    if (this case ConstructorMember member) {
+      return member;
+    }
     return baseElement.firstFragment as ConstructorElement;
   }
 }
@@ -278,6 +281,9 @@
 
 extension ExecutableElement2Extension on ExecutableElement2 {
   ExecutableElement get asElement {
+    if (this case ExecutableMember member) {
+      return member;
+    }
     return firstFragment as ExecutableElement;
   }
 }
@@ -324,6 +330,9 @@
 
 extension FieldElement2Extension on FieldElement2 {
   FieldElement get asElement {
+    if (this case FieldMember member) {
+      return member;
+    }
     return firstFragment as FieldElement;
   }
 }
@@ -340,6 +349,9 @@
 
 extension FormalParameterExtension on FormalParameterElement {
   ParameterElement get asElement {
+    if (this case ParameterMember member) {
+      return member;
+    }
     return firstFragment as ParameterElement;
   }
 
@@ -437,6 +449,9 @@
 
 extension MethodElement2Extension on MethodElement2 {
   MethodElement get asElement {
+    if (this case MethodMember member) {
+      return member;
+    }
     return baseElement.firstFragment as MethodElement;
   }
 }
@@ -491,6 +506,9 @@
 
 extension PropertyAccessorElement2Extension on PropertyAccessorElement2 {
   PropertyAccessorElement get asElement {
+    if (this case PropertyAccessorMember member) {
+      return member;
+    }
     return firstFragment as PropertyAccessorElement;
   }
 }
@@ -540,3 +558,9 @@
     return firstFragment as TypeParameterElement;
   }
 }
+
+extension TypeParameterElementExtension on TypeParameterElement {
+  TypeParameterElement2 get asElement2 {
+    return (this as TypeParameterElementImpl).element;
+  }
+}