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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Issue 2954403002: Add type inference for super method invocations. (Closed)
Patch Set: Created 3 years, 5 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
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.body_builder; 5 library fasta.body_builder;
6 6
7 import '../fasta_codes.dart' 7 import '../fasta_codes.dart'
8 show 8 show
9 FastaMessage, 9 FastaMessage,
10 codeConstFieldWithoutInitializer, 10 codeConstFieldWithoutInitializer,
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 } 890 }
891 891
892 @override 892 @override
893 Expression toSuperMethodInvocation(MethodInvocation node) { 893 Expression toSuperMethodInvocation(MethodInvocation node) {
894 Member target = lookupSuperMember(node.name); 894 Member target = lookupSuperMember(node.name);
895 bool isNoSuchMethod = target == null; 895 bool isNoSuchMethod = target == null;
896 if (target is Procedure) { 896 if (target is Procedure) {
897 if (!target.isAccessor) { 897 if (!target.isAccessor) {
898 if (areArgumentsCompatible(target.function, node.arguments)) { 898 if (areArgumentsCompatible(target.function, node.arguments)) {
899 Expression result = new KernelDirectMethodInvocation( 899 Expression result = new KernelDirectMethodInvocation(
900 new ThisExpression()..fileOffset = node.fileOffset, 900 new KernelThisExpression()..fileOffset = node.fileOffset,
901 target, 901 target,
902 node.arguments); 902 node.arguments)
903 ..fileOffset = node.fileOffset;
903 // TODO(ahe): Use [DirectMethodInvocation] when possible, that is, 904 // TODO(ahe): Use [DirectMethodInvocation] when possible, that is,
904 // remove the next line: 905 // remove the next line:
905 result = 906 result =
906 new KernelSuperMethodInvocation(node.name, node.arguments, null); 907 new KernelSuperMethodInvocation(node.name, node.arguments, target)
Paul Berry 2017/06/26 18:57:55 Peter, can you confirm that passing `target` is th
Siggi Cherem (dart-lang) 2017/06/26 19:47:53 DBC - the answer might change in the near future w
Paul Berry 2017/06/27 20:50:17 Thanks for the heads up. I'm adding a test case t
908 ..fileOffset = node.fileOffset;
907 return result; 909 return result;
908 } else { 910 } else {
909 isNoSuchMethod = true; 911 isNoSuchMethod = true;
910 } 912 }
911 } 913 }
912 } 914 }
913 if (isNoSuchMethod) { 915 if (isNoSuchMethod) {
914 return invokeSuperNoSuchMethod( 916 return invokeSuperNoSuchMethod(
915 node.name.name, node.arguments, node.fileOffset); 917 node.name.name, node.arguments, node.fileOffset);
916 } 918 }
917 Expression receiver = new KernelDirectPropertyGet( 919 Expression receiver = new KernelDirectPropertyGet(
918 new ThisExpression()..fileOffset = node.fileOffset, target); 920 new KernelThisExpression()..fileOffset = node.fileOffset, target);
919 // TODO(ahe): Use [DirectPropertyGet] when possible, that is, remove the 921 // TODO(ahe): Use [DirectPropertyGet] when possible, that is, remove the
920 // next line: 922 // next line:
921 receiver = new KernelSuperPropertyGet(node.name, target); 923 receiver = new KernelSuperPropertyGet(node.name, target);
922 return buildMethodInvocation( 924 return buildMethodInvocation(
923 receiver, callName, node.arguments, node.fileOffset, 925 receiver, callName, node.arguments, node.fileOffset,
924 isImplicitCall: true); 926 isImplicitCall: true);
925 } 927 }
926 928
927 bool areArgumentsCompatible(FunctionNode function, Arguments arguments) { 929 bool areArgumentsCompatible(FunctionNode function, Arguments arguments) {
928 // TODO(ahe): Implement this. 930 // TODO(ahe): Implement this.
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 isFinal: true) 987 isFinal: true)
986 ..fileOffset = charOffset; 988 ..fileOffset = charOffset;
987 arguments = new Arguments(<Expression>[ 989 arguments = new Arguments(<Expression>[
988 new VariableGet(value)..fileOffset = arguments.fileOffset 990 new VariableGet(value)..fileOffset = arguments.fileOffset
989 ]); 991 ]);
990 } 992 }
991 Expression result = new SuperMethodInvocation( 993 Expression result = new SuperMethodInvocation(
992 noSuchMethodName, 994 noSuchMethodName,
993 new Arguments(<Expression>[ 995 new Arguments(<Expression>[
994 library.loader.instantiateInvocation( 996 library.loader.instantiateInvocation(
995 new ThisExpression()..fileOffset = charOffset, 997 new KernelThisExpression()..fileOffset = charOffset,
996 name, 998 name,
997 arguments, 999 arguments,
998 charOffset, 1000 charOffset,
999 true) 1001 true)
1000 ]) 1002 ])
1001 ..fileOffset = arguments.fileOffset); 1003 ..fileOffset = arguments.fileOffset);
1002 if (isSetter) { 1004 if (isSetter) {
1003 result = new Let( 1005 result = new Let(
1004 value, 1006 value,
1005 new Let( 1007 new Let(
(...skipping 2684 matching lines...) Expand 10 before | Expand all | Expand 10 after
3690 if (starToken == null) { 3692 if (starToken == null) {
3691 return AsyncMarker.Async; 3693 return AsyncMarker.Async;
3692 } else { 3694 } else {
3693 assert(identical(starToken.stringValue, "*")); 3695 assert(identical(starToken.stringValue, "*"));
3694 return AsyncMarker.AsyncStar; 3696 return AsyncMarker.AsyncStar;
3695 } 3697 }
3696 } else { 3698 } else {
3697 return internalError("Unknown async modifier: $asyncToken"); 3699 return internalError("Unknown async modifier: $asyncToken");
3698 } 3700 }
3699 } 3701 }
OLDNEW
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698