OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
5 import 'package:front_end/src/base/instrumentation.dart'; | 5 import 'package:front_end/src/base/instrumentation.dart'; |
6 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; | 6 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; |
| 7 import 'package:front_end/src/fasta/names.dart' show callName; |
7 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; | 8 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; |
8 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; | 9 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
; |
9 import 'package:front_end/src/fasta/type_inference/type_promotion.dart'; | 10 import 'package:front_end/src/fasta/type_inference/type_promotion.dart'; |
10 import 'package:front_end/src/fasta/type_inference/type_schema.dart'; | 11 import 'package:front_end/src/fasta/type_inference/type_schema.dart'; |
11 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart'
; | 12 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart'
; |
12 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart'
; | 13 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart'
; |
13 import 'package:kernel/ast.dart' | 14 import 'package:kernel/ast.dart' |
14 show | 15 show |
15 Arguments, | 16 Arguments, |
16 AsyncMarker, | 17 AsyncMarker, |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 strongMode = engine.strongMode, | 230 strongMode = engine.strongMode, |
230 classHierarchy = engine.classHierarchy, | 231 classHierarchy = engine.classHierarchy, |
231 instrumentation = topLevel ? null : engine.instrumentation, | 232 instrumentation = topLevel ? null : engine.instrumentation, |
232 typeSchemaEnvironment = engine.typeSchemaEnvironment, | 233 typeSchemaEnvironment = engine.typeSchemaEnvironment, |
233 isTopLevel = topLevel; | 234 isTopLevel = topLevel; |
234 | 235 |
235 /// Gets the type promoter that should be used to promote types during | 236 /// Gets the type promoter that should be used to promote types during |
236 /// inference. | 237 /// inference. |
237 TypePromoter get typePromoter; | 238 TypePromoter get typePromoter; |
238 | 239 |
239 FunctionType getCalleeFunctionType( | 240 FunctionType getCalleeFunctionType(Member interfaceMember, |
240 Member interfaceMember, DartType receiverType, Name methodName) { | 241 DartType receiverType, Name methodName, bool followCall) { |
241 var type = getCalleeType(interfaceMember, receiverType, methodName); | 242 var type = getCalleeType(interfaceMember, receiverType, methodName); |
242 if (type is FunctionType) { | 243 if (type is FunctionType) { |
243 return type; | 244 return type; |
244 } else { | 245 } else if (followCall && type is InterfaceType) { |
245 return _functionReturningDynamic; | 246 var member = classHierarchy.getInterfaceMember(type.classNode, callName); |
| 247 var callType = member?.getterType; |
| 248 if (callType is FunctionType) { |
| 249 return callType; |
| 250 } |
246 } | 251 } |
| 252 return _functionReturningDynamic; |
247 } | 253 } |
248 | 254 |
249 DartType getCalleeType( | 255 DartType getCalleeType( |
250 Member interfaceMember, DartType receiverType, Name methodName) { | 256 Member interfaceMember, DartType receiverType, Name methodName) { |
251 if (receiverType is InterfaceType) { | 257 if (receiverType is InterfaceType) { |
252 if (interfaceMember == null) return const DynamicType(); | 258 if (interfaceMember == null) return const DynamicType(); |
253 var memberClass = interfaceMember.enclosingClass; | 259 var memberClass = interfaceMember.enclosingClass; |
254 DartType calleeType; | 260 DartType calleeType; |
255 if (interfaceMember is Procedure) { | 261 if (interfaceMember is Procedure) { |
256 if (interfaceMember.kind == ProcedureKind.Getter) { | 262 if (interfaceMember.kind == ProcedureKind.Getter) { |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 void _forEachArgument( | 558 void _forEachArgument( |
553 Arguments arguments, void callback(String name, Expression expression)) { | 559 Arguments arguments, void callback(String name, Expression expression)) { |
554 for (var expression in arguments.positional) { | 560 for (var expression in arguments.positional) { |
555 callback(null, expression); | 561 callback(null, expression); |
556 } | 562 } |
557 for (var namedExpression in arguments.named) { | 563 for (var namedExpression in arguments.named) { |
558 callback(namedExpression.name, namedExpression.value); | 564 callback(namedExpression.name, namedExpression.value); |
559 } | 565 } |
560 } | 566 } |
561 } | 567 } |
OLD | NEW |