Deprecate ExecutableElement.returnType, use returnType2 instead.

Change-Id: Ibd29c3fbec0439236c2cf45c57f820c45427df9f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/311932
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/computer/computer_inlay_hint.dart b/pkg/analysis_server/lib/src/computer/computer_inlay_hint.dart
index d542652..7e69b31 100644
--- a/pkg/analysis_server/lib/src/computer/computer_inlay_hint.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_inlay_hint.dart
@@ -222,7 +222,7 @@
       // For getters/setters, the type must come before the property keyword,
       // not the name.
       final token = node.propertyKeyword ?? node.name;
-      _computer._addTypePrefix(token, declaration.returnType);
+      _computer._addTypePrefix(token, declaration.returnType2);
     }
   }
 
@@ -278,7 +278,7 @@
 
     final declaration = node.declaredElement;
     if (declaration != null) {
-      _computer._addTypePrefix(node.name, declaration.returnType);
+      _computer._addTypePrefix(node.name, declaration.returnType2);
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 6aa780b..ead3ab4 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -61,7 +61,7 @@
     if (element.kind == engine.ElementKind.SETTER) {
       return null;
     } else {
-      return element.returnType
+      return element.returnType2
           .getDisplayString(withNullability: withNullability);
     }
   } else if (element is engine.VariableElement) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index db61063..710d443 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -95,7 +95,7 @@
     if (element.enclosingElement2 is! CompilationUnitElement) {
       return;
     }
-    var returnType = element.returnType;
+    var returnType = element.returnType2;
     if (returnType is VoidType) {
       if (opType.includeVoidReturnSuggestions) {
         builder.suggestTopLevelFunction(element, kind: kind, prefix: prefix);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index bf0e302..57f77c5 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -129,7 +129,7 @@
     for (var method in type.methods) {
       if (!method.isStatic) {
         if (_visibilityTracker._isVisible(method.declaration)) {
-          if (method.returnType is! VoidType) {
+          if (method.returnType2 is! VoidType) {
             if (opType.includeReturnValueSuggestions) {
               memberBuilder.addSuggestionForMethod(
                   method: method,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 140b17a..5664337 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -728,7 +728,7 @@
     //  the [request]) and compute the [inheritanceDistance] in this method.
     var featureComputer = request.featureComputer;
     var contextType = featureComputer.contextTypeFeature(
-        request.contextType, method.returnType);
+        request.contextType, method.returnType2);
     var elementKind =
         _computeElementKind(method, distance: inheritanceDistance);
     var hasDeprecated = featureComputer.hasDeprecatedFeature(method);
@@ -1124,8 +1124,8 @@
     if (elementData == null) return;
     var completion = elementData.completion;
     if (_couldMatch(completion, prefix)) {
-      var relevance =
-          _computeTopLevelRelevance(function, elementType: function.returnType);
+      var relevance = _computeTopLevelRelevance(function,
+          elementType: function.returnType2);
       _addBuilder(
         _createCompletionSuggestionBuilder(
           function,
@@ -1577,7 +1577,7 @@
   /// invalid setter with no parameters at all.
   DartType? _getPropertyAccessorType(PropertyAccessorElement accessor) {
     if (accessor.isGetter) {
-      return accessor.returnType;
+      return accessor.returnType2;
     } else {
       var parameters = accessor.parameters;
       if (parameters.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 60255bd..3fbf650 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -135,7 +135,7 @@
       if (expression is Identifier) {
         var elem = expression.staticElement;
         if (elem is FunctionTypedElement) {
-          type = elem.returnType;
+          type = elem.returnType2;
         } else if (elem is ParameterElement) {
           type = elem.type;
         } else if (elem is LocalVariableElement) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 295c605..ef6a2cf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -230,7 +230,7 @@
     if (element is PropertyAccessorElement && element.isSetter) {
       return null;
     }
-    type = element.returnType;
+    type = element.returnType2;
   } else if (element is TypeAliasElement) {
     final aliasedType = element.aliasedType;
     if (aliasedType is FunctionType) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index 7cdd3a7..f4b7d88 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -370,7 +370,7 @@
     // return myFunction();
     if (parent is ReturnStatement) {
       var executable = getEnclosingExecutableElement(expression);
-      return executable?.returnType;
+      return executable?.returnType2;
     }
     // int v = myFunction();
     if (parent is VariableDeclaration) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart
index 850e4b4..eff644ef 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_async.dart
@@ -41,10 +41,10 @@
       DartType? returnType;
       if (node is FunctionDeclaration) {
         body = node.functionExpression.body;
-        returnType = node.declaredElement!.returnType;
+        returnType = node.declaredElement!.returnType2;
       } else if (node is MethodDeclaration) {
         body = node.body;
-        returnType = node.declaredElement!.returnType;
+        returnType = node.declaredElement!.returnType2;
       }
       if (body == null || returnType == null) {
         return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index b34b914..355ba51 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -198,7 +198,7 @@
       // Getter.
       var element = node.declaredElement;
       if (element is PropertyAccessorElement) {
-        return element.returnType;
+        return element.returnType2;
       }
     } else if (node is VariableDeclaration) {
       // Field.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart
index 2bbd4ed..eb4664b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart
@@ -148,7 +148,7 @@
       } else if (enclosingExecutable is MethodDeclaration) {
         toType = enclosingExecutable.returnType?.type;
       } else if (enclosingExecutable is FunctionExpression) {
-        toType = enclosingExecutable.declaredElement!.returnType;
+        toType = enclosingExecutable.declaredElement!.returnType2;
       }
     } else if (parent is BinaryExpression) {
       if (typeSystem.isNonNullable(fromType)) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart
index 946956d..0c88841 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_block_body.dart
@@ -64,7 +64,7 @@
 
     var lines = ['// TODO: implement ${functionElement.displayName}'];
 
-    var returnValueType = functionElement.returnType;
+    var returnValueType = functionElement.returnType2;
     if (returnValueType is! VoidType) {
       lines.add('throw UnimplementedError();');
     }
@@ -88,7 +88,7 @@
     var returnCode = '';
     if (returnValueType is! VoidType &&
         !returnValueType.isBottom &&
-        functionElement.returnType is! VoidType) {
+        functionElement.returnType2 is! VoidType) {
       returnCode = 'return ';
     }
     returnCode += '$returnValueCode;';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
index 766c4ff..3ba5bc2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
@@ -96,7 +96,7 @@
               builder.write(eol);
               // add field
               builder.write(prefix);
-              builder.writeType(element.returnType, required: true);
+              builder.writeType(element.returnType2, required: true);
               builder.write(' ');
               builder.write(element.name);
               builder.write(';');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/extract_local_variable.dart b/pkg/analysis_server/lib/src/services/correction/dart/extract_local_variable.dart
index d1ed77b..957aae6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/extract_local_variable.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/extract_local_variable.dart
@@ -85,7 +85,7 @@
   }) async {
     if (targetProperty is PropertyAccessorElement &&
         targetProperty.isGetter &&
-        typeSystem.isPotentiallyNullable(targetProperty.returnType)) {
+        typeSystem.isPotentiallyNullable(targetProperty.returnType2)) {
       AstNode? enclosingNode = target;
       while (true) {
         if (enclosingNode == null || enclosingNode is FunctionBody) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type.dart
index 74f94a6..db98956 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type.dart
@@ -95,7 +95,7 @@
         if (overriddenList != null) {
           var notSubtype = overriddenList.any((element) => !libraryElement
               .typeSystem
-              .isSubtypeOf(newType, element.returnType));
+              .isSubtypeOf(newType, element.returnType2));
           if (notSubtype) {
             return false;
           }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/convert_method_to_getter.dart
index 07fa498..959da14 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/convert_method_to_getter.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/convert_method_to_getter.dart
@@ -89,7 +89,7 @@
           'Only class methods or top-level functions can be converted to getters.');
     }
     // returns a value
-    if (element.returnType is VoidType) {
+    if (element.returnType2 is VoidType) {
       return RefactoringStatus.fatal(
           'Cannot convert ${element.kind.displayName} returning void.');
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_local.dart
index 6c77cfb..15319a7 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_local.dart
@@ -315,7 +315,7 @@
       if (node is MethodInvocation) {
         var invocation = node;
         var element = invocation.methodName.staticElement;
-        if (element is ExecutableElement && element.returnType is VoidType) {
+        if (element is ExecutableElement && element.returnType2 is VoidType) {
           if (singleExpression == null) {
             return RefactoringStatus.fatal(
                 'Cannot extract the void expression.',
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart
index 860e443..c5b7663 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart
@@ -611,7 +611,7 @@
           }
           if (refElement is ExecutableElement) {
             var executable = refElement as ExecutableElement;
-            if (!executable.returnType.isDartAsyncFuture) {
+            if (!executable.returnType2.isDartAsyncFuture) {
               status.addFatalError(
                   'Cannot inline async into a function that does not return a Future.',
                   newLocation_fromNode(_node));
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
index c3aa082..0959bd1 100644
--- a/pkg/analysis_server/lib/src/status/element_writer.dart
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -79,7 +79,7 @@
       properties['isOperator'] = element.isOperator;
       properties['isStatic'] = element.isStatic;
       properties['isSynchronous'] = element.isSynchronous;
-      properties['returnType'] = element.returnType;
+      properties['returnType'] = element.returnType2;
       properties['type'] = element.type;
     }
     if (element is LibraryExportElement) {
@@ -96,7 +96,7 @@
       properties['isEntryPoint'] = element.isEntryPoint;
     }
     if (element is FunctionTypedElement) {
-      properties['returnType'] = element.returnType;
+      properties['returnType'] = element.returnType2;
       properties['type'] = element.type;
     }
     if (element is LibraryImportElement) {
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index b3bd8eb..3fe42ab 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -1848,7 +1848,7 @@
   /// have a return type.
   DartType? _returnType(Element? element) {
     if (element is ExecutableElement) {
-      return element.returnType;
+      return element.returnType2;
     }
     return null;
   }
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index ffbae68..cb6a0bf 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -3,8 +3,12 @@
 * Added `InstanceElement`, a super-interface for `NamedInstanceElement`
   and `ExtensionElement`.
 * Deprecated `Element.enclosingElement`, use `enclosingElement2` instead.
-  With this `ConstructorElement.enclosingElement` returns `NamedInstanceElement`
+  With this `ConstructorElement.enclosingElement2` returns `NamedInstanceElement`
   instead of `InterfaceElement`, to support `InlineClassElement` constructors.
+* Added `NamedInstanceType`, a super-interface for `InterfaceType`.
+  In the future, also for `InlineClassType`.
+* Deprecated `ExecutableElement.returnType`, use `returnType2` instead.
+  With this, `ConstructorElement.returnType2` will return `NamedInstanceType`.
 
 ## 6.0.0
 * Remove deprecated `declaredElement2` from AST.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index e8f17f6..35cb7ab 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -472,8 +472,12 @@
   /// library containing this constructor has not yet been resolved.
   ConstructorElement? get redirectedConstructor;
 
+  @Deprecated('Use returnType2 instead')
   @override
   InterfaceType get returnType;
+
+  @override
+  NamedInstanceType get returnType2;
 }
 
 /// [ImportElementPrefix] that is used together with `deferred`.
@@ -1436,8 +1440,12 @@
   List<ParameterElement> get parameters;
 
   /// The return type defined by this element.
+  @Deprecated('Use returnType2 instead')
   DartType get returnType;
 
+  /// The return type defined by this element.
+  DartType get returnType2;
+
   /// The type defined by this element.
   FunctionType get type;
 }
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 8524377..ede3083 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -270,7 +270,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 @experimental
-abstract class InlineClassType implements ParameterizedType {
+abstract class InlineClassType implements NamedInstanceType {
   @override
   InlineClassElement get element;
 }
@@ -290,7 +290,7 @@
 /// such a type.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class InterfaceType implements ParameterizedType {
+abstract class InterfaceType implements NamedInstanceType {
   /// Return a list containing all of the accessors (getters and setters)
   /// declared in this type.
   List<PropertyAccessorElement> get accessors;
@@ -426,6 +426,14 @@
 /// differently, e.g. it does not cause follow-on implicit cast errors.
 abstract class InvalidType implements DartType {}
 
+/// The type introduced by a [NamedInstanceElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class NamedInstanceType implements ParameterizedType {
+  @override
+  NamedInstanceElement get element;
+}
+
 /// The type `Never` represents the uninhabited bottom type.
 abstract class NeverType implements DartType {}
 
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 5e23de2..51c0b09 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -253,7 +253,7 @@
         _evaluationEngine.evaluateConstructorCall(
             _currentLibrary,
             node,
-            constructor.returnType.typeArguments,
+            constructor.returnType2.typeArguments,
             node.argumentList.arguments,
             constructor,
             constantVisitor,
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index e2a8f45..cef826b 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -195,7 +195,7 @@
         var result = evaluateConstructorCall(
             library,
             constNode,
-            element.returnType.typeArguments,
+            element.returnType2.typeArguments,
             constNode.arguments!.arguments,
             element,
             constantVisitor,
@@ -269,24 +269,27 @@
           // any dependencies.
           return;
         }
-        bool defaultSuperInvocationNeeded = true;
-        var initializers = constant.constantInitializers;
-        for (ConstructorInitializer initializer in initializers) {
-          if (initializer is SuperConstructorInvocation ||
-              initializer is RedirectingConstructorInvocation) {
-            defaultSuperInvocationNeeded = false;
+        final returnType = constant.returnType2;
+        if (returnType is InterfaceType) {
+          bool defaultSuperInvocationNeeded = true;
+          var initializers = constant.constantInitializers;
+          for (ConstructorInitializer initializer in initializers) {
+            if (initializer is SuperConstructorInvocation ||
+                initializer is RedirectingConstructorInvocation) {
+              defaultSuperInvocationNeeded = false;
+            }
+            initializer.accept(referenceFinder);
           }
-          initializer.accept(referenceFinder);
-        }
-        if (defaultSuperInvocationNeeded) {
-          // No explicit superconstructor invocation found, so we need to
-          // manually insert a reference to the implicit superconstructor.
-          var superclass = constant.returnType.superclass;
-          if (superclass != null && !superclass.isDartCoreObject) {
-            var unnamedConstructor =
-                superclass.element.unnamedConstructor?.declaration;
-            if (unnamedConstructor != null && unnamedConstructor.isConst) {
-              callback(unnamedConstructor);
+          if (defaultSuperInvocationNeeded) {
+            // No explicit superconstructor invocation found, so we need to
+            // manually insert a reference to the implicit superconstructor.
+            var superclass = returnType.superclass;
+            if (superclass != null && !superclass.isDartCoreObject) {
+              var unnamedConstructor =
+                  superclass.element.unnamedConstructor?.declaration;
+              if (unnamedConstructor != null && unnamedConstructor.isConst) {
+                callback(unnamedConstructor);
+              }
             }
           }
         }
@@ -865,7 +868,7 @@
     return evaluationEngine.evaluateConstructorCall(
       _library,
       node,
-      constructor.returnType.typeArguments,
+      constructor.returnType2.typeArguments,
       node.argumentList.arguments,
       constructor,
       this,
@@ -2405,7 +2408,7 @@
         _argumentValues = argumentValues,
         _invocation = invocation;
 
-  InterfaceType get definingType => _constructor.returnType;
+  NamedInstanceType get definingType => _constructor.returnType2;
 
   DartObjectImpl? get firstArgument => _argumentValues[0];
 
@@ -2420,7 +2423,9 @@
   }) {
     final definingClass = _constructor.enclosingElement2;
     var argumentCount = arguments.length;
-    if (_constructor.name == "fromEnvironment") {
+    final definingType = this.definingType;
+    if (definingType is InterfaceType &&
+        _constructor.name == "fromEnvironment") {
       if (!_checkFromEnvironmentArguments(arguments, definingType)) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, _errorNode);
@@ -2543,7 +2548,7 @@
           continue;
         }
         // Match the value and the type.
-        var fieldType = FieldMember.from(field, _constructor.returnType).type;
+        var fieldType = FieldMember.from(field, _constructor.returnType2).type;
         if (!typeSystem.runtimeTypeMatch(fieldValue, fieldType)) {
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
@@ -2596,6 +2601,11 @@
   }
 
   _InitializersEvaluationResult _checkInitializers() {
+    final definingType = this.definingType;
+    if (definingType is! InterfaceType) {
+      return _InitializersEvaluationResult(null, evaluationIsComplete: true);
+    }
+
     var constructorBase = _constructor.declaration as ConstructorElementImpl;
     // If we encounter a superinitializer, store the name of the constructor,
     // and the arguments.
@@ -2763,6 +2773,11 @@
     required String? superName,
     required List<Expression>? superArguments,
   }) {
+    final definingType = this.definingType;
+    if (definingType is! InterfaceType) {
+      return;
+    }
+
     var superclass = definingType.superclass;
     if (superclass != null && !superclass.isDartCoreObject) {
       var superConstructor =
@@ -2866,7 +2881,7 @@
       // cycles (e.g. "compile-time constant expression depends on itself").
       return DartObjectImpl.validWithUnknownValue(
         library.typeSystem,
-        constructor.returnType,
+        constructor.returnType2,
       );
     }
 
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index e17b595..10a0bf4 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -66,7 +66,7 @@
   }
 
   void writeConstructorElement(ConstructorElement element) {
-    _writeType(element.returnType);
+    _writeType(element.returnType2);
     _write(' ');
 
     _write(element.displayName);
@@ -91,7 +91,7 @@
   }
 
   void writeExecutableElement(ExecutableElement element, String name) {
-    _writeType(element.returnType);
+    _writeType(element.returnType2);
     _write(' ');
 
     _write(name);
@@ -144,7 +144,7 @@
   }
 
   void writeGenericFunctionTypeElement(GenericFunctionTypeElementImpl element) {
-    _writeType(element.returnType);
+    _writeType(element.returnType2);
     _write(' Function');
     _writeTypeParameters(element.typeParameters);
     _writeFormalParameters(element.parameters, forElement: true);
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index f7ce222..43362c3 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1554,6 +1554,7 @@
     _redirectedConstructor = redirectedConstructor;
   }
 
+  @Deprecated('Use returnType2 instead')
   @override
   InterfaceType get returnType =>
       ElementTypeProvider.current.getExecutableReturnType(this)
@@ -1565,8 +1566,13 @@
   }
 
   @override
-  InterfaceType get returnTypeInternal {
-    return (_returnType ??= enclosingElement2.thisType) as InterfaceType;
+  NamedInstanceType get returnType2 =>
+      ElementTypeProvider.current.getExecutableReturnType(this)
+          as NamedInstanceType;
+
+  @override
+  DartType get returnTypeInternal {
+    return _returnType ??= enclosingElement2.thisType;
   }
 
   ConstructorElement? get superConstructor {
@@ -1592,7 +1598,7 @@
     return _type ??= FunctionTypeImpl(
       typeFormals: typeParameters,
       parameters: parameters,
-      returnType: returnType,
+      returnType: returnType2,
       nullabilitySuffix: _noneOrStarSuffix,
     );
   }
@@ -3296,6 +3302,7 @@
     return _parameters;
   }
 
+  @Deprecated('Use returnType2 instead')
   @override
   DartType get returnType =>
       ElementTypeProvider.current.getExecutableReturnType(this);
@@ -3313,6 +3320,10 @@
   }
 
   @override
+  DartType get returnType2 =>
+      ElementTypeProvider.current.getExecutableReturnType(this);
+
+  @override
   DartType get returnTypeInternal {
     linkedData?.read(this);
     return _returnType!;
@@ -3332,7 +3343,7 @@
     return _type = FunctionTypeImpl(
       typeFormals: typeParameters,
       parameters: parameters,
-      returnType: returnType,
+      returnType: returnType2,
       nullabilitySuffix: _noneOrStarSuffix,
     );
   }
@@ -3784,6 +3795,7 @@
     _parameters = parameters;
   }
 
+  @Deprecated('Use returnType2 instead')
   @override
   DartType get returnType =>
       ElementTypeProvider.current.getExecutableReturnType(this);
@@ -3796,6 +3808,10 @@
   }
 
   @override
+  DartType get returnType2 =>
+      ElementTypeProvider.current.getExecutableReturnType(this);
+
+  @override
   DartType get returnTypeInternal {
     return _returnType!;
   }
@@ -3816,7 +3832,7 @@
     return _type = FunctionTypeImpl(
       typeFormals: typeParameters,
       parameters: parameters,
-      returnType: returnType,
+      returnType: returnType2,
       nullabilitySuffix:
           isNullable ? NullabilitySuffix.question : _noneOrStarSuffix,
     );
@@ -6050,6 +6066,7 @@
     return enclosingElement2;
   }
 
+  @Deprecated('Use returnType2 instead')
   @override
   DartType get returnType =>
       ElementTypeProvider.current.getExecutableReturnType(this);
@@ -6060,6 +6077,10 @@
   }
 
   @override
+  DartType get returnType2 =>
+      ElementTypeProvider.current.getExecutableReturnType(this);
+
+  @override
   DartType get returnTypeInternal => variable.type;
 
   @override
@@ -6078,7 +6099,7 @@
     return _type ??= FunctionTypeImpl(
       typeFormals: const <TypeParameterElement>[],
       parameters: const <ParameterElement>[],
-      returnType: returnType,
+      returnType: returnType2,
       nullabilitySuffix: _noneOrStarSuffix,
     );
   }
@@ -6123,6 +6144,7 @@
         growable: false);
   }
 
+  @Deprecated('Use returnType2 instead')
   @override
   DartType get returnType =>
       ElementTypeProvider.current.getExecutableReturnType(this);
@@ -6133,6 +6155,10 @@
   }
 
   @override
+  DartType get returnType2 =>
+      ElementTypeProvider.current.getExecutableReturnType(this);
+
+  @override
   DartType get returnTypeInternal => VoidTypeImpl.instance;
 
   @override
@@ -6151,7 +6177,7 @@
     return _type ??= FunctionTypeImpl(
       typeFormals: const <TypeParameterElement>[],
       parameters: parameters,
-      returnType: returnType,
+      returnType: returnType2,
       nullabilitySuffix: _noneOrStarSuffix,
     );
   }
@@ -6244,7 +6270,7 @@
 
     if (isSynthetic) {
       if (getter != null) {
-        return _type = getter!.returnType;
+        return _type = getter!.returnType2;
       } else if (setter != null) {
         List<ParameterElement> parameters = setter!.parameters;
         return _type = parameters.isNotEmpty
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 02f491b..1df4bb8 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -20,7 +20,7 @@
     NamedInstanceElement? instanceElement;
     if (element is PropertyAccessorElement) {
       if (element.isGetter) {
-        var type = element.returnType;
+        var type = element.returnType2;
         if (type is InterfaceType) {
           instanceElement = type.element;
         }
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index c6b9bd4..4081106 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -778,7 +778,7 @@
       result.isSynthetic = true;
       result.parameters = transformedParameters;
       result.prototype = executable;
-      result.returnType = executable.returnType;
+      result.returnType = executable.returnType2;
       result.typeParameters = executable.typeParameters;
       return result;
     }
@@ -790,7 +790,7 @@
       result.isSynthetic = true;
       result.parameters = transformedParameters;
       result.prototype = executable;
-      result.returnType = executable.returnType;
+      result.returnType = executable.returnType2;
 
       var field = executable.variable;
       var resultField = FieldElementImpl(field.name, -1);
@@ -871,7 +871,7 @@
       field.enclosingElement = targetClass;
       if (firstAccessor.isGetter) {
         field.getter = result;
-        field.type = result.returnType;
+        field.type = result.returnType2;
       } else {
         field.setter = result;
         field.type = result.parameters[0].type;
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 06d221c..030da7c 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -95,10 +95,14 @@
     return ConstructorMember(_typeProvider, declaration, substitution, false);
   }
 
+  @Deprecated('Use returnType2 instead')
   @override
   InterfaceType get returnType => type.returnType as InterfaceType;
 
   @override
+  NamedInstanceType get returnType2 => type.returnType as NamedInstanceType;
+
+  @override
   Source get source => _declaration.source!;
 
   @override
@@ -216,6 +220,7 @@
     }).toList();
   }
 
+  @Deprecated('Use returnType2 instead')
   @override
   DartType get returnType {
     var result = declaration.returnType;
@@ -225,6 +230,14 @@
   }
 
   @override
+  DartType get returnType2 {
+    var result = declaration.returnType2;
+    result = _substitution.substituteType(result);
+    result = _toLegacyType(result);
+    return result;
+  }
+
+  @override
   FunctionType get type {
     if (_type != null) return _type!;
 
@@ -416,7 +429,7 @@
   /// from the [definingType], create a field member representing the given
   /// field. Return the member that was created, or the base field if no member
   /// was created.
-  static FieldElement from(FieldElement field, InterfaceType definingType) {
+  static FieldElement from(FieldElement field, NamedInstanceType definingType) {
     if (definingType.typeArguments.isEmpty) {
       return field;
     }
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index 931a969..7042658 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -181,7 +181,7 @@
 
   /// Substitutes the type parameters on the class of [type] with the
   /// type arguments provided in [type].
-  static MapSubstitution fromInterfaceType(InterfaceType type) {
+  static MapSubstitution fromInterfaceType(NamedInstanceType type) {
     if (type.typeArguments.isEmpty) {
       return _NullSubstitution.instance;
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index ae21477..39ac762 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -279,7 +279,7 @@
           leftType,
           operator,
           rightType,
-          operatorElement.returnType,
+          operatorElement.returnType2,
           operatorElement,
         );
       } else {
diff --git a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
index 9e26ba6..3419f76 100644
--- a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
@@ -684,7 +684,7 @@
     if (element is ExecutableElement) {
       var declaration = element.declaration;
       return declaration.hasAlwaysThrows ||
-          identical(declaration.returnType, NeverTypeImpl.instance);
+          identical(declaration.returnType2, NeverTypeImpl.instance);
     }
 
     return false;
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 3d79245..edb4a61 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -375,7 +375,7 @@
 
     if (member is PropertyAccessorElement) {
       function.accept(_resolver);
-      _resolve(node: node, rawType: member.returnType);
+      _resolve(node: node, rawType: member.returnType2);
       return;
     }
 
@@ -694,7 +694,7 @@
 
         if (method is PropertyAccessorElement) {
           function.staticElement = method;
-          function.staticType = method.returnType;
+          function.staticType = method.returnType2;
           _resolve(node: node, rawType: method.variable.type);
           return;
         }
@@ -758,7 +758,7 @@
         _resolveAsImplicitCallReference(node, callMethod);
         return;
       }
-      _resolve(node: node, rawType: element.returnType);
+      _resolve(node: node, rawType: element.returnType2);
       return;
     } else if (element is ExecutableElement) {
       function.staticElement = element;
@@ -913,7 +913,7 @@
     } else if (this is FunctionElement) {
       return (this as FunctionElement).type;
     } else if (this is PropertyAccessorElement) {
-      return (this as PropertyAccessorElement).returnType;
+      return (this as PropertyAccessorElement).returnType2;
     } else if (this is MethodElement) {
       return (this as MethodElement).type;
     } else if (this is VariableElement) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index 71a116f..6770959 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -49,7 +49,7 @@
         : FunctionTypeImpl(
             typeFormals: typeParameters,
             parameters: element.parameters,
-            returnType: element.returnType,
+            returnType: element.returnType2,
             nullabilitySuffix: NullabilitySuffix.none,
           );
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index c020f37..9d27288 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -366,7 +366,7 @@
       getter = _resolver.toLegacyElement(getter);
       nameNode.staticElement = getter;
       _reportStaticAccessToInstanceMember(getter, nameNode);
-      _rewriteAsFunctionExpressionInvocation(node, getter.returnType,
+      _rewriteAsFunctionExpressionInvocation(node, getter.returnType2,
           contextType: contextType);
       return;
     }
@@ -433,7 +433,7 @@
     nameNode.staticElement = member;
 
     if (member is PropertyAccessorElement) {
-      return _rewriteAsFunctionExpressionInvocation(node, member.returnType,
+      return _rewriteAsFunctionExpressionInvocation(node, member.returnType2,
           contextType: contextType);
     }
 
@@ -459,7 +459,7 @@
         target = _resolver.toLegacyElement(target);
         nameNode.staticElement = target;
         rawType = target.type;
-        node.staticType = target.returnType;
+        node.staticType = target.returnType2;
       }
     }
 
@@ -569,7 +569,7 @@
         element = multiply.conflictingElements[0];
       }
       if (element is PropertyAccessorElement) {
-        return _rewriteAsFunctionExpressionInvocation(node, element.returnType,
+        return _rewriteAsFunctionExpressionInvocation(node, element.returnType2,
             contextType: contextType);
       }
       if (element is ExecutableElement) {
@@ -661,7 +661,7 @@
     }
 
     if (element is PropertyAccessorElement) {
-      return _rewriteAsFunctionExpressionInvocation(node, element.returnType,
+      return _rewriteAsFunctionExpressionInvocation(node, element.returnType2,
           contextType: contextType);
     }
 
@@ -704,7 +704,7 @@
     if (target != null) {
       nameNode.staticElement = target;
       if (target is PropertyAccessorElement) {
-        return _rewriteAsFunctionExpressionInvocation(node, target.returnType,
+        return _rewriteAsFunctionExpressionInvocation(node, target.returnType2,
             contextType: contextType, isSuperAccess: true);
       }
       _setResolution(node, target.type, whyNotPromotedList,
@@ -797,7 +797,7 @@
       }
 
       if (target is PropertyAccessorElement) {
-        return _rewriteAsFunctionExpressionInvocation(node, target.returnType,
+        return _rewriteAsFunctionExpressionInvocation(node, target.returnType2,
             contextType: contextType);
       }
       return _setResolution(node, target.type, whyNotPromotedList,
@@ -845,7 +845,7 @@
         nameNode.staticElement = element;
         if (element is PropertyAccessorElement) {
           return _rewriteAsFunctionExpressionInvocation(
-              node, element.returnType,
+              node, element.returnType2,
               contextType: contextType);
         }
         _setResolution(node, element.type, whyNotPromotedList,
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index d25b40f..5440840 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -259,7 +259,7 @@
       readElementRequested = _resolver.toLegacyElement(readLookup?.requested);
       if (readElementRequested is PropertyAccessorElement &&
           !readElementRequested.isStatic) {
-        var unpromotedType = readElementRequested.returnType;
+        var unpromotedType = readElementRequested.returnType2;
         getType = _resolver.flowAnalysis.flow?.propertyGet(
                 node,
                 ThisPropertyTarget.singleton,
@@ -480,7 +480,7 @@
     DartType? getType;
     if (hasRead) {
       var unpromotedType =
-          result.getter?.returnType ?? _typeSystem.typeProvider.dynamicType;
+          result.getter?.returnType2 ?? _typeSystem.typeProvider.dynamicType;
       getType = _resolver.flowAnalysis.flow?.propertyGet(
               node,
               isCascaded
@@ -551,7 +551,7 @@
         );
       } else {
         readElement = _resolver.toLegacyElement(readElement);
-        getType = readElement.returnType;
+        getType = readElement.returnType2;
         if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
           readElementRecovery = readElement;
           readElement = null;
@@ -624,7 +624,7 @@
           [memberName, element.name!],
         );
       } else {
-        getType = readElement.returnType;
+        getType = readElement.returnType2;
       }
       _checkForStaticMember(target, propertyName, readElement);
     }
@@ -681,7 +681,7 @@
 
       if (readElement != null) {
         readElement = _resolver.toLegacyElement(readElement);
-        getType = readElement.returnType;
+        getType = readElement.returnType2;
         if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
           readElementRecovery = readElement;
           readElement = null;
@@ -755,7 +755,7 @@
     var writeElement = _resolver.toLegacyElement(lookupResult.setter);
     DartType? getType;
     if (hasRead && readElement is PropertyAccessorElement) {
-      getType = readElement.returnType;
+      getType = readElement.returnType2;
     }
 
     if (hasRead && readElement == null || hasWrite && writeElement == null) {
@@ -827,7 +827,7 @@
           }
         }
         var unpromotedType =
-            readElement?.returnType ?? _typeSystem.typeProvider.dynamicType;
+            readElement?.returnType2 ?? _typeSystem.typeProvider.dynamicType;
         getType = _resolver.flowAnalysis.flow?.propertyGet(
                 node,
                 SuperPropertyTarget.singleton,
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 6d3d53e..01fe63a 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -844,7 +844,7 @@
     var type = FunctionTypeImpl(
       typeFormals: element.typeParameters,
       parameters: element.parameters,
-      returnType: element.returnType,
+      returnType: element.returnType2,
       nullabilitySuffix: _getNullability(node.question != null),
     );
     element.type = type;
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 837c480..1157e2c 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -1020,7 +1020,7 @@
       } else if (element is FunctionElement) {
         var signatureTypes = [
           ...element.parameters.map((p) => p.type),
-          element.returnType,
+          element.returnType2,
           ...element.typeParameters.map((tp) => tp.bound),
         ];
         for (var type in signatureTypes) {
diff --git a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
index 0013eb0..7cd2a03 100644
--- a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
+++ b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
@@ -49,7 +49,7 @@
       if (getter.kind == ElementKind.GETTER) {
         var setter = interface.map[Name(libraryUri, '${name.name}=')];
         if (setter != null && setter.parameters.length == 1) {
-          var getterType = getter.returnType;
+          var getterType = getter.returnType2;
           var setterType = setter.parameters[0].type;
           if (!_match(getterType, setterType)) {
             Element errorElement;
@@ -119,7 +119,7 @@
 
   /// Return the return type of the [getter].
   static DartType _getGetterType(PropertyAccessorElement getter) {
-    return getter.returnType;
+    return getter.returnType2;
   }
 
   /// Return the type of the first parameter of the [setter].
diff --git a/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart b/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart
index 5ebd0e4..ee797c9 100644
--- a/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart
+++ b/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart
@@ -30,7 +30,7 @@
     final constructor = expression.constructorName.staticElement;
     if (constructor == null) return;
 
-    final type = constructor.returnType;
+    final type = constructor.returnType2;
     final isFutureValue = type.isDartAsyncFuture && constructor.name == 'value';
 
     if (isFutureValue) {
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 9abf521..cd6ff841 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -117,7 +117,7 @@
     }
 
     // Check that type arguments are regular-bounded.
-    var typeArguments = constructorElement.returnType.typeArguments;
+    var typeArguments = constructorElement.returnType2.typeArguments;
     var substitution = Substitution.fromPairs(typeParameters, typeArguments);
     for (var i = 0; i < typeArguments.length; i++) {
       var typeParameter = typeParameters[i];
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 66b3b97..02e4304 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -111,7 +111,7 @@
   bool get isSynchronous => !isAsynchronous;
 
   DartType get returnType {
-    return catchErrorOnErrorReturnType ?? element!.returnType;
+    return catchErrorOnErrorReturnType ?? element!.returnType2;
   }
 
   static bool _inFactoryConstructor(Element? element) {
@@ -3077,7 +3077,7 @@
     if (element is PropertyAccessorElement && element.isSetter) {
       return;
     }
-    if (element.hasImplicitReturnType && element.returnType is DynamicType) {
+    if (element.hasImplicitReturnType && element.returnType2 is DynamicType) {
       errorReporter.reportErrorForToken(LanguageCode.IMPLICIT_DYNAMIC_RETURN,
           functionName, [element.displayName]);
     }
diff --git a/pkg/analyzer/lib/src/generated/exhaustiveness.dart b/pkg/analyzer/lib/src/generated/exhaustiveness.dart
index 14de811..f46f80e 100644
--- a/pkg/analyzer/lib/src/generated/exhaustiveness.dart
+++ b/pkg/analyzer/lib/src/generated/exhaustiveness.dart
@@ -527,7 +527,7 @@
         DartType? extensionPropertyType;
         if (element is PropertyAccessorElement &&
             element.enclosingElement2 is ExtensionElement) {
-          extensionPropertyType = element.returnType;
+          extensionPropertyType = element.returnType2;
         } else if (element is ExecutableElement &&
             element.enclosingElement2 is ExtensionElement) {
           extensionPropertyType = element.type;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6b71dc3..92489e1 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1647,7 +1647,7 @@
     if (getter != null) {
       fieldNode.element = getter;
       if (getter is PropertyAccessorElement) {
-        return getter.returnType;
+        return getter.returnType2;
       } else {
         return getter.type;
       }
@@ -1711,7 +1711,7 @@
     return RelationalOperatorResolution(
       kind: kind,
       parameterType: parameterType,
-      returnType: element.returnType,
+      returnType: element.returnType2,
     );
   }
 
@@ -1724,13 +1724,13 @@
         atDynamicTarget ? DynamicTypeImpl.instance : InvalidTypeImpl.instance;
     if (node is IndexExpression) {
       if (element is MethodElement) {
-        readType = element.returnType;
+        readType = element.returnType2;
       }
     } else if (node is PrefixedIdentifier ||
         node is PropertyAccess ||
         node is SimpleIdentifier) {
       if (element is PropertyAccessorElement && element.isGetter) {
-        readType = element.returnType;
+        readType = element.returnType2;
       } else if (element is VariableElement) {
         readType = localVariableTypeProvider.getType(node as SimpleIdentifier,
             isRead: true);
@@ -2849,7 +2849,7 @@
     if (identical(targetType, NeverTypeImpl.instance)) {
       type = NeverTypeImpl.instance;
     } else if (element is MethodElement) {
-      type = element.returnType;
+      type = element.returnType2;
     } else if (targetType is DynamicType) {
       type = DynamicTypeImpl.instance;
     } else {
@@ -2962,7 +2962,7 @@
     flowAnalysis.executableDeclaration_enter(node, node.parameters,
         isClosure: false);
 
-    DartType returnType = node.declaredElement!.returnType;
+    DartType returnType = node.declaredElement!.returnType2;
 
     var outerFunction = _enclosingFunction;
     try {
@@ -4017,7 +4017,7 @@
         var staticElement = nameNode.staticElement;
         if (staticElement != null) {
           name =
-              '${staticElement.returnType.getDisplayString(withNullability: true)}.new';
+              '${staticElement.returnType2.getDisplayString(withNullability: true)}.new';
         }
       }
     } else if (nameNode is SuperConstructorInvocation) {
@@ -4026,7 +4026,7 @@
         var staticElement = nameNode.staticElement;
         if (staticElement != null) {
           name =
-              '${staticElement.returnType.getDisplayString(withNullability: true)}.new';
+              '${staticElement.returnType2.getDisplayString(withNullability: true)}.new';
         }
       }
     } else if (nameNode is MethodInvocation) {
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index b1c525a..c945459 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -327,7 +327,7 @@
     _resolutionSink._writeAnnotationList(element.metadata);
 
     _writeTypeParameters(element.typeParameters, () {
-      _resolutionSink.writeType(element.returnType);
+      _resolutionSink.writeType(element.returnType2);
       _writeList(element.parameters, _writeParameterElement);
     });
   }
@@ -395,7 +395,7 @@
     _writeTypeParameters(element.typeParameters, () {
       _writeList(element.parameters, _writeParameterElement);
       _sink._writeTopLevelInferenceError(element.typeInferenceError);
-      _resolutionSink.writeType(element.returnType);
+      _resolutionSink.writeType(element.returnType2);
     });
   }
 
@@ -476,7 +476,7 @@
     PropertyAccessorElementFlags.write(_sink, element);
 
     _resolutionSink._writeAnnotationList(element.metadata);
-    _resolutionSink.writeType(element.returnType);
+    _resolutionSink.writeType(element.returnType2);
     _writeList(element.parameters, _writeParameterElement);
   }
 
@@ -719,7 +719,7 @@
       writeByte(AliasedElementTag.genericFunctionElement);
       _writeTypeParameters(element.typeParameters, () {
         _writeFormalParameters(element.parameters, withAnnotations: true);
-        writeType(element.returnType);
+        writeType(element.returnType2);
       }, withAnnotations: true);
     } else {
       throw UnimplementedError('${element.runtimeType}');
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 33cf5d1..963299a 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -139,7 +139,7 @@
         name: getterName,
       );
       if (combinedGetter != null) {
-        var returnType = combinedGetter.returnType;
+        var returnType = combinedGetter.returnType2;
         return typeSystem.nonNullifyLegacy(returnType);
       }
       return DynamicTypeImpl.instance;
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 2bed2e4..76ce667 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2715,7 +2715,7 @@
     MethodDeclaration mapC = AstFinder.getMethodInClass(unit, "C", "map");
     assertMapOfIntToListOfInt(mapB.declaredElement!.type as InterfaceType);
     assertMapOfIntToListOfInt(
-        mapC.declaredElement!.returnType as InterfaceType);
+        mapC.declaredElement!.returnType2 as InterfaceType);
 
     var mapLiteralB = mapB.initializer as SetOrMapLiteral;
     var mapLiteralC =
diff --git a/pkg/analyzer/test/id_tests/inferred_variable_types_test.dart b/pkg/analyzer/test/id_tests/inferred_variable_types_test.dart
index e4a4ed6..2ab1a0f 100644
--- a/pkg/analyzer/test/id_tests/inferred_variable_types_test.dart
+++ b/pkg/analyzer/test/id_tests/inferred_variable_types_test.dart
@@ -62,13 +62,13 @@
     } else if (node is FunctionDeclarationStatement) {
       var element = node.functionDeclaration.declaredElement!;
       if (element.hasImplicitReturnType) {
-        return element.returnType;
+        return element.returnType2;
       }
     } else if (node is FunctionExpression &&
         node.parent is! FunctionDeclaration) {
       var element = node.declaredElement!;
       if (element.hasImplicitReturnType) {
-        return element.returnType;
+        return element.returnType2;
       }
     }
     return null;
diff --git a/pkg/analyzer/test/id_tests/inheritance_test.dart b/pkg/analyzer/test/id_tests/inheritance_test.dart
index 26a7629..e9a72f0 100644
--- a/pkg/analyzer/test/id_tests/inheritance_test.dart
+++ b/pkg/analyzer/test/id_tests/inheritance_test.dart
@@ -121,7 +121,7 @@
           type = executable.type;
         } else if (executable is PropertyAccessorElement) {
           if (executable.isGetter) {
-            type = executable.returnType;
+            type = executable.returnType2;
           } else {
             type = executable.parameters.first.type;
           }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index d32ea60..893110d 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -3723,7 +3723,7 @@
   void _assertClassMethodReturnType(CompilationUnit unit, String className,
       String fieldName, String expected) {
     var node = _getClassMethod(unit, className, fieldName);
-    var type = node.declaredElement!.returnType;
+    var type = node.declaredElement!.returnType2;
     assertType(type, expected);
   }
 
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
index 56073ec..9ab8424 100644
--- a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
@@ -52,7 +52,7 @@
     final B = findElement.classOrMixin('B');
     final foo = manager.getMember2(B, Name(null, 'foo'))!;
     final T = foo.typeParameters.single;
-    final returnType = foo.returnType;
+    final returnType = foo.returnType2;
     expect(returnType.element, same(T));
   }
 
@@ -67,7 +67,7 @@
     final B = findElement.classOrMixin('B');
     final foo = manager.getMember2(B, Name(null, 'foo'))!;
     final T = foo.typeParameters.single;
-    final returnType = foo.returnType;
+    final returnType = foo.returnType2;
     // Check that the return type uses the same `T` as `<T>`.
     expect(returnType.element, same(T));
   }
@@ -83,7 +83,7 @@
     final B = findElement.classOrMixin('B');
     final foo = manager.getMember2(B, Name(null, 'foo'))!;
     final T = foo.typeParameters.single;
-    final returnType = foo.returnType;
+    final returnType = foo.returnType2;
     expect(returnType.element, same(T));
   }
 
@@ -1473,7 +1473,7 @@
         expect(variable.enclosingElement2, same(element.enclosingElement2));
         expect(variable.name, element.displayName);
         if (element.isGetter) {
-          expect(variable.type, element.returnType);
+          expect(variable.type, element.returnType2);
         } else {
           expect(variable.type, element.parameters[0].type);
         }
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
index dcc7d64..f137134 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
@@ -761,7 +761,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_different_dynamic() async {
@@ -777,7 +777,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_different_generic() async {
@@ -793,7 +793,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertTypeDynamic(foo.returnType);
+    assertTypeDynamic(foo.returnType2);
   }
 
   test_method_return_multiple_different_incompatible() async {
@@ -809,7 +809,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertTypeDynamic(foo.returnType);
+    assertTypeDynamic(foo.returnType2);
   }
 
   test_method_return_multiple_different_merge() async {
@@ -827,7 +827,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertType(foo.returnType, 'Object?');
+    assertType(foo.returnType2, 'Object?');
   }
 
   test_method_return_multiple_different_void() async {
@@ -843,7 +843,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_same_generic() async {
@@ -859,7 +859,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertType(foo.returnType, 'T');
+    assertType(foo.returnType2, 'T');
   }
 
   test_method_return_multiple_same_nonVoid() async {
@@ -875,7 +875,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_same_void() async {
@@ -891,7 +891,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'C');
-    assertType(foo.returnType, 'void');
+    assertType(foo.returnType2, 'void');
   }
 
   test_method_return_nonNullify() async {
@@ -909,7 +909,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'B');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_single() async {
@@ -922,7 +922,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'B');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_single_generic() async {
@@ -935,7 +935,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'B');
-    assertType(foo.returnType, 'T');
+    assertType(foo.returnType2, 'T');
   }
 
   test_setter_covariant_fromSetter() async {
@@ -1132,12 +1132,12 @@
 
   void _assertGetterType(PropertyAccessorElement? accessor, String expected) {
     accessor!;
-    assertType(accessor.returnType, expected);
+    assertType(accessor.returnType2, expected);
   }
 
   void _assertGetterTypeDynamic(PropertyAccessorElement? accessor) {
     accessor!;
-    assertTypeDynamic(accessor.returnType);
+    assertTypeDynamic(accessor.returnType2);
   }
 
   void _assertParameter(
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
index a9a312f..1c4e322 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
@@ -194,7 +194,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_different_dynamic() async {
@@ -210,7 +210,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_different_generic() async {
@@ -226,7 +226,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertTypeDynamic(foo.returnType);
+    assertTypeDynamic(foo.returnType2);
   }
 
   test_method_return_multiple_different_incompatible() async {
@@ -242,7 +242,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertTypeDynamic(foo.returnType);
+    assertTypeDynamic(foo.returnType2);
   }
 
   test_method_return_multiple_different_merge() async {
@@ -260,7 +260,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertType(foo.returnType, 'Object?');
+    assertType(foo.returnType2, 'Object?');
   }
 
   test_method_return_multiple_different_void() async {
@@ -276,7 +276,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_same_generic() async {
@@ -292,7 +292,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertType(foo.returnType, 'T');
+    assertType(foo.returnType2, 'T');
   }
 
   test_method_return_multiple_same_nonVoid() async {
@@ -308,7 +308,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_multiple_same_void() async {
@@ -324,7 +324,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'M');
-    assertType(foo.returnType, 'void');
+    assertType(foo.returnType2, 'void');
   }
 
   test_method_return_single() async {
@@ -337,7 +337,7 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'B');
-    assertType(foo.returnType, 'int');
+    assertType(foo.returnType2, 'int');
   }
 
   test_method_return_single_generic() async {
@@ -350,6 +350,6 @@
 }
 ''');
     var foo = findElement.method('foo', of: 'B');
-    assertType(foo.returnType, 'T');
+    assertType(foo.returnType2, 'T');
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
index a3b228b..302965b 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
@@ -1223,7 +1223,7 @@
 
   void _assertReturnType(String search, String expected) {
     var element = findNode.functionExpression(search).declaredElement!;
-    assertType(element.returnType, expected);
+    assertType(element.returnType2, expected);
   }
 }
 
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 1577f4a..a6b5dd3 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -608,7 +608,7 @@
       _writeCodeRange(e);
       _writeTypeParameterElements(e.typeParameters);
       _writeParameterElements(e.parameters);
-      _writeType('returnType', e.returnType);
+      _writeType('returnType', e.returnType2);
     });
 
     _assertNonSyntheticElementSelf(e);
@@ -712,7 +712,7 @@
 
       _writeTypeParameterElements(e.typeParameters);
       _writeParameterElements(e.parameters);
-      _writeType('returnType', e.returnType);
+      _writeType('returnType', e.returnType2);
       _writeNonSyntheticElement(e);
     });
 
@@ -887,7 +887,7 @@
 
       expect(e.typeParameters, isEmpty);
       _writeParameterElements(e.parameters);
-      _writeType('returnType', e.returnType);
+      _writeType('returnType', e.returnType2);
       _writeNonSyntheticElement(e);
       writeLinking();
     });
@@ -1028,7 +1028,7 @@
         _withIndent(() {
           _writeTypeParameterElements(aliasedElement.typeParameters);
           _writeParameterElements(aliasedElement.parameters);
-          _writeType('returnType', aliasedElement.returnType);
+          _writeType('returnType', aliasedElement.returnType2);
         });
       }
     });
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index cc6843b..8d5d08a 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -12928,14 +12928,14 @@
 ''');
     var x = library.definingCompilationUnit.topLevelVariables[0];
     var xExpr = x.constantInitializer as InstanceCreationExpression;
-    var xType = xExpr.constructorName.staticElement!.returnType;
+    var xType = xExpr.constructorName.staticElement!.returnType2;
     _assertTypeStr(
       xType,
       'C<int>',
     );
     var y = library.definingCompilationUnit.topLevelVariables[0];
     var yExpr = y.constantInitializer as InstanceCreationExpression;
-    var yType = yExpr.constructorName.staticElement!.returnType;
+    var yType = yExpr.constructorName.staticElement!.returnType2;
     _assertTypeStr(yType, 'C<int>');
   }
 
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 8df7a54..0943682 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1891,7 +1891,7 @@
       _withIndent(() {
         _sink.writeln('GenericFunctionTypeElement');
         _writeParameterElements(element.parameters);
-        _writeType('returnType', element.returnType);
+        _writeType('returnType', element.returnType2);
         _writeType('type', element.type);
       });
     }
diff --git a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
index 23a1f44..6a8b327 100644
--- a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
+++ b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
@@ -266,11 +266,11 @@
     ClassElement c = findElement.class_('C');
 
     PropertyAccessorElement x = c.accessors[0];
-    expect(x.returnType, VoidTypeImpl.instance);
+    expect(x.returnType2, VoidTypeImpl.instance);
 
     MethodElement operator = c.methods[0];
     expect(operator.displayName, '[]=');
-    expect(operator.returnType, VoidTypeImpl.instance);
+    expect(operator.returnType2, VoidTypeImpl.instance);
   }
 
   test_implicitVoidReturnType_derived() async {
@@ -287,11 +287,11 @@
     ClassElement c = findElement.class_('Derived');
 
     PropertyAccessorElement x = c.accessors[0];
-    expect(x.returnType, VoidTypeImpl.instance);
+    expect(x.returnType2, VoidTypeImpl.instance);
 
     MethodElement operator = c.methods[0];
     expect(operator.displayName, '[]=');
-    expect(operator.returnType, VoidTypeImpl.instance);
+    expect(operator.returnType2, VoidTypeImpl.instance);
   }
 
   test_listMap_empty() async {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index ade1d61..a8bf9f8 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -415,7 +415,7 @@
     }
 
     // return type
-    var returnType = element.returnType;
+    var returnType = element.returnType2;
     if (!isSetter) {
       var typeWritten = writeType(returnType,
           groupName: returnTypeGroupName, methodBeingCopied: element);
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index ba9f719..691b013 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -641,7 +641,7 @@
           }
         }
       } else if (parent is MethodDeclaration) {
-        type = parent.declaredElement?.returnType;
+        type = parent.declaredElement?.returnType2;
         if (type != null && type is VoidType) {
           optype.includeVoidReturnSuggestions = true;
         }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
index f3446c6..226f13a 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
@@ -128,7 +128,7 @@
       if (element.kind == ElementKind.SETTER) {
         return null;
       } else {
-        return element.returnType.getDisplayString(withNullability: false);
+        return element.returnType2.getDisplayString(withNullability: false);
       }
     } else if (element is VariableElement) {
       var type = element.type;
@@ -136,7 +136,7 @@
     } else if (element is TypeAliasElement) {
       var aliasedElement = element.aliasedElement;
       if (aliasedElement is GenericFunctionTypeElement) {
-        var returnType = aliasedElement.returnType;
+        var returnType = aliasedElement.returnType2;
         return returnType.getDisplayString(withNullability: false);
       } else {
         return null;
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index 9213e5b..a0838ea 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -245,7 +245,7 @@
       if (element.kind == analyzer.ElementKind.SETTER) {
         return null;
       }
-      return element.returnType.getDisplayString(withNullability: false);
+      return element.returnType2.getDisplayString(withNullability: false);
     } else if (element is analyzer.VariableElement) {
       return element.type.getDisplayString(withNullability: false);
     } else if (element is analyzer.TypeAliasElement) {
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
index 6e53476..14b50db 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
@@ -93,7 +93,7 @@
       }
     }
     for (var elem in type.methods) {
-      if (elem.returnType is! VoidType) {
+      if (elem.returnType2 is! VoidType) {
         if (optype.includeReturnValueSuggestions) {
           addSuggestion(elem);
         }
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index 264ce1c..7bd8d0e 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -81,7 +81,7 @@
       if (expression is Identifier) {
         var elem = expression.staticElement;
         if (elem is FunctionTypedElement) {
-          type = elem.returnType;
+          type = elem.returnType2;
         } else if (elem is ParameterElement) {
           type = elem.type;
         } else if (elem is LocalVariableElement) {
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 715aa54..9831c66 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -1792,7 +1792,7 @@
     var builder = await newBuilder();
     await builder.addDartFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
-        builder.writeType(f.returnType);
+        builder.writeType(f.returnType2);
       });
     });
     var edit = getEdit(builder);
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 4d95dd4..47d5be6 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -1934,7 +1934,7 @@
     var typeArguments = decoratedSupertype.typeArguments;
     Iterable<DartType?> typeArgumentTypes;
     typeArgumentTypes = typeArguments.map((t) => t!.type);
-    var createdType = DecoratedType(callee.returnType, nullabilityNode,
+    var createdType = DecoratedType(callee.returnType2, nullabilityNode,
         typeArguments: typeArguments);
     var calleeType =
         getOrComputeElementType(node, callee, targetType: createdType);
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index eaf80c0..b98d1cd 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -1047,7 +1047,7 @@
         readType!,
         combinerType,
         rhsType,
-        combiner.returnType,
+        combiner.returnType2,
         combiner,
       );
       if (!fixBuilder._typeSystem.isSubtypeOf(combinerReturnType, writeType)) {
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 8322e83..2d0b62b 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -284,7 +284,7 @@
     _variables.recordDecoratedElementType(
         valuesGetter,
         DecoratedType(valuesGetter.type, makeNonNullNode(valuesTarget),
-            returnType: DecoratedType(valuesGetter.returnType,
+            returnType: DecoratedType(valuesGetter.returnType2,
                 makeNonNullNode(valuesTarget.returnType()),
                 typeArguments: [
                   DecoratedType(classElement.thisType,