Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart

Issue 2928613003: Fix corner cases of type inference with implicit references to `.call`. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart ('k') | pkg/front_end/test/fasta/kompile.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698