Remove _explicitTypeParameters and substitute4 from FunctionTypeImpl.

substitute4 was only used by the kernel resynthesizer, which is not
being maintained at the moment (and which I believe needs to be
reworked anyhow).  With substitute4 gone, _explicitTypeParameters was
always null (except in the case of CircularFunctionTypeImpl, where it
had no effect), so we can just replace it with literal `null`.

Change-Id: I5248e0f93b9a39c55d3e4e8b62150536656608e8
Reviewed-on: https://dart-review.googlesource.com/57709
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 3ccdac9..500212a 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -139,10 +139,6 @@
       TypeParameterElement.EMPTY_LIST;
 
   @override
-  List<TypeParameterElement> get _explicitTypeParameters =>
-      TypeParameterElement.EMPTY_LIST;
-
-  @override
   bool get _isInstantiated => false;
 
   @override
@@ -193,12 +189,6 @@
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) => this;
 
   @override
-  FunctionType substitute4(
-      List<TypeParameterElement> typeParameters, List<DartType> typeArguments) {
-    return this;
-  }
-
-  @override
   void _forEachParameterType(
       ParameterKind kind, callback(String name, DartType type)) {
     // There are no parameters.
@@ -265,8 +255,7 @@
 
   DeferredFunctionTypeImpl(this._computeElement, String name,
       List<DartType> typeArguments, bool isInstantiated)
-      : super._(
-            null, name, null, typeArguments, null, null, null, isInstantiated);
+      : super._(null, name, null, typeArguments, null, null, isInstantiated);
 
   @override
   FunctionTypedElement get element {
@@ -359,12 +348,6 @@
   List<TypeParameterElement> _typeParameters;
 
   /**
-   * The list of [typeParameters], if there is no element from which they can be
-   * computed, or `null` if they should be computed when necessary.
-   */
-  final List<TypeParameterElement> _explicitTypeParameters;
-
-  /**
    * The return type of the function, or `null` if the return type should be
    * accessed through the element.
    */
@@ -396,7 +379,7 @@
    */
   FunctionTypeImpl(FunctionTypedElement element,
       [List<FunctionTypeAliasElement> prunedTypedefs])
-      : this._(element, null, prunedTypedefs, null, null, null, null, false);
+      : this._(element, null, prunedTypedefs, null, null, null, false);
 
   /**
    * Initialize a newly created function type to be declared by the given
@@ -404,8 +387,7 @@
    */
   FunctionTypeImpl.elementWithNameAndArgs(Element element, String name,
       List<DartType> typeArguments, bool isInstantiated)
-      : this._(element, name, null, typeArguments, null, null, null,
-            isInstantiated);
+      : this._(element, name, null, typeArguments, null, null, isInstantiated);
 
   /**
    * Initialize a newly created function type to be declared by the given
@@ -413,8 +395,7 @@
    */
   FunctionTypeImpl.forTypedef(FunctionTypeAliasElement element,
       [List<FunctionTypeAliasElement> prunedTypedefs])
-      : this._(element, element?.name, prunedTypedefs, null, null, null, null,
-            false);
+      : this._(element, element?.name, prunedTypedefs, null, null, null, false);
 
   /**
    * Initialize a newly created function type that is semantically the same as
@@ -482,11 +463,10 @@
       String name,
       this.prunedTypedefs,
       this._typeArguments,
-      this._explicitTypeParameters,
       this._returnType,
       this._parameters,
       this._isInstantiated)
-      : _typeParameters = _explicitTypeParameters,
+      : _typeParameters = null,
         super(element, name);
 
   /**
@@ -944,7 +924,7 @@
     newTypeArgs.addAll(argumentTypes);
 
     return new FunctionTypeImpl._(element, name, prunedTypedefs, newTypeArgs,
-        _explicitTypeParameters, _returnType, _parameters, true);
+        _returnType, _parameters, true);
   }
 
   @override
@@ -1023,8 +1003,8 @@
       List<DartType> typeArgs = typeArguments
           .map((DartType t) => (t as TypeImpl).pruned(prune))
           .toList(growable: false);
-      return new FunctionTypeImpl._(element, name, prune, typeArgs,
-          _explicitTypeParameters, _returnType, _parameters, _isInstantiated);
+      return new FunctionTypeImpl._(element, name, prune, typeArgs, _returnType,
+          _parameters, _isInstantiated);
     }
   }
 
@@ -1046,8 +1026,8 @@
     }
     List<DartType> typeArgs =
         TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
-    return new FunctionTypeImpl._(element, name, prune, typeArgs,
-        _explicitTypeParameters, _returnType, _parameters, _isInstantiated);
+    return new FunctionTypeImpl._(element, name, prune, typeArgs, _returnType,
+        _parameters, _isInstantiated);
   }
 
   @override
@@ -1055,20 +1035,6 @@
       substitute2(argumentTypes, typeArguments);
 
   /**
-   * Perform simple substitution of [typeParameters] with [typeArguments].
-   */
-  FunctionType substitute4(
-      List<TypeParameterElement> typeParameters, List<DartType> typeArguments) {
-    if (typeArguments.length != typeParameters.length) {
-      throw new ArgumentError(
-          "typeArguments.length (${typeArguments.length}) != '"
-          "'typeParameters.length (${typeParameters.length})");
-    }
-    return new FunctionTypeImpl._(element, name, [], typeArguments,
-        typeParameters, _returnType, _parameters, true);
-  }
-
-  /**
    * Invokes [callback] for each parameter of [kind] with the parameter's [name]
    * and type after any type parameters have been applied.
    */
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index a66763e..43cb699 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -372,7 +372,7 @@
     }
 
     // Replace Analyzer type parameters with type arguments.
-    return rawType.substitute4(usedTypeParameters, usedTypeArguments);
+    throw new UnimplementedError('TODO(paulberry)');
   }
 
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].