|
2 | 2 | // for details. All rights reserved. Use of this source code is governed by a
|
3 | 3 | // BSD-style license that can be found in the LICENSE file.
|
4 | 4 |
|
5 |
| -import 'package:front_end/src/api_unstable/dart2js.dart' |
6 |
| - show operatorFromString; |
7 |
| - |
8 | 5 | import 'package:kernel/ast.dart' as ir;
|
9 | 6 | import 'package:kernel/class_hierarchy.dart' as ir;
|
10 | 7 | import 'package:kernel/type_environment.dart' as ir;
|
@@ -255,13 +252,19 @@ abstract class ImpactBuilderBase extends StaticTypeVisitor
|
255 | 252 | }
|
256 | 253 |
|
257 | 254 | @override
|
258 |
| - void handleStaticGet(ir.StaticGet node, ir.DartType resultType) { |
259 |
| - ir.Member target = node.target; |
260 |
| - if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { |
261 |
| - registerStaticTearOff(target, getDeferredImport(node)); |
262 |
| - } else { |
263 |
| - registerStaticGet(target, getDeferredImport(node)); |
264 |
| - } |
| 255 | + void handleStaticGet( |
| 256 | + ir.Expression node, ir.Member target, ir.DartType resultType) { |
| 257 | + assert(!(target is ir.Procedure && target.kind == ir.ProcedureKind.Method), |
| 258 | + "Static tear off registered as static get: $node"); |
| 259 | + registerStaticGet(target, getDeferredImport(node)); |
| 260 | + } |
| 261 | + |
| 262 | + @override |
| 263 | + void handleStaticTearOff( |
| 264 | + ir.Expression node, ir.Member target, ir.DartType resultType) { |
| 265 | + assert(target is ir.Procedure && target.kind == ir.ProcedureKind.Method, |
| 266 | + "Static get registered as static tear off: $node"); |
| 267 | + registerStaticTearOff(target, getDeferredImport(node)); |
265 | 268 | }
|
266 | 269 |
|
267 | 270 | @override
|
@@ -520,71 +523,103 @@ abstract class ImpactBuilderBase extends StaticTypeVisitor
|
520 | 523 | }
|
521 | 524 |
|
522 | 525 | @override
|
523 |
| - void handleMethodInvocation( |
524 |
| - ir.MethodInvocation node, |
| 526 | + void handleDynamicInvocation( |
| 527 | + ir.InvocationExpression node, |
| 528 | + ir.DartType receiverType, |
| 529 | + ArgumentTypes argumentTypes, |
| 530 | + ir.DartType returnType) { |
| 531 | + int positionArguments = node.arguments.positional.length; |
| 532 | + List<String> namedArguments = _getNamedArguments(node.arguments); |
| 533 | + List<ir.DartType> typeArguments = node.arguments.types; |
| 534 | + ClassRelation relation = computeClassRelationFromType(receiverType); |
| 535 | + registerDynamicInvocation(receiverType, relation, node.name, |
| 536 | + positionArguments, namedArguments, typeArguments); |
| 537 | + } |
| 538 | + |
| 539 | + @override |
| 540 | + void handleFunctionInvocation( |
| 541 | + ir.InvocationExpression node, |
525 | 542 | ir.DartType receiverType,
|
526 | 543 | ArgumentTypes argumentTypes,
|
527 | 544 | ir.DartType returnType) {
|
528 | 545 | int positionArguments = node.arguments.positional.length;
|
529 | 546 | List<String> namedArguments = _getNamedArguments(node.arguments);
|
530 | 547 | List<ir.DartType> typeArguments = node.arguments.types;
|
531 |
| - ir.Expression receiver = node.receiver; |
532 |
| - if (receiver is ir.VariableGet && |
533 |
| - receiver.variable.isFinal && |
534 |
| - receiver.variable.parent is ir.FunctionDeclaration) { |
535 |
| - registerLocalFunctionInvocation(receiver.variable.parent, |
| 548 | + registerFunctionInvocation( |
| 549 | + receiverType, positionArguments, namedArguments, typeArguments); |
| 550 | + } |
| 551 | + |
| 552 | + @override |
| 553 | + void handleInstanceInvocation( |
| 554 | + ir.InvocationExpression node, |
| 555 | + ir.DartType receiverType, |
| 556 | + ir.Member interfaceTarget, |
| 557 | + ArgumentTypes argumentTypes) { |
| 558 | + int positionArguments = node.arguments.positional.length; |
| 559 | + List<String> namedArguments = _getNamedArguments(node.arguments); |
| 560 | + List<ir.DartType> typeArguments = node.arguments.types; |
| 561 | + ClassRelation relation = computeClassRelationFromType(receiverType); |
| 562 | + |
| 563 | + if (interfaceTarget is ir.Field || |
| 564 | + interfaceTarget is ir.Procedure && |
| 565 | + interfaceTarget.kind == ir.ProcedureKind.Getter) { |
| 566 | + registerInstanceInvocation(receiverType, relation, interfaceTarget, |
536 | 567 | positionArguments, namedArguments, typeArguments);
|
| 568 | + registerFunctionInvocation(interfaceTarget.getterType, positionArguments, |
| 569 | + namedArguments, typeArguments); |
537 | 570 | } else {
|
538 |
| - ClassRelation relation = computeClassRelationFromType(receiverType); |
539 |
| - |
540 |
| - ir.Member interfaceTarget = node.interfaceTarget; |
541 |
| - if (interfaceTarget == null) { |
542 |
| - registerDynamicInvocation(receiverType, relation, node.name, |
543 |
| - positionArguments, namedArguments, typeArguments); |
544 |
| - // TODO(johnniwinther): Avoid treating a known function call as a |
545 |
| - // dynamic call when CFE provides a way to distinguish the two. |
546 |
| - if (operatorFromString(node.name.text) == null && |
547 |
| - receiverType is ir.DynamicType) { |
548 |
| - // We might implicitly call a getter that returns a function. |
549 |
| - registerFunctionInvocation(const ir.DynamicType(), positionArguments, |
550 |
| - namedArguments, typeArguments); |
551 |
| - } |
552 |
| - } else { |
553 |
| - if (interfaceTarget is ir.Field || |
554 |
| - interfaceTarget is ir.Procedure && |
555 |
| - interfaceTarget.kind == ir.ProcedureKind.Getter) { |
556 |
| - registerInstanceInvocation(receiverType, relation, interfaceTarget, |
557 |
| - positionArguments, namedArguments, typeArguments); |
558 |
| - registerFunctionInvocation(interfaceTarget.getterType, |
559 |
| - positionArguments, namedArguments, typeArguments); |
560 |
| - } else { |
561 |
| - registerInstanceInvocation(receiverType, relation, interfaceTarget, |
562 |
| - positionArguments, namedArguments, typeArguments); |
563 |
| - } |
564 |
| - } |
| 571 | + registerInstanceInvocation(receiverType, relation, interfaceTarget, |
| 572 | + positionArguments, namedArguments, typeArguments); |
565 | 573 | }
|
566 | 574 | }
|
567 | 575 |
|
568 | 576 | @override
|
569 |
| - void handlePropertyGet( |
570 |
| - ir.PropertyGet node, ir.DartType receiverType, ir.DartType resultType) { |
| 577 | + void handleLocalFunctionInvocation( |
| 578 | + ir.InvocationExpression node, |
| 579 | + ir.FunctionDeclaration function, |
| 580 | + ArgumentTypes argumentTypes, |
| 581 | + ir.DartType returnType) { |
| 582 | + int positionArguments = node.arguments.positional.length; |
| 583 | + List<String> namedArguments = _getNamedArguments(node.arguments); |
| 584 | + List<ir.DartType> typeArguments = node.arguments.types; |
| 585 | + registerLocalFunctionInvocation( |
| 586 | + function, positionArguments, namedArguments, typeArguments); |
| 587 | + } |
| 588 | + |
| 589 | + @override |
| 590 | + void handleEqualsCall(ir.Expression left, ir.DartType leftType, |
| 591 | + ir.Expression right, ir.DartType rightType, ir.Member interfaceTarget) { |
| 592 | + ClassRelation relation = computeClassRelationFromType(leftType); |
| 593 | + registerInstanceInvocation(leftType, relation, interfaceTarget, 1, |
| 594 | + const <String>[], const <ir.DartType>[]); |
| 595 | + } |
| 596 | + |
| 597 | + @override |
| 598 | + void handleDynamicGet(ir.Expression node, ir.DartType receiverType, |
| 599 | + ir.Name name, ir.DartType resultType) { |
571 | 600 | ClassRelation relation = computeClassRelationFromType(receiverType);
|
572 |
| - if (node.interfaceTarget != null) { |
573 |
| - registerInstanceGet(receiverType, relation, node.interfaceTarget); |
574 |
| - } else { |
575 |
| - registerDynamicGet(receiverType, relation, node.name); |
576 |
| - } |
| 601 | + registerDynamicGet(receiverType, relation, name); |
577 | 602 | }
|
578 | 603 |
|
579 | 604 | @override
|
580 |
| - void handlePropertySet( |
581 |
| - ir.PropertySet node, ir.DartType receiverType, ir.DartType valueType) { |
| 605 | + void handleInstanceGet(ir.Expression node, ir.DartType receiverType, |
| 606 | + ir.Member interfaceTarget, ir.DartType resultType) { |
582 | 607 | ClassRelation relation = computeClassRelationFromType(receiverType);
|
583 |
| - if (node.interfaceTarget != null) { |
584 |
| - registerInstanceSet(receiverType, relation, node.interfaceTarget); |
585 |
| - } else { |
586 |
| - registerDynamicSet(receiverType, relation, node.name); |
587 |
| - } |
| 608 | + registerInstanceGet(receiverType, relation, interfaceTarget); |
| 609 | + } |
| 610 | + |
| 611 | + @override |
| 612 | + void handleDynamicSet(ir.Expression node, ir.DartType receiverType, |
| 613 | + ir.Name name, ir.DartType valueType) { |
| 614 | + ClassRelation relation = computeClassRelationFromType(receiverType); |
| 615 | + registerDynamicSet(receiverType, relation, name); |
| 616 | + } |
| 617 | + |
| 618 | + @override |
| 619 | + void handleInstanceSet(ir.Expression node, ir.DartType receiverType, |
| 620 | + ir.Member interfaceTarget, ir.DartType valueType) { |
| 621 | + ClassRelation relation = computeClassRelationFromType(receiverType); |
| 622 | + registerInstanceSet(receiverType, relation, interfaceTarget); |
588 | 623 | }
|
589 | 624 |
|
590 | 625 | @override
|
|
0 commit comments