| Index: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| index a75afc6f6dfced2220f9ed7413ba0c4996e49e42..e8a8d88cde432ba00fb1fb1371ede3f70e4b01eb 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| @@ -23,6 +23,31 @@ import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
|
| import 'package:front_end/src/fasta/type_inference/type_promotion.dart';
|
| import 'package:kernel/ast.dart';
|
|
|
| +_ArgumentForEachFunction _forEachArgument(Arguments arguments) {
|
| + return (void callback(String name, Expression expression)) {
|
| + for (var expression in arguments.positional) {
|
| + callback(null, expression);
|
| + }
|
| + for (var namedExpression in arguments.named) {
|
| + callback(namedExpression.name, namedExpression.value);
|
| + }
|
| + };
|
| +}
|
| +
|
| +List<DartType> _getExplicitTypeArguments(Arguments arguments) {
|
| + if (arguments is KernelArguments) {
|
| + return arguments._hasExplicitTypeArguments ? arguments.types : null;
|
| + } else {
|
| + // This code path should only be taken in situations where there are no
|
| + // type arguments at all, e.g. calling a user-definable operator.
|
| + assert(arguments.types.isEmpty);
|
| + return null;
|
| + }
|
| +}
|
| +
|
| +typedef void _ArgumentForEachFunction(
|
| + void callback(String name, Expression expression));
|
| +
|
| /// Concrete shadow object representing a set of invocation arguments.
|
| class KernelArguments extends Arguments {
|
| bool _hasExplicitTypeArguments;
|
| @@ -114,26 +139,16 @@ class KernelConstructorInvocation extends ConstructorInvocation
|
| Reference targetReference, Arguments arguments)
|
| : super.byReference(targetReference, arguments);
|
|
|
| - void _forEachArgument(void callback(String name, Expression expression)) {
|
| - for (var expression in arguments.positional) {
|
| - callback(null, expression);
|
| - }
|
| - for (var namedExpression in arguments.named) {
|
| - callback(namedExpression.name, namedExpression.value);
|
| - }
|
| - }
|
| -
|
| @override
|
| DartType _inferExpression(
|
| KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
|
| - KernelArguments arguments = this.arguments;
|
| return inferrer.inferConstructorInvocation(
|
| typeContext,
|
| typeNeeded,
|
| fileOffset,
|
| target,
|
| - arguments._hasExplicitTypeArguments ? arguments.types : null,
|
| - _forEachArgument, (types) {
|
| + _getExplicitTypeArguments(arguments),
|
| + _forEachArgument(arguments), (types) {
|
| arguments.types.clear();
|
| arguments.types.addAll(types);
|
| });
|
| @@ -398,9 +413,17 @@ class KernelMethodInvocation extends MethodInvocation
|
| @override
|
| DartType _inferExpression(
|
| KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
|
| - // TODO(scheglov): implement.
|
| - inferrer.inferExpression(receiver, null, false);
|
| - return typeNeeded ? const DynamicType() : null;
|
| + return inferrer.inferMethodInvocation(
|
| + typeContext,
|
| + typeNeeded,
|
| + fileOffset,
|
| + receiver,
|
| + name,
|
| + _getExplicitTypeArguments(arguments),
|
| + _forEachArgument(arguments), (types) {
|
| + arguments.types.clear();
|
| + arguments.types.addAll(types);
|
| + });
|
| }
|
| }
|
|
|
|
|