Elements. Deprecate ExecutableElement.

Change-Id: Ic66c9df46bfcfe93d2e6bd93315e298eee694533
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/418831
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index 7437147..5beabbc 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -3268,7 +3268,7 @@
     visitTypeParameterElement (method: R? Function(TypeParameterElement))
   EnumElement (class extends Object implements InterfaceElement, deprecated):
     new (constructor: EnumElement Function())
-  ExecutableElement (class extends Object implements FunctionTypedElement):
+  ExecutableElement (class extends Object implements FunctionTypedElement, deprecated):
     new (constructor: ExecutableElement Function())
     declaration (getter: ExecutableElement)
     displayName (getter: String)
@@ -3367,7 +3367,7 @@
     variables (getter: List<PatternVariableElement>)
   LabelElement (class extends Object implements Element):
     new (constructor: LabelElement Function())
-    enclosingElement3 (getter: ExecutableElement)
+    enclosingElement3 (getter: ExecutableElement, deprecated)
     name (getter: String)
   LibraryElement (class extends Object implements _ExistingElement):
     new (constructor: LibraryElement Function())
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 07483e9..7dff1ec 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1096,6 +1096,7 @@
 /// constructors, getters, and setters.
 ///
 /// Clients may not extend, implement or mix-in this class.
+@Deprecated('Use ExecutableElement2 instead')
 abstract class ExecutableElement implements FunctionTypedElement {
   @override
   ExecutableElement get declaration;
@@ -1631,6 +1632,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class LabelElement implements Element {
+  @Deprecated(elementModelDeprecationMsg)
   @override
   ExecutableElement get enclosingElement3;
 
@@ -1807,6 +1809,7 @@
 }
 
 /// An element that can be (but is not required to be) defined within a method
+// ignore:deprecated_member_use_from_same_package
 /// or function (an [ExecutableElement]).
 ///
 /// Clients may not extend, implement or mix-in this class.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 2efe23b..792fbac 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3610,7 +3610,6 @@
   FunctionTypeImpl get type;
 }
 
-/// A base class for concrete implementations of an [ExecutableElement].
 abstract class ExecutableElementImpl extends _ExistingElementImpl
     with AugmentableFragment, TypeParameterizedElementMixin
     implements ExecutableElementOrMember, ExecutableFragment {
@@ -3849,7 +3848,10 @@
 /// Common base class for all analyzer-internal classes that implement
 /// `ExecutableElement`.
 abstract class ExecutableElementOrMember
-    implements ExecutableElement, ElementOrMember {
+    implements
+        // ignore:deprecated_member_use_from_same_package
+        ExecutableElement,
+        ElementOrMember {
   @override
   List<ParameterElementMixin> get parameters;
 
@@ -7771,7 +7773,7 @@
   @override
   bool get _includeNameOffsetInIdentifier {
     return super._includeNameOffsetInIdentifier ||
-        enclosingElement3 is ExecutableElement ||
+        enclosingElement3 is ExecutableFragment ||
         enclosingElement3 is VariableElement;
   }
 }
@@ -8668,7 +8670,7 @@
   HAS_SINCE_SDK_VERSION_VALUE,
 
   /// Indicates that the associated element did not have an explicit type
-  /// associated with it. If the element is an [ExecutableElement], then the
+  /// associated with it. If the element is an [ExecutableElement2], then the
   /// type being referred to is the return type.
   IMPLICIT_TYPE,
 
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 099a9e4..60ab761 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -170,7 +170,7 @@
   @experimental
   ExecutableElement2? getInherited3(InterfaceType type, Name name) {
     var element = getInherited(type, name);
-    return element.asElement2;
+    return element?.asElement2;
   }
 
   /// Returns the most specific signature of the member with the given [name]
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 6edf8ed..6d0d4fa 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -323,28 +323,6 @@
   }
 }
 
-extension ExecutableElement2OrNullExtension on ExecutableElement2? {
-  ExecutableElement? get asElement {
-    return this?.asElement;
-  }
-}
-
-extension ExecutableElementExtension on ExecutableElement {
-  ExecutableElement2OrMember get asElement2 {
-    return switch (this) {
-      ExecutableFragment(:var element) => element,
-      ExecutableMember member => member,
-      _ => throw UnsupportedError('Unsupported type: $runtimeType'),
-    }
-        // TODO(paulberry): eliminate this cast by using impl types in the
-        // switch patterns above.
-        as ExecutableElement2OrMember;
-  }
-
-  ExecutableElementImpl get declarationImpl =>
-      declaration as ExecutableElementImpl;
-}
-
 extension ExecutableElementImpl2Extension on ExecutableElementImpl2 {
   ExecutableElementImpl get asElement {
     return lastFragment;
@@ -366,13 +344,10 @@
     };
   }
 
-  ElementImpl get enclosingElementImpl => enclosingElement3 as ElementImpl;
-}
+  ExecutableElementImpl get declarationImpl =>
+      declaration as ExecutableElementImpl;
 
-extension ExecutableElementOrNullExtension on ExecutableElement? {
-  ExecutableElement2? get asElement2 {
-    return this?.asElement2;
-  }
+  ElementImpl get enclosingElementImpl => enclosingElement3 as ElementImpl;
 }
 
 extension ExtensionElementImpl2Extension on ExtensionElementImpl2 {