| 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 /// A library to help transform compounds and null-aware accessors into | 5 /// A library to help transform compounds and null-aware accessors into |
| 6 /// let expressions. | 6 /// let expressions. |
| 7 library kernel.frontend.accessors; | 7 library kernel.frontend.accessors; |
| 8 | 8 |
| 9 import '../ast.dart'; | 9 import '../ast.dart'; |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 _makeWrite(value, voidContext), new NullLiteral(), type)); | 35 _makeWrite(value, voidContext), new NullLiteral(), type)); |
| 36 } | 36 } |
| 37 var tmp = new VariableDeclaration.forValue(_makeRead()); | 37 var tmp = new VariableDeclaration.forValue(_makeRead()); |
| 38 return _finish(makeLet( | 38 return _finish(makeLet( |
| 39 tmp, | 39 tmp, |
| 40 new ConditionalExpression(buildIsNull(new VariableGet(tmp)), | 40 new ConditionalExpression(buildIsNull(new VariableGet(tmp)), |
| 41 _makeWrite(value, voidContext), new VariableGet(tmp), type))); | 41 _makeWrite(value, voidContext), new VariableGet(tmp), type))); |
| 42 } | 42 } |
| 43 | 43 |
| 44 Expression buildCompoundAssignment(Name binaryOperator, Expression value, | 44 Expression buildCompoundAssignment(Name binaryOperator, Expression value, |
| 45 {bool voidContext: false, Procedure interfaceTarget}) { | 45 {int offset: TreeNode.noOffset, |
| 46 bool voidContext: false, |
| 47 Procedure interfaceTarget}) { |
| 46 return _finish(_makeWrite( | 48 return _finish(_makeWrite( |
| 47 builtBinary = | 49 builtBinary = makeBinary( |
| 48 makeBinary(_makeRead(), binaryOperator, interfaceTarget, value), | 50 _makeRead(), binaryOperator, interfaceTarget, value, |
| 51 offset: offset), |
| 49 voidContext)); | 52 voidContext)); |
| 50 } | 53 } |
| 51 | 54 |
| 52 Expression buildPrefixIncrement(Name binaryOperator, | 55 Expression buildPrefixIncrement(Name binaryOperator, |
| 53 {bool voidContext: false, Procedure interfaceTarget}) { | 56 {int offset: TreeNode.noOffset, |
| 57 bool voidContext: false, |
| 58 Procedure interfaceTarget}) { |
| 54 return buildCompoundAssignment(binaryOperator, new IntLiteral(1), | 59 return buildCompoundAssignment(binaryOperator, new IntLiteral(1), |
| 55 voidContext: voidContext, interfaceTarget: interfaceTarget); | 60 offset: offset, |
| 61 voidContext: voidContext, |
| 62 interfaceTarget: interfaceTarget); |
| 56 } | 63 } |
| 57 | 64 |
| 58 Expression buildPostfixIncrement(Name binaryOperator, | 65 Expression buildPostfixIncrement(Name binaryOperator, |
| 59 {bool voidContext: false, Procedure interfaceTarget}) { | 66 {int offset: TreeNode.noOffset, |
| 67 bool voidContext: false, |
| 68 Procedure interfaceTarget}) { |
| 60 if (voidContext) { | 69 if (voidContext) { |
| 61 return buildPrefixIncrement(binaryOperator, | 70 return buildPrefixIncrement(binaryOperator, offset: offset, |
| 62 voidContext: true, interfaceTarget: interfaceTarget); | 71 voidContext: true, interfaceTarget: interfaceTarget); |
| 63 } | 72 } |
| 64 var value = new VariableDeclaration.forValue(_makeRead()); | 73 var value = new VariableDeclaration.forValue(_makeRead()); |
| 65 valueAccess() => new VariableGet(value); | 74 valueAccess() => new VariableGet(value); |
| 66 var dummy = new VariableDeclaration.forValue(_makeWrite( | 75 var dummy = new VariableDeclaration.forValue(_makeWrite( |
| 67 builtBinary = makeBinary( | 76 builtBinary = makeBinary(valueAccess(), binaryOperator, interfaceTarget, |
| 68 valueAccess(), binaryOperator, interfaceTarget, new IntLiteral(1)), | 77 new IntLiteral(1), offset: offset), |
| 69 true)); | 78 true)); |
| 70 return _finish(makeLet(value, makeLet(dummy, valueAccess()))); | 79 return _finish(makeLet(value, makeLet(dummy, valueAccess()))); |
| 71 } | 80 } |
| 72 | 81 |
| 73 Expression _makeSimpleRead() => _makeRead(); | 82 Expression _makeSimpleRead() => _makeRead(); |
| 74 | 83 |
| 75 Expression _makeSimpleWrite(Expression value, bool voidContext) { | 84 Expression _makeSimpleWrite(Expression value, bool voidContext) { |
| 76 return _makeWrite(value, voidContext); | 85 return _makeWrite(value, voidContext); |
| 77 } | 86 } |
| 78 | 87 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 _makeWrite(Expression value, bool voidContext) => makeInvalidWrite(value); | 402 _makeWrite(Expression value, bool voidContext) => makeInvalidWrite(value); |
| 394 | 403 |
| 395 Expression _finish(Expression body) => makeLet(value, body); | 404 Expression _finish(Expression body) => makeLet(value, body); |
| 396 } | 405 } |
| 397 | 406 |
| 398 Expression makeLet(VariableDeclaration variable, Expression body) { | 407 Expression makeLet(VariableDeclaration variable, Expression body) { |
| 399 if (variable == null) return body; | 408 if (variable == null) return body; |
| 400 return new Let(variable, body); | 409 return new Let(variable, body); |
| 401 } | 410 } |
| 402 | 411 |
| 403 Expression makeBinary(Expression left, Name operator, Procedure interfaceTarget, | 412 Expression makeBinary( |
| 404 Expression right) { | 413 Expression left, Name operator, Procedure interfaceTarget, Expression right, |
| 414 {int offset: TreeNode.noOffset}) { |
| 405 return new MethodInvocation( | 415 return new MethodInvocation( |
| 406 left, operator, new Arguments(<Expression>[right]), interfaceTarget); | 416 left, operator, new Arguments(<Expression>[right]), interfaceTarget) |
| 417 ..fileOffset = offset; |
| 407 } | 418 } |
| 408 | 419 |
| 409 final Name _equalOperator = new Name('=='); | 420 final Name _equalOperator = new Name('=='); |
| 410 | 421 |
| 411 Expression buildIsNull(Expression value) { | 422 Expression buildIsNull(Expression value, {int offset: TreeNode.noOffset}) { |
| 412 return makeBinary(value, _equalOperator, null, new NullLiteral()); | 423 return makeBinary(value, _equalOperator, null, new NullLiteral(), |
| 424 offset: offset); |
| 413 } | 425 } |
| 414 | 426 |
| 415 VariableDeclaration makeOrReuseVariable(Expression value) { | 427 VariableDeclaration makeOrReuseVariable(Expression value) { |
| 416 // TODO: Devise a way to remember if a variable declaration was reused | 428 // TODO: Devise a way to remember if a variable declaration was reused |
| 417 // or is fresh (hence needs a let binding). | 429 // or is fresh (hence needs a let binding). |
| 418 return new VariableDeclaration.forValue(value); | 430 return new VariableDeclaration.forValue(value); |
| 419 } | 431 } |
| 420 | 432 |
| 421 Expression wrapInvalid(Expression e) { | 433 Expression wrapInvalid(Expression e) { |
| 422 return new Let(new VariableDeclaration.forValue(e), new InvalidExpression()); | 434 return new Let(new VariableDeclaration.forValue(e), new InvalidExpression()); |
| 423 } | 435 } |
| OLD | NEW |