| Index: pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
 | 
| diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
 | 
| index 40b8d06b447b869da141a74b6aa12f1267a59927..f60d79321322355d24cb394e5781d65077232c0d 100644
 | 
| --- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
 | 
| +++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
 | 
| @@ -30,6 +30,22 @@ FunctionType substituteTypeParams(
 | 
|        requiredParameterCount: type.requiredParameterCount);
 | 
|  }
 | 
|  
 | 
| +/// Given a [FunctionType], gets the type of the named parameter with the given
 | 
| +/// [name], or `dynamic` if there is no parameter with the given name.
 | 
| +DartType getNamedParameterType(FunctionType functionType, String name) {
 | 
| +  return functionType.getNamedParameter(name) ?? const DynamicType();
 | 
| +}
 | 
| +
 | 
| +/// Given a [FunctionType], gets the type of the [i]th positional parameter, or
 | 
| +/// `dynamic` if there is no parameter with that index.
 | 
| +DartType getPositionalParameterType(FunctionType functionType, int i) {
 | 
| +  if (i < functionType.positionalParameters.length) {
 | 
| +    return functionType.positionalParameters[i];
 | 
| +  } else {
 | 
| +    return const DynamicType();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  /// A constraint on a type parameter that we're inferring.
 | 
|  class TypeConstraint {
 | 
|    /// The lower bound of the type being constrained.  This bound must be a
 | 
| 
 |