[analyzer] Refine type of `InterfaceTypeImpl.element`

The type of `InterfaceTypeImpl.element` is changed from
`InterfaceElement` to `InterfaceElementImpl`.

This allows eliminating casts from a number of call sites, at the
expense of adding a single cast to the `InterfaceTypeImpl`
constructor. This cast is safe because all concrete implementations of
`InterfaceElement` are subtypes of `InterfaceElementImpl`.

This is part of a larger arc of work to change the analyzer's use of
the shared code so that the type parameters it supplies are not part
of the analyzer public API. See
https://github.com/dart-lang/sdk/issues/59763.

Change-Id: I5d0ffa3b14788965589a57a3c061acac2f3c6930
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403942
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index e3d48e4..d43cb0c 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
@@ -73,8 +72,7 @@
       for (int i = 0; i < args1.length; i++) {
         // TODO(kallentu): : Clean up TypeParameterElementImpl casting once
         // variance is added to the interface.
-        Variance parameterVariance =
-            (params[i] as TypeParameterElementImpl).variance;
+        Variance parameterVariance = params[i].variance;
         if (parameterVariance.isCovariant) {
           args.add(typeSystem.leastUpperBound(args1[i], args2[i]));
         } else if (parameterVariance.isContravariant) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index c6f68c8..10989f5 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
-import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/display_string_builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
@@ -574,7 +573,7 @@
 /// A concrete implementation of an [InterfaceType].
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
   @override
-  final InterfaceElement element;
+  final InterfaceElementImpl element;
 
   @override
   final List<DartType> typeArguments;
@@ -596,6 +595,8 @@
       required List<DartType> typeArguments,
       required NullabilitySuffix nullabilitySuffix,
       InstantiatedTypeAliasElement? alias}) {
+    // TODO(paulberry): avoid this cast by changing the type of `element`
+    element as InterfaceElementImpl;
     if (element.name == 'FutureOr' && element.library.isDartAsync) {
       return FutureOrTypeImpl(
           element: element,
@@ -696,8 +697,7 @@
       .toList();
 
   @override
-  InterfaceElementImpl2 get element3 =>
-      (element as InterfaceElementImpl).element;
+  InterfaceElementImpl2 get element3 => element.element;
 
   @override
   List<GetterElement> get getters => accessors
@@ -744,7 +744,7 @@
   @override
   bool get isDartCoreEnum {
     var element = this.element;
-    return element is ClassElement && element.isDartCoreEnum;
+    return element is ClassElementImpl && element.isDartCoreEnum;
   }
 
   @override
@@ -881,7 +881,7 @@
   }
 
   InheritanceManager3 get _inheritanceManager =>
-      (element.library.session as AnalysisSessionImpl).inheritanceManager;
+      element.library.session.inheritanceManager;
 
   @override
   bool operator ==(Object other) {
@@ -1021,7 +1021,6 @@
     }
 
     if (recoveryStatic) {
-      var element = this.element as InterfaceElementImpl;
       return element.lookupStaticGetter(name, library);
     }
 
@@ -1077,7 +1076,6 @@
     }
 
     if (recoveryStatic) {
-      var element = this.element as InterfaceElementImpl;
       return element.lookupStaticMethod(name, library);
     }
 
@@ -1133,7 +1131,6 @@
     }
 
     if (recoveryStatic) {
-      var element = this.element as InterfaceElementImpl;
       return element.lookupStaticSetter(name, library);
     }