| 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 kernel.transformations.continuation; | 5 library kernel.transformations.continuation; |
| 6 | 6 |
| 7 import 'dart:math' as math; | 7 import 'dart:math' as math; |
| 8 | 8 |
| 9 import '../ast.dart'; | 9 import '../ast.dart'; |
| 10 import '../core_types.dart'; | 10 import '../core_types.dart'; |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 // To: | 547 // To: |
| 548 // | 548 // |
| 549 // { | 549 // { |
| 550 // var :for-iterator = new StreamIterator(<stream-expression>); | 550 // var :for-iterator = new StreamIterator(<stream-expression>); |
| 551 // try { | 551 // try { |
| 552 // while (await :for-iterator.moveNext()) { | 552 // while (await :for-iterator.moveNext()) { |
| 553 // var <variable> = :for-iterator.current; | 553 // var <variable> = :for-iterator.current; |
| 554 // ... | 554 // ... |
| 555 // } | 555 // } |
| 556 // } finally { | 556 // } finally { |
| 557 // :for-iterator.cancel(); | 557 // await :for-iterator.cancel(); |
| 558 // } | 558 // } |
| 559 // } | 559 // } |
| 560 var iteratorVariable = new VariableDeclaration(':for-iterator', | 560 var iteratorVariable = new VariableDeclaration(':for-iterator', |
| 561 initializer: new ConstructorInvocation( | 561 initializer: new ConstructorInvocation( |
| 562 helper.streamIteratorConstructor, | 562 helper.streamIteratorConstructor, |
| 563 new Arguments(<Expression>[stmt.iterable], | 563 new Arguments(<Expression>[stmt.iterable], |
| 564 types: [const DynamicType()]))); | 564 types: [const DynamicType()]))); |
| 565 | 565 |
| 566 // await iterator.moveNext() | 566 // await iterator.moveNext() |
| 567 var condition = new AwaitExpression(new MethodInvocation( | 567 var condition = new AwaitExpression(new MethodInvocation( |
| 568 new VariableGet(iteratorVariable), | 568 new VariableGet(iteratorVariable), |
| 569 new Name('moveNext'), | 569 new Name('moveNext'), |
| 570 new Arguments(<Expression>[])))..fileOffset = stmt.fileOffset; | 570 new Arguments(<Expression>[])))..fileOffset = stmt.fileOffset; |
| 571 | 571 |
| 572 // var <variable> = iterator.current; | 572 // var <variable> = iterator.current; |
| 573 var valueVariable = stmt.variable; | 573 var valueVariable = stmt.variable; |
| 574 valueVariable.initializer = new PropertyGet( | 574 valueVariable.initializer = new PropertyGet( |
| 575 new VariableGet(iteratorVariable), new Name('current')); | 575 new VariableGet(iteratorVariable), new Name('current')); |
| 576 valueVariable.initializer.parent = valueVariable; | 576 valueVariable.initializer.parent = valueVariable; |
| 577 | 577 |
| 578 var whileBody = new Block(<Statement>[valueVariable, stmt.body]); | 578 var whileBody = new Block(<Statement>[valueVariable, stmt.body]); |
| 579 var tryBody = new WhileStatement(condition, whileBody); | 579 var tryBody = new WhileStatement(condition, whileBody); |
| 580 | 580 |
| 581 // iterator.cancel(); | 581 // iterator.cancel(); |
| 582 var tryFinalizer = new ExpressionStatement(new MethodInvocation( | 582 var tryFinalizer = new ExpressionStatement(new AwaitExpression( |
| 583 new VariableGet(iteratorVariable), | 583 new MethodInvocation(new VariableGet(iteratorVariable), |
| 584 new Name('cancel'), | 584 new Name('cancel'), new Arguments(<Expression>[])))); |
| 585 new Arguments(<Expression>[]))); | |
| 586 | 585 |
| 587 var tryFinally = new TryFinally(tryBody, tryFinalizer); | 586 var tryFinally = new TryFinally(tryBody, tryFinalizer); |
| 588 | 587 |
| 589 var block = new Block(<Statement>[iteratorVariable, tryFinally]); | 588 var block = new Block(<Statement>[iteratorVariable, tryFinally]); |
| 590 block.accept(this); | 589 block.accept(this); |
| 591 } else { | 590 } else { |
| 592 stmt.iterable = expressionRewriter.rewrite(stmt.iterable, statements) | 591 stmt.iterable = expressionRewriter.rewrite(stmt.iterable, statements) |
| 593 ..parent = stmt; | 592 ..parent = stmt; |
| 594 stmt.body = visitDelimited(stmt.body)..parent = stmt; | 593 stmt.body = visitDelimited(stmt.body)..parent = stmt; |
| 595 statements.add(stmt); | 594 statements.add(stmt); |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 coreTypes.getMember('dart:core', '_SyncIterable', ''), | 913 coreTypes.getMember('dart:core', '_SyncIterable', ''), |
| 915 coreTypes.getMember('dart:async', '_StreamIterator', ''), | 914 coreTypes.getMember('dart:async', '_StreamIterator', ''), |
| 916 coreTypes.getMember('dart:async', 'Future', 'microtask'), | 915 coreTypes.getMember('dart:async', 'Future', 'microtask'), |
| 917 coreTypes.getMember('dart:async', '_AsyncStarStreamController', ''), | 916 coreTypes.getMember('dart:async', '_AsyncStarStreamController', ''), |
| 918 coreTypes.getTopLevelMember('dart:async', '_asyncThenWrapperHelper'), | 917 coreTypes.getTopLevelMember('dart:async', '_asyncThenWrapperHelper'), |
| 919 coreTypes.getTopLevelMember('dart:async', '_asyncErrorWrapperHelper'), | 918 coreTypes.getTopLevelMember('dart:async', '_asyncErrorWrapperHelper'), |
| 920 coreTypes.getTopLevelMember('dart:async', '_awaitHelper'), | 919 coreTypes.getTopLevelMember('dart:async', '_awaitHelper'), |
| 921 coreTypes); | 920 coreTypes); |
| 922 } | 921 } |
| 923 } | 922 } |
| OLD | NEW |