| 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 | 8 show |
| 9 FastaMessage, | 9 FastaMessage, |
| 10 codeConstFieldWithoutInitializer, | 10 codeConstFieldWithoutInitializer, |
| (...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 push(new KernelLogicalExpression(receiver, token.stringValue, argument)); | 790 push(new KernelLogicalExpression(receiver, token.stringValue, argument)); |
| 791 } | 791 } |
| 792 | 792 |
| 793 /// Handle `a ?? b`. | 793 /// Handle `a ?? b`. |
| 794 void doIfNull(Token token) { | 794 void doIfNull(Token token) { |
| 795 Expression b = popForValue(); | 795 Expression b = popForValue(); |
| 796 Expression a = popForValue(); | 796 Expression a = popForValue(); |
| 797 VariableDeclaration variable = new VariableDeclaration.forValue(a); | 797 VariableDeclaration variable = new VariableDeclaration.forValue(a); |
| 798 push(makeLet( | 798 push(makeLet( |
| 799 variable, | 799 variable, |
| 800 new KernelConditionalExpression(buildIsNull(new VariableGet(variable)), | 800 new KernelConditionalExpression( |
| 801 b, new VariableGet(variable)))); | 801 buildIsNull(new VariableGet(variable), offsetForToken(token)), |
| 802 b, |
| 803 new VariableGet(variable)))); |
| 802 } | 804 } |
| 803 | 805 |
| 804 /// Handle `a?.b(...)`. | 806 /// Handle `a?.b(...)`. |
| 805 void doIfNotNull(Token token) { | 807 void doIfNotNull(Token token) { |
| 806 IncompleteSend send = pop(); | 808 IncompleteSend send = pop(); |
| 807 push(send.withReceiver(pop(), token.charOffset, isNullAware: true)); | 809 push(send.withReceiver(pop(), token.charOffset, isNullAware: true)); |
| 808 } | 810 } |
| 809 | 811 |
| 810 void doDotOrCascadeExpression(Token token) { | 812 void doDotOrCascadeExpression(Token token) { |
| 811 // TODO(ahe): Handle null-aware. | 813 // TODO(ahe): Handle null-aware. |
| (...skipping 2262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3074 bool isNullAware: false, | 3076 bool isNullAware: false, |
| 3075 bool isImplicitCall: false}) { | 3077 bool isImplicitCall: false}) { |
| 3076 if (constantExpressionRequired && !isConstantExpression) { | 3078 if (constantExpressionRequired && !isConstantExpression) { |
| 3077 return buildCompileTimeError("Not a constant expression.", offset); | 3079 return buildCompileTimeError("Not a constant expression.", offset); |
| 3078 } | 3080 } |
| 3079 if (isNullAware) { | 3081 if (isNullAware) { |
| 3080 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); | 3082 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); |
| 3081 return makeLet( | 3083 return makeLet( |
| 3082 variable, | 3084 variable, |
| 3083 new KernelConditionalExpression( | 3085 new KernelConditionalExpression( |
| 3084 buildIsNull(new VariableGet(variable)), | 3086 buildIsNull(new VariableGet(variable), offset), |
| 3085 new NullLiteral(), | 3087 new NullLiteral(), |
| 3086 new MethodInvocation(new VariableGet(variable), name, arguments) | 3088 new MethodInvocation(new VariableGet(variable), name, arguments) |
| 3087 ..fileOffset = offset)); | 3089 ..fileOffset = offset)); |
| 3088 } else { | 3090 } else { |
| 3089 return new KernelMethodInvocation(receiver, name, arguments, | 3091 return new KernelMethodInvocation(receiver, name, arguments, |
| 3090 isImplicitCall: isImplicitCall) | 3092 isImplicitCall: isImplicitCall) |
| 3091 ..fileOffset = offset; | 3093 ..fileOffset = offset; |
| 3092 } | 3094 } |
| 3093 } | 3095 } |
| 3094 | 3096 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3162 } | 3164 } |
| 3163 | 3165 |
| 3164 Expression buildSimpleRead(); | 3166 Expression buildSimpleRead(); |
| 3165 | 3167 |
| 3166 Expression buildForEffect(); | 3168 Expression buildForEffect(); |
| 3167 | 3169 |
| 3168 Expression buildAssignment(Expression value, {bool voidContext: false}) { | 3170 Expression buildAssignment(Expression value, {bool voidContext: false}) { |
| 3169 return makeInvalidWrite(value); | 3171 return makeInvalidWrite(value); |
| 3170 } | 3172 } |
| 3171 | 3173 |
| 3172 Expression buildNullAwareAssignment(Expression value, DartType type, | 3174 Expression buildNullAwareAssignment( |
| 3175 Expression value, DartType type, int offset, |
| 3173 {bool voidContext: false}) { | 3176 {bool voidContext: false}) { |
| 3174 return makeInvalidWrite(value); | 3177 return makeInvalidWrite(value); |
| 3175 } | 3178 } |
| 3176 | 3179 |
| 3177 Expression buildCompoundAssignment(Name binaryOperator, Expression value, | 3180 Expression buildCompoundAssignment(Name binaryOperator, Expression value, |
| 3178 {int offset: TreeNode.noOffset, | 3181 {int offset: TreeNode.noOffset, |
| 3179 bool voidContext: false, | 3182 bool voidContext: false, |
| 3180 Procedure interfaceTarget, | 3183 Procedure interfaceTarget, |
| 3181 bool isPreIncDec: false}) { | 3184 bool isPreIncDec: false}) { |
| 3182 return makeInvalidWrite(value); | 3185 return makeInvalidWrite(value); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3247 } else if (identical("/=", assignmentOperator)) { | 3250 } else if (identical("/=", assignmentOperator)) { |
| 3248 return accessor.buildCompoundAssignment(divisionName, value, | 3251 return accessor.buildCompoundAssignment(divisionName, value, |
| 3249 offset: offsetForToken(token), voidContext: voidContext); | 3252 offset: offsetForToken(token), voidContext: voidContext); |
| 3250 } else if (identical("<<=", assignmentOperator)) { | 3253 } else if (identical("<<=", assignmentOperator)) { |
| 3251 return accessor.buildCompoundAssignment(leftShiftName, value, | 3254 return accessor.buildCompoundAssignment(leftShiftName, value, |
| 3252 offset: offsetForToken(token), voidContext: voidContext); | 3255 offset: offsetForToken(token), voidContext: voidContext); |
| 3253 } else if (identical(">>=", assignmentOperator)) { | 3256 } else if (identical(">>=", assignmentOperator)) { |
| 3254 return accessor.buildCompoundAssignment(rightShiftName, value, | 3257 return accessor.buildCompoundAssignment(rightShiftName, value, |
| 3255 offset: offsetForToken(token), voidContext: voidContext); | 3258 offset: offsetForToken(token), voidContext: voidContext); |
| 3256 } else if (identical("??=", assignmentOperator)) { | 3259 } else if (identical("??=", assignmentOperator)) { |
| 3257 return accessor.buildNullAwareAssignment(value, const DynamicType(), | 3260 return accessor.buildNullAwareAssignment( |
| 3261 value, const DynamicType(), offsetForToken(token), |
| 3258 voidContext: voidContext); | 3262 voidContext: voidContext); |
| 3259 } else if (identical("^=", assignmentOperator)) { | 3263 } else if (identical("^=", assignmentOperator)) { |
| 3260 return accessor.buildCompoundAssignment(caretName, value, | 3264 return accessor.buildCompoundAssignment(caretName, value, |
| 3261 offset: offsetForToken(token), voidContext: voidContext); | 3265 offset: offsetForToken(token), voidContext: voidContext); |
| 3262 } else if (identical("|=", assignmentOperator)) { | 3266 } else if (identical("|=", assignmentOperator)) { |
| 3263 return accessor.buildCompoundAssignment(barName, value, | 3267 return accessor.buildCompoundAssignment(barName, value, |
| 3264 offset: offsetForToken(token), voidContext: voidContext); | 3268 offset: offsetForToken(token), voidContext: voidContext); |
| 3265 } else if (identical("~/=", assignmentOperator)) { | 3269 } else if (identical("~/=", assignmentOperator)) { |
| 3266 return accessor.buildCompoundAssignment(mustacheName, value, | 3270 return accessor.buildCompoundAssignment(mustacheName, value, |
| 3267 offset: offsetForToken(token), voidContext: voidContext); | 3271 offset: offsetForToken(token), voidContext: voidContext); |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3551 if (starToken == null) { | 3555 if (starToken == null) { |
| 3552 return AsyncMarker.Async; | 3556 return AsyncMarker.Async; |
| 3553 } else { | 3557 } else { |
| 3554 assert(identical(starToken.stringValue, "*")); | 3558 assert(identical(starToken.stringValue, "*")); |
| 3555 return AsyncMarker.AsyncStar; | 3559 return AsyncMarker.AsyncStar; |
| 3556 } | 3560 } |
| 3557 } else { | 3561 } else { |
| 3558 return internalError("Unknown async modifier: $asyncToken"); | 3562 return internalError("Unknown async modifier: $asyncToken"); |
| 3559 } | 3563 } |
| 3560 } | 3564 } |
| OLD | NEW |