OLD | NEW |
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 FastaMessage, codeExpectedButGot, codeExpectedFunctionBody; | 8 show FastaMessage, codeExpectedButGot, codeExpectedFunctionBody; |
9 | 9 |
10 import '../parser/parser.dart' show FormalParameterType, MemberKind, optional; | 10 import '../parser/parser.dart' show FormalParameterType, MemberKind, optional; |
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 push(finishSend(receiver, arguments, beginToken.charOffset)); | 638 push(finishSend(receiver, arguments, beginToken.charOffset)); |
639 } | 639 } |
640 } | 640 } |
641 | 641 |
642 @override | 642 @override |
643 finishSend(Object receiver, Arguments arguments, int charOffset) { | 643 finishSend(Object receiver, Arguments arguments, int charOffset) { |
644 if (receiver is FastaAccessor) { | 644 if (receiver is FastaAccessor) { |
645 return receiver.doInvocation(charOffset, arguments); | 645 return receiver.doInvocation(charOffset, arguments); |
646 } else { | 646 } else { |
647 return buildMethodInvocation( | 647 return buildMethodInvocation( |
648 toValue(receiver), callName, arguments, charOffset); | 648 toValue(receiver), callName, arguments, charOffset, |
| 649 isImplicitCall: true); |
649 } | 650 } |
650 } | 651 } |
651 | 652 |
652 @override | 653 @override |
653 void beginCascade(Token token) { | 654 void beginCascade(Token token) { |
654 debugEvent("beginCascade"); | 655 debugEvent("beginCascade"); |
655 Expression expression = popForValue(); | 656 Expression expression = popForValue(); |
656 if (expression is KernelCascadeExpression) { | 657 if (expression is KernelCascadeExpression) { |
657 push(expression); | 658 push(expression); |
658 push(new VariableAccessor(this, token, expression.variable)); | 659 push(new VariableAccessor(this, token, expression.variable)); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
788 return throwNoSuchMethodError( | 789 return throwNoSuchMethodError( |
789 node.name.name, node.arguments, node.fileOffset, | 790 node.name.name, node.arguments, node.fileOffset, |
790 isSuper: true); | 791 isSuper: true); |
791 } | 792 } |
792 Expression receiver = new KernelDirectPropertyGet( | 793 Expression receiver = new KernelDirectPropertyGet( |
793 new ThisExpression()..fileOffset = node.fileOffset, target); | 794 new ThisExpression()..fileOffset = node.fileOffset, target); |
794 // TODO(ahe): Use [DirectPropertyGet] when possible, that is, remove the | 795 // TODO(ahe): Use [DirectPropertyGet] when possible, that is, remove the |
795 // next line: | 796 // next line: |
796 receiver = new KernelSuperPropertyGet(node.name, target); | 797 receiver = new KernelSuperPropertyGet(node.name, target); |
797 return buildMethodInvocation( | 798 return buildMethodInvocation( |
798 receiver, callName, node.arguments, node.fileOffset); | 799 receiver, callName, node.arguments, node.fileOffset, |
| 800 isImplicitCall: true); |
799 } | 801 } |
800 | 802 |
801 bool areArgumentsCompatible(FunctionNode function, Arguments arguments) { | 803 bool areArgumentsCompatible(FunctionNode function, Arguments arguments) { |
802 // TODO(ahe): Implement this. | 804 // TODO(ahe): Implement this. |
803 return true; | 805 return true; |
804 } | 806 } |
805 | 807 |
806 @override | 808 @override |
807 Expression throwNoSuchMethodError( | 809 Expression throwNoSuchMethodError( |
808 String name, Arguments arguments, int charOffset, | 810 String name, Arguments arguments, int charOffset, |
(...skipping 2031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2840 } | 2842 } |
2841 return expression; | 2843 return expression; |
2842 } | 2844 } |
2843 | 2845 |
2844 @override | 2846 @override |
2845 bool isIdentical(Member member) => member == coreTypes.identicalProcedure; | 2847 bool isIdentical(Member member) => member == coreTypes.identicalProcedure; |
2846 | 2848 |
2847 @override | 2849 @override |
2848 Expression buildMethodInvocation( | 2850 Expression buildMethodInvocation( |
2849 Expression receiver, Name name, Arguments arguments, int offset, | 2851 Expression receiver, Name name, Arguments arguments, int offset, |
2850 {bool isConstantExpression: false, bool isNullAware: false}) { | 2852 {bool isConstantExpression: false, |
| 2853 bool isNullAware: false, |
| 2854 bool isImplicitCall: false}) { |
2851 if (constantExpressionRequired && !isConstantExpression) { | 2855 if (constantExpressionRequired && !isConstantExpression) { |
2852 return buildCompileTimeError("Not a constant expression.", offset); | 2856 return buildCompileTimeError("Not a constant expression.", offset); |
2853 } | 2857 } |
2854 if (isNullAware) { | 2858 if (isNullAware) { |
2855 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); | 2859 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); |
2856 return makeLet( | 2860 return makeLet( |
2857 variable, | 2861 variable, |
2858 new ConditionalExpression( | 2862 new ConditionalExpression( |
2859 buildIsNull(new VariableGet(variable)), | 2863 buildIsNull(new VariableGet(variable)), |
2860 new NullLiteral(), | 2864 new NullLiteral(), |
2861 new MethodInvocation(new VariableGet(variable), name, arguments) | 2865 new MethodInvocation(new VariableGet(variable), name, arguments) |
2862 ..fileOffset = offset, | 2866 ..fileOffset = offset, |
2863 const DynamicType())); | 2867 const DynamicType())); |
2864 } else { | 2868 } else { |
2865 return new KernelMethodInvocation(receiver, name, arguments) | 2869 return new KernelMethodInvocation(receiver, name, arguments, |
| 2870 isImplicitCall: isImplicitCall) |
2866 ..fileOffset = offset; | 2871 ..fileOffset = offset; |
2867 } | 2872 } |
2868 } | 2873 } |
2869 | 2874 |
2870 @override | 2875 @override |
2871 void addCompileTimeErrorFromMessage(FastaMessage message) { | 2876 void addCompileTimeErrorFromMessage(FastaMessage message) { |
2872 library.addCompileTimeError(message.charOffset, message.message, | 2877 library.addCompileTimeError(message.charOffset, message.message, |
2873 fileUri: message.uri); | 2878 fileUri: message.uri); |
2874 } | 2879 } |
2875 | 2880 |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3325 if (starToken == null) { | 3330 if (starToken == null) { |
3326 return AsyncMarker.Async; | 3331 return AsyncMarker.Async; |
3327 } else { | 3332 } else { |
3328 assert(identical(starToken.stringValue, "*")); | 3333 assert(identical(starToken.stringValue, "*")); |
3329 return AsyncMarker.AsyncStar; | 3334 return AsyncMarker.AsyncStar; |
3330 } | 3335 } |
3331 } else { | 3336 } else { |
3332 return internalError("Unknown async modifier: $asyncToken"); | 3337 return internalError("Unknown async modifier: $asyncToken"); |
3333 } | 3338 } |
3334 } | 3339 } |
OLD | NEW |