Elements. Deprecate FunctionElement.

Change-Id: I668284d0b8346728bc529635ef898794fbab2c79
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/418830
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 efc65b3..7437147 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -3308,7 +3308,7 @@
   FieldFormalParameterElement (class extends Object implements ParameterElement):
     new (constructor: FieldFormalParameterElement Function())
     field (getter: FieldElement?)
-  FunctionElement (class extends Object implements ExecutableElement, LocalElement):
+  FunctionElement (class extends Object implements ExecutableElement, LocalElement, deprecated):
     CALL_METHOD_NAME (static getter: String)
     LOAD_LIBRARY_NAME (static getter: String)
     MAIN_FUNCTION_NAME (static getter: String)
@@ -3373,7 +3373,7 @@
     new (constructor: LibraryElement Function())
     definingCompilationUnit (getter: CompilationUnitElement, deprecated)
     enclosingElement3 (getter: Null)
-    entryPoint (getter: FunctionElement?)
+    entryPoint (getter: FunctionElement?, deprecated)
     exportNamespace (getter: Namespace)
     exportedLibraries (getter: List<LibraryElement>)
     featureSet (getter: FeatureSet)
@@ -3384,7 +3384,7 @@
     isInSdk (getter: bool)
     languageVersion (getter: LibraryLanguageVersion)
     library (getter: LibraryElement)
-    loadLibraryFunction (getter: FunctionElement)
+    loadLibraryFunction (getter: FunctionElement, deprecated)
     name (getter: String)
     publicNamespace (getter: Namespace)
     session (getter: AnalysisSession)
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 31144f5..07483e9 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1253,6 +1253,7 @@
 /// variable.
 ///
 /// Clients may not extend, implement or mix-in this class.
+@Deprecated('Use TopLevelFunctionElement or LocalFunctionElement')
 abstract class FunctionElement implements ExecutableElement, LocalElement {
   /// The name of the method that can be implemented by a class to allow its
   /// instances to be invoked as if they were a function.
@@ -1654,6 +1655,7 @@
   ///
   /// The entry point is defined to be a zero argument top-level function
   /// whose name is `main`.
+  @Deprecated(elementModelDeprecationMsg)
   FunctionElement? get entryPoint;
 
   /// The libraries that are exported from this library.
@@ -1697,6 +1699,7 @@
   /// The element representing the synthetic function `loadLibrary` that is
   /// implicitly defined for this library if the library is imported using a
   /// deferred import.
+  @Deprecated(elementModelDeprecationMsg)
   FunctionElement get loadLibraryFunction;
 
   /// The name of this library, possibly the empty string if this library does
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index ddab2d8..2efe23b 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -5117,9 +5117,9 @@
   }
 }
 
-/// A concrete implementation of a [FunctionElement].
 sealed class FunctionElementImpl extends ExecutableElementImpl
     implements
+        // ignore:deprecated_member_use_from_same_package
         FunctionElement,
         FunctionTypedElementImpl,
         ExecutableElementOrMember {
@@ -6950,7 +6950,7 @@
 
   /// The entry point for this library, or `null` if this library does not have
   /// an entry point.
-  TopLevelFunctionElement? _entryPoint;
+  TopLevelFunctionElementImpl? _entryPoint;
 
   /// The provider for the synthetic function `loadLibrary` that is defined
   /// for this library.
@@ -7059,16 +7059,16 @@
   @Deprecated('Use entryPoint2 instead')
   @override
   FunctionElement? get entryPoint {
-    return entryPoint2?.asElement;
+    return entryPoint2?.lastFragment;
   }
 
   @override
-  TopLevelFunctionElement? get entryPoint2 {
+  TopLevelFunctionElementImpl? get entryPoint2 {
     linkedData?.read(this);
     return _entryPoint;
   }
 
-  set entryPoint2(TopLevelFunctionElement? value) {
+  set entryPoint2(TopLevelFunctionElementImpl? value) {
     _entryPoint = value;
   }
 
@@ -7652,7 +7652,7 @@
   }
 
   TopLevelFunctionElementImpl _create(LibraryElementImpl library) {
-    var name = FunctionElement.LOAD_LIBRARY_NAME;
+    var name = TopLevelFunctionElement.LOAD_LIBRARY_NAME;
 
     var fragment = TopLevelFunctionFragmentImpl(name, -1);
     fragment.name2 = name;
@@ -10840,7 +10840,7 @@
 
   @override
   bool get isEntryPoint {
-    return displayName == FunctionElement.MAIN_FUNCTION_NAME;
+    return displayName == TopLevelFunctionElement.MAIN_FUNCTION_NAME;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 6ff45e2..a485068 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -545,7 +545,7 @@
       unitElement: unitElement,
     );
 
-    element.entryPoint2 = reader.readElement2() as TopLevelFunctionElement?;
+    element.entryPoint2 = reader.readElement2() as TopLevelFunctionElementImpl?;
 
     element.fieldNameNonPromotabilityInfo =
         _readFieldNameNonPromotabilityInfo(reader);
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 3118234..7c037a0 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -375,7 +375,7 @@
     element.exportNamespace = namespace;
 
     var entryPoint = namespace.get2(TopLevelFunctionElement.MAIN_FUNCTION_NAME);
-    if (entryPoint is TopLevelFunctionElement) {
+    if (entryPoint is TopLevelFunctionElementImpl) {
       element.entryPoint2 = entryPoint;
     }
   }
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 71d5c79..6edf8ed 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -689,12 +689,6 @@
   }
 }
 
-extension TopLevelFunctionElementExtension on TopLevelFunctionElement {
-  FunctionElement get asElement {
-    return (this as TopLevelFunctionElementImpl).lastFragment;
-  }
-}
-
 extension TopLevelFunctionElementImplExtension on TopLevelFunctionElementImpl {
   FunctionElementImpl get asElement {
     return lastFragment;