Giter Site home page Giter Site logo

googlearchive / async_await_transformer_deprecated Goto Github PK

View Code? Open in Web Editor NEW
3.0 21.0 7.0 243 KB

Deprecated. Use Dart 1.9+ for native support for async/await

Home Page: https://www.dartlang.org/guides/language/language-tour#asynchrony-support

License: BSD 3-Clause "New" or "Revised" License

Dart 100.00%

async_await_transformer_deprecated's Introduction

async-await transformer DEPRECATED

Use Dart 1.9+ for native support for async/await/sync/async/yield.**

A prototype (and in progress) implementation of async/await in Dart, via CPS translation.

This transformer is useful for trying async/await with dart2js. The Dart VM natively supports async and await. If you are writing Dart code that runs only in the VM, you do not need this transformer.

How to use

Add this to your pubspec.yaml file:

dependencies:
  async_await:
    git: https://github.com/dart-lang/async_await.git
transformers:
- async_await

Import dart:async in your Dart file:

import 'dart:async';

What works

  • async
  • await
  • await for

What doesn't yet work

See also the open issues.

  • Stack traces are not according to the spec

async_await_transformer_deprecated's People

Contributors

filiph avatar headinthebox avatar kmillikin avatar kwalrath avatar mlippautz avatar munificent avatar sethladd avatar stevemessick avatar xxgreg avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

async_await_transformer_deprecated's Issues

Missing productions

Here's the ones I've been running into most frequently in pub:

  • PrefixExpression
  • IsExpression
  • EmptyStatement
  • AssertStatement

Error reporting is very, very bad

Error reporting is in terms of character position in the the original input. This should, at least, be converted into line/column. And better would be to print the context of the error.

Error: The null object does not have a getter 'lexeme'.

I've been using the async/await syntax which is awesome, but I am getting this error on build. Any ideas?

Transform AsyncAwait on aristadart|lib/components/admin/model.dart threw error: The null object does not have a getter 'lexeme'.

NoSuchMethodError: method not found: 'lexeme'
Receiver: null
Arguments: []
dart:core-patch/object_patch.dart 45          Object.noSuchMethod
package:async_await/src/xform.dart 854        AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892        AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003  ForEachStatement.accept
package:async_await/src/xform.dart 490        AsyncTransformer.visit
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 829        AsyncTransformer.visitExpressionStatement.<fn>.<fn>
package:async_await/src/xform.dart 2040       AsyncTransformer.visitMethodInvocation.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1892       AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2038       AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1872       AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 2034       AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 827        AsyncTransformer.visitExpressionStatement.<fn>
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1155       AsyncTransformer.visitIfStatement.<fn>.<fn>
package:async_await/src/xform.dart 2071       AsyncTransformer.visitPrefixExpression.<fn>.<fn>
package:async_await/src/xform.dart 1876       AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 2070       AsyncTransformer.visitPrefixExpression.<fn>
package:async_await/src/xform.dart 1151       AsyncTransformer.visitIfStatement.<fn>
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530       AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496       AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487       AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1701       AsyncTransformer._reifyAwaitContinuation
package:async_await/src/xform.dart 1746       AsyncTransformer.visitAwaitExpression.<fn>.<fn>
package:async_await/src/xform.dart 2046       AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1898       AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1975       AsyncTransformer.visitSimpleStringLiteral.<fn>
package:async_await/src/xform.dart 1913       AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1876       AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 1913       AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1872       AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1917       AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2045       AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 1737       AsyncTransformer.visitAwaitExpression.<fn>
package:async_await/src/xform.dart 1486       AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511       AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527       AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692        AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696        AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 636        AsyncTransformer.visitBlockFunctionBody
package:analyzer/src/generated/ast.dart 2902  BlockFunctionBody.accept
package:async_await/src/xform.dart 490        AsyncTransformer.visit
package:async_await/src/compiler.dart 45      compile
package:async_await/async_await.dart 10       compile
package:async_await/transformer.dart 25       AsyncAwaitTransformer.apply.<fn>
dart:async/zone.dart 1155                     _RootZone.runUnary
dart:async/future_impl.dart 484               _Future._propagateToListeners.handleValueCallback
dart:async/future_impl.dart 567               _Future._propagateToListeners
dart:async/future_impl.dart 358               _Future._completeWithValue
dart:async/future_impl.dart 412               _Future._asyncComplete.<fn>
dart:async/schedule_microtask.dart 41         _asyncRunCallbackLoop
dart:async/schedule_microtask.dart 48         _asyncRunCallback
dart:isolate-patch/isolate_patch.dart 84      _runPendingImmediateCallback
dart:isolate-patch/isolate_patch.dart 131     _RawReceivePortImpl._handleMessage

dart:core                                     Object.noSuchMethod
package:async_await/src/xform.dart 854        AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892        AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003  ForEachStatement.accept
package:async_await/src/xform.dart 490        AsyncTransformer.visit
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 829        AsyncTransformer.visitExpressionStatement.<fn>.<fn>
package:async_await/src/xform.dart 2040       AsyncTransformer.visitMethodInvocation.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1892       AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2038       AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1872       AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 2034       AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 827        AsyncTransformer.visitExpressionStatement.<fn>
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1155       AsyncTransformer.visitIfStatement.<fn>.<fn>
package:async_await/src/xform.dart 2071       AsyncTransformer.visitPrefixExpression.<fn>.<fn>
package:async_await/src/xform.dart 1876       AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 2070       AsyncTransformer.visitPrefixExpression.<fn>
package:async_await/src/xform.dart 1151       AsyncTransformer.visitIfStatement.<fn>
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530       AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496       AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487       AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1701       AsyncTransformer._reifyAwaitContinuation
package:async_await/src/xform.dart 1746       AsyncTransformer.visitAwaitExpression.<fn>.<fn>
package:async_await/src/xform.dart 2046       AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1898       AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1975       AsyncTransformer.visitSimpleStringLiteral.<fn>
package:async_await/src/xform.dart 1913       AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1876       AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 1913       AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1872       AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1917       AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2045       AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 1737       AsyncTransformer.visitAwaitExpression.<fn>
package:async_await/src/xform.dart 1486       AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511       AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527       AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690        AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692        AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696        AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 636        AsyncTransformer.visitBlockFunctionBody
package:analyzer/src/generated/ast.dart 2902  BlockFunctionBody.accept
package:async_await/src/xform.dart 490        AsyncTransformer.visit
package:async_await/src/compiler.dart 45      compile
package:async_await/async_await.dart 10       compile
package:async_await/transformer.dart 25       AsyncAwaitTransformer.apply.<fn>
dart:isolate 

async_await doesn't like enums

My async-await program runs fine unless I add an enum to my program. The enum looks like this:

enum Color {
  red,
  blue,
  green
}

If I remove the async-await code and the dependency on async_await (leaving in the enum), the program compiles and executes fine.

Here's what happens when I have both async-await and enum in a program that I'm compiling to JS:

Build error:Build completed with 1 errors.
Transform AsyncAwait on web_async_enum|web/main.dart threw error: Compilation error:
<unknown source>(395..398): Expected a method, getter, setter or operator declaration

<unknown source>(395..398): Unexpected token 'enum'
<unknown source>(406..406): Expected a method, getter, setter or operator declaration
<unknown source>(406..406): Expected a method, getter, setter or operator declaration
<unknown source>(406..406): Unexpected token '{'
<unknown source>(410..412): Variables must be declared using the keywords 'const', 'final', 'var' or a type name
<unknown source>(425..429): Expected to find ';'
<unknown source>(431..431): Expected a method, getter, setter or operator declaration
<unknown source>(431..431): Unexpected token '}'
package:async_await/async_await.dart 11    compile.<fn>
package:async_await/src/compiler.dart 34   compile
package:async_await/async_await.dart 10    compile
package:async_await/transformer.dart 25    AsyncAwaitTransformer.apply.<fn>
dart:async/zone.dart 1155                  _RootZone.runUnary
dart:async/future_impl.dart 484            _Future._propagateToListeners.handleValueCallback
dart:async/future_impl.dart 567            _Future._propagateToListeners
dart:async/future_impl.dart 358            _Future._completeWithValue
dart:async/future_impl.dart 412            _Future._asyncComplete.<fn>
dart:async/schedule_microtask.dart 41      _asyncRunCallbackLoop
dart:async/schedule_microtask.dart 48      _asyncRunCallback
dart:isolate-patch/isolate_patch.dart 84   _runPendingImmediateCallback
dart:isolate-patch/isolate_patch.dart 131  _RawReceivePortImpl._handleMessage

package:async_await/async_await.dart 11   compile.<fn>
package:async_await/src/compiler.dart 34  compile
package:async_await/async_await.dart 10   compile
package:async_await/transformer.dart 25   AsyncAwaitTransformer.apply.<fn>
dart:isolate                              _RawReceivePortImpl._handleMessage

I'm using the latest Dev channel Dart Editor (Dart Editor version 1.9.0.dev_00_00 (DEV)
Dart SDK version 1.9.0-dev.0.0), starting with the "Web Application" project template. Besides the async_await transformer that I added, the template uses another transformer (script_inliner).

Can delete "var" in iterations

The following code:

f1() async {
  await f2(() {
    for (var x in xs) {}
  });
}

compiles to the following output:

f1() {
  final completer0 = new Completer();
  scheduleMicrotask(() {
    try {
      new Future.value(f2((() {
        for (x in xs) {
        }
      }))).then((x0) {
        try {
          x0;
          completer0.complete();
        } catch (e0, s0) {
          completer0.completeError(e0, s0);
        }
      }, onError: completer0.completeError);
    } catch (e, s) {
      completer0.completeError(e, s);
    }
  });
  return completer0.future;
}

Note that for (x in xs) in the output is missing "var".

Switch statement compilation causes analysis warnings

Currently, switch statements are compiled like so:

switch (options['verbosity']) {
  case 'normal':
    log.verbosity = log.Verbosity.NORMAL;
    break0();
  case 'io':
    log.verbosity = log.Verbosity.IO;
    break0();
  case 'solver':
    log.verbosity = log.Verbosity.SOLVER;
    break0();
  case 'all':
    log.verbosity = log.Verbosity.ALL;
    break0();
  default:
    join5() {
      break0();
    }
    if (options['verbose']) {
      log.verbosity = log.Verbosity.ALL;
      join5();
    } else {
      join5();
    }
}

The fact that the clauses don't use literal break or return statements the analyzer to emit errors.

Preserve (at least some) whitespace in output

Right now, the compiler output is all one very long line. That makes it hard to read and hard to track down errors that include line numbers.

It would be swell to produce output with some at least rudimentary whitespace formatting. We can run the output through dartfmt, but spawning a separate process for that is quite slow (and does a lot of redundant work since the compiler already has an AST).

Stack trace variables should be preserved in catch blocks

Currently if the source has a catch block that captures a stack trace, that stack trace and the variable that references it is omitted in the compiled output. For example:

main() async {
  try {
    throw 'oh no';
  } catch (error, stackTrace) {
    print("$error\n$stackTrace");
  }
}

is compiled to:

main() {
  final completer0 = new Completer();
  scheduleMicrotask(() {
    try {
      join0(x0) {
        completer0.complete(null);
      }
      finally0(cont0, v0) {
        cont0(v0);
      }
      catch0(error) {
        print("${error}\n${stackTrace}");
        finally0(join0, null);
      }
      try {
        catch0('oh no');
      } catch (e0) {
        catch0(e0);
      }
    } catch (e1) {
      completer0.completeError(e1);
    }
  });
  return completer0.future;
}

Note that the stackTrace variable is never defined. This is related to #49 and #50, but it's more severe since it can cause undefined variable errors.

"on TYPE catch" statements overwrite stack traces

The following program:

bar() {
  throw "error";
}

main() async {
  try {
    await bar();
    return true;
  } on FormatException catch (error) {
    return false;
  }
}

when compiled and run, produces the following stack trace:

Unhandled exception:
Uncaught Error: error
Stack Trace:
#0      main.<anonymous closure>.catch0 (file:///home/nweiz/goog/dart/dart/test.out.dart:28:13)
#1      main.<anonymous closure> (file:///home/nweiz/goog/dart/dart/test.out.dart:44:15)
#2      _asyncRunCallback (dart:async/schedule_microtask.dart:48)

Note that this stack trace doesn't include bar(), where the exception is actually thrown. Inspecting the generated code shows that the exception is being rethrown without preserving stack trace information.

Deploy to pub.dartlang.org

We may not want to do this, which is fine. Can you close this issue, one way or another, with a resolution?

Doesn't include stackTrace parameter of catch clause

Currently, this:

foo() async {
  try {
    throw "oops";
  } catch (ex, stackTrace) {
    print(stackTrace);
  }
}

compiles to:

foo() {
  var result0 = new Completer();
  scheduleMicrotask(() {
    try {
      join1(_) {
        result0.complete(null);
      }
      finally2(cont3, v4) {
        cont3(v4);
      }
      catch5(ex) { // <--- No stackTrace
        print(stackTrace);
        finally2(join1, null);
      }
      try {
        catch5("oops");
      } catch (e6) {
        catch5(e6);
      }
    } catch (e7) {
      result0.completeError(e7);
    }
  });
  return result0.future;
}

Note that catch5(), which corresponds to the catch clause, is lacking the stackTrace parameter. Just in case it helps, an ideal (I think) output would be something like:

foo() {
  return new Future(() {
    throw "oops";
  }).catchError((ex, stackTrace) {
    print(stackTrace);
  });
}

Does not import dart:async

If the code does not import dart:async then it is not automatically imported and generates an error resolving Future.

Too many await cause an error

Having too many await in a function cause the compiler to crash, limit seen to be about 800:

C:\Users\admin\dart\test_for_var>pub build --trace --mode debug
Loading source assets...
Building test_for_var...
[Info from Dart2JS]:
Compiling test_for_var|web/main.dart...
[Error from Dart2JS]:
web\main.dart:
The compiler crashed when compiling this element.
The compiler is broken.

When compiling the above element, the compiler crashed. It is not
possible to tell if this is caused by a problem in your program or
not. Regardless, the compiler should not crash.

The Dart team would greatly appreciate if you would take a moment to
report this problem at http://dartbug.com/new.

Please include the following information:

* the name and version of your operating system,

* the Dart SDK build number (build number could not be determined), and

* the entire message you see here (including the full stack trace
  below as well as the source location above).

Couldn't parse VM stack trace line '#3      _CustomZone.runUnary (dart:async/zone.dart)'.
Stack trace:
#0      StackZoneSpecification._run (package:stack_trace/src/stack_zone_specification.dart:211)
#1      registerUnaryCallback.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:134)
#2      _rootRunUnary (dart:async/zone.dart:902)
#3      _CustomZone.runUnary (dart:async/zone.dart)
#4      _Future._propagateToListeners.handleError (dart:async/future_impl.dart:515)
...
...
#5      registerUnaryCallback.<anonymous closure>.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:134)
#6      StackZoneSpecification._run (package:stack_trace/src/stack_zone_specification.da#7      _Future._propagateToListeners (dart:async/future_impl.dart:570)
#8      _Future._completeWithValue (dart:async/future_impl.dart:358)
#9      _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:412)
#10     StackZoneSpecification._run (package:stack_trace/src/stack_zone_specification.dart:210)
#11     registerCallback.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:124)
#12     _rootRun (dart:async/zone.dart:895)
#13     _CustomZone.run (dart:async/zone.dart:796)
#14     _CustomZone.runGuarded (dart:async/zone.dart:704)
#15     _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:729)
#16     _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41)
#17     _asyncRunCallback (dart:async/schedule_microtask.dart:48)
#18     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:96)
#19     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:143)
package:stack_trace/src/chain.dart 148                                                                         Chain.terse
package:barback/src/errors.dart 128                                                                            _WrappedException.toString
dart:core                                                                                                      _StringBase._interpolate
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 64  BuildCommand.onRunTransformerCommand.<fn>.<fn>.<fn>
dart:async                                                                                                     _BroadcastStreamController.add
package:barback/src/graph/asset_cascade.dart 209                                                               AssetCascade.reportError
package:barback/src/graph/transform_node.dart 656                                                              TransformNode._runApply.<fn>
dart:isolate                                                                                                   _RawReceivePortImpl._handleMessage
===== asynchronous gap ===========================
dart:async                                                                                                     _StreamImpl.listen
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 63  BuildCommand.onRunTransformerCommand.<fn>.<fn>
dart:isolate                                                                                                   _RawReceivePortImpl._handleMessage
===== asynchronous gap ===========================
dart:async                                                                                                     _Future.then
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 62  BuildCommand.onRunTransformerCommand.<fn>
dart:isolate                                                                                                   _RawReceivePortImpl._handleMessage
===== asynchronous gap ===========================
dart:async                                                                                                       scheduleMicrotask
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 53    BuildCommand.onRunTransformerCommand
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\barback.dart 61  BarbackCommand.run
package:args/command_runner.dart 179                                                                             CommandRunner.runCommand.<fn>
dart:async                                                                                                       Future.Future.sync
package:args/command_runner.dart 132                                                                             CommandRunner.runCommand
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command_runner.dart 196  PubCommandRunner.runCommand.<fn>.join0.join1.break0.<fn>.<fn>
dart:async                                                                                                       Future.Future.sync
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\utils.dart 98            captureErrors.<fn>
package:stack_trace/src/chain.dart 78                                                                            Chain.capture
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\utils.dart 112           captureErrors
e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command_runner.dart 195  PubCommandRunner.runCommand.<fn>.join0.join1.break0.<fn>
dart:isolate                                                                                                     _RawReceivePortImpl._handleMessage
---- Log transcript ----
FINE: Pub 1.9.0-dev.8.0
IO  : Spawning "cmd /c ver" in C:\Users\darkangel\dart\test_for_var\.
IO  : Finished ver. Exit code 0.
    | stdout:
    | |
    | | Microsoft Windows [Version 6.2.9200]
    | Nothing output on stderr.
IO  : Deleting directory build.
FINE: Loading asset environment...
FINE: Loading package graph...
FINE: Loading package graph finished (0.1s).
FINE: Initializing barback...
FINE: Serving packages on localhost:0.
MSG : Loading source assets...
FINE: Providing sources for test_for_var|lib.
FINE: Loading source assets finished (0.0s).
FINE: Provided sources.
FINE: Loading transformers...
FINE: Transformer dependencies:
FINE: Loading transformers finished (0.0s).
FINE: Initializing barback finished (0.0s).
FINE: Loading asset environment finished (0.2s).
MSG : Building test_for_var...
FINE: Providing sources for test_for_var|web.
FINE: Bound "web" to localhost:0.
MSG : [Info from Dart2JS]:
    | Compiling test_for_var|web/main.dart...
ERR : [Error from Dart2JS]:
    | web\main.dart:
    | The compiler crashed when compiling this element.
ERR : Couldn't parse VM stack trace line '#3      _CustomZone.runUnary (dart:async/zone.dart)'.
    | Stack trace:
    | #0      StackZoneSpecification._run (package:stack_trace/src/stack_zone_specification.dart:211)
    | #1      registerUnaryCallback.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:134)
    | #2      _rootRunUnary (dart:async/zone.dart:902)
    | #3      _CustomZone.runUnary (dart:async/zone.dart)
    | #4      _Future._propagateToListeners.handleError (dart:async/future_impl.dart:515)
    | ...
    | ...
    | #5      registerUnaryCallback.<anonymous closure>.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:134)
    | #6      StackZoneSpecification._run (package:stack_trace/src/stack_zone_specification.da#7      _Future._propagateToListeners (dart:async/future_impl.dart:570)
    | #8      _Future._completeWithValue (dart:async/future_impl.dart:358)
    | #9      _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:412)
    | #10     StackZoneSpecification._run (package:stack_trace/src/stack_zone_specification.dart:210)
    | #11     registerCallback.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:124)
    | #12     _rootRun (dart:async/zone.dart:895)
    | #13     _CustomZone.run (dart:async/zone.dart:796)
    | #14     _CustomZone.runGuarded (dart:async/zone.dart:704)
    | #15     _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:729)
    | #16     _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41)
    | #17     _asyncRunCallback (dart:async/schedule_microtask.dart:48)
    | #18     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:96)
    | #19     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:143)
FINE: Exception type: FormatException
ERR : package:stack_trace/src/chain.dart 148                                                                         Chain.terse
    | package:barback/src/errors.dart 128                                                                            _WrappedException.toString
    | dart:core                                                                                                      _StringBase._interpolate
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 64  BuildCommand.onRunTransformerCommand.<fn>.<fn>.<fn>
    | dart:async                                                                                                     _BroadcastStreamController.add
    | package:barback/src/graph/asset_cascade.dart 209                                                               AssetCascade.reportError
    | package:barback/src/graph/transform_node.dart 656                                                              TransformNode._runApply.<fn>
    | dart:isolate                                                                                                   _RawReceivePortImpl._handleMessage
    | ===== asynchronous gap ===========================
    | dart:async                                                                                                     _StreamImpl.listen
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 63  BuildCommand.onRunTransformerCommand.<fn>.<fn>
    | dart:isolate                                                                                                   _RawReceivePortImpl._handleMessage
    | ===== asynchronous gap ===========================
    | dart:async                                                                                                     _Future.then
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 62  BuildCommand.onRunTransformerCommand.<fn>
    | dart:isolate                                                                                                   _RawReceivePortImpl._handleMessage
    | ===== asynchronous gap ===========================
    | dart:async                                                                                                       scheduleMicrotask
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\build.dart 53    BuildCommand.onRunTransformerCommand
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command\barback.dart 61  BarbackCommand.run
    | package:args/command_runner.dart 179                                                                             CommandRunner.runCommand.<fn>
    | dart:async                                                                                                       Future.Future.sync
    | package:args/command_runner.dart 132                                                                             CommandRunner.runCommand
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command_runner.dart 196  PubCommandRunner.runCommand.<fn>.join0.join1.break0.<fn>.<fn>

    | dart:async                                                                                                       Future.Future.sync
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\utils.dart 98            captureErrors.<fn>
    | package:stack_trace/src/chain.dart 78                                                                            Chain.capture
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\utils.dart 112           captureErrors
    | e:\b\build\slave\dart-editor-win-dev\build\dart\sdk\lib\_internal\pub_generated\lib\src\command_runner.dart 195  PubCommandRunner.runCommand.<fn>.join0.join1.break0.<fn>
    | dart:isolate                                                                                                     _RawReceivePortImpl._handleMessage
---- End log transcript ----

Code:

// Copyright (c) 2015, <your name>. All rights reserved. Use of this source code
// is governed by a BSD-style license that can be found in the LICENSE file.

import 'dart:async';

Future<dynamic> f() {
  return new Future.value();
}

int func(a) async {
  await f();
  print(a);
  return a+1;
}

main() async {
  print('Hello world');
  var a = await func(0);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
  a = await func(a);
}

Breaks workflow in Dartium

If the transfomer is configured as suggested in the README Dartium can no longer load the sources (dart), i.e. the tranformer is working only when compiling to JS but seem to be breaking Dartium workflow (cange, reload).

Is this by design (i.e. we need to enable it in transformer list only when compiling JS)?

Nested for loops never terminate

Consider the following Dart program:

import 'dart:async';

main() async {
  for (var a in [0]) {
    for (var b in [1]) {
      print("a: $a, b: $b");
      await new Future.value();
    }
  }
  print("done");
}

This is compiled to

main() {
  final completer0 = new Completer();
  scheduleMicrotask(() {
    try {
      var it0 = [
          0
      ].iterator;
      break0() {
        print("done");
        completer0.complete();
      }
      var trampoline0;
      continue0() {
        trampoline0 = null;
        if (it0.moveNext()) {
          var a = it0.current;
          var it1 = [
              1
          ].iterator;
          break1() {
            trampoline0 = continue0;
          }
          var trampoline1;
          continue1() {
            trampoline1 = null;
            if (it1.moveNext()) {
              var b = it1.current;
              print("a: ${a}, b: ${b}");
              new Future.value().then((x0) {
                trampoline1 = () {
                  trampoline1 = null;
                  try {
                    x0;
                    trampoline1 = continue1;
                  } catch (e0, s0) {
                    completer0.completeError(e0, s0);
                  }
                };
                do trampoline1(); while (trampoline1 != null);
              }, onError: completer0.completeError);
            } else {
              break1();
            }
          }
          trampoline1 = continue1;
          do trampoline1(); while (trampoline1 != null);
        } else {
          break0();
        }
      }
      trampoline0 = continue0;
      do trampoline0(); while (trampoline0 != null);
    } catch (e, s) {
      completer0.completeError(e, s);
    }
  });
  return completer0.future;
}

I haven't looked at the generated code enough to know what's going wrong, but when I run it it prints a: 0, b: 1 and then terminates; the print("done") line is never reached.

try/catch/finally is asynchronous, but it should not be

The current translation of try/catch/finally is

finally_(continuation) {
  /* translation of finally block */
  return continuation();
}
new Future.sync(() { /* translation of try body */ })
    .catchError((e, s) { /* translation of catch block */ })
    .then(finally_, (e) => finally_(() => throw e));

Both .catchError and .then are asynchronous, so not what we want here. In particular, if a finally block throws inside a loop, there is nobody listening for the error.

To fix it, we will have to use try/catch in the translation.

This breaks the pub tests, @munificent and @nex3. I'll have a fix tomorrow.

Captured errors' stack traces should be forwarded

Currently when an error is captured, its stack trace isn't forwarded. For example, the following source:

main() async {
  error();
}

void error() => throw 'oh no';

is translated to

main() {
  final completer0 = new Completer();
  scheduleMicrotask(() {
    try {
      error();
      completer0.complete(null);
    } catch (e0) {
      completer0.completeError(e0);
    }
  });
  return completer0.future;
}

void error() => throw 'oh no';

The catch clause should look like this instead:

} catch (e0, s0) {
  completer0.completeError(e0, s0);
}

This severely affects debugability of the generated code.

Latest compiler breaks on pub

I tried taking a drop of the latest compiler (b6ad461) into the repo, but it fails on:

Async compile failed on /Users/rnystrom/dev/dart/dart/sdk/lib/_internal/pub/bin/pub.dart:
An error occured while parsing (MISSING_IDENTIFIER).
Async compile failed on /Users/rnystrom/dev/dart/dart/sdk/lib/_internal/pub/lib/src/command/build.dart:
An error occured while parsing (MISSING_IDENTIFIER).
Async compile failed on /Users/rnystrom/dev/dart/dart/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart:
An error occured while parsing (MISSING_IDENTIFIER).
Async compile failed on /Users/rnystrom/dev/dart/dart/sdk/lib/_internal/pub/lib/src/command/serve.dart:
An error occured while parsing (MISSING_IDENTIFIER).
Async compile failed on /Users/rnystrom/dev/dart/dart/sdk/lib/_internal/pub/lib/src/executable.dart:
An error occured while parsing (MISSING_IDENTIFIER).

Does this transform packages?

I have a package that uses async and is used in another project but dosent seem to be converting the async stuff for the package. Is this by design?

Thrown errors should have stack traces

Currently a throw in the source code will be translated to output that doesn't include a stack trace. For example:

main() async => throw 'oh no';

is translated to

main() {
  final completer0 = new Completer();
  scheduleMicrotask(() {
    try {
      completer0.completeError('oh no');
    } catch (e0) {
      completer0.completeError(e0);
    }
  });
  return completer0.future;
}

Note that completer0.completeError('oh no'); doesn't include a stack trace. One possible translation (in combination with #49) would be:

main() {
  final completer0 = new Completer();
  scheduleMicrotask(() {
    try {
      throw 'oh no';
    } catch (e0, s0) {
      completer0.completeError(e0, s0);
    }
  });
  return completer0.future;
}

Errors are swallowed by finally block

Consider:

Future foo() async {
  try {
    await new Future.error("error!");
  } finally {
    print("finally");
  }
}

main() {
  foo().catchError((error) {
    print("caught $error");
  });
}

This prints "finally" (good), but not "caught error!" (bad).

This is against master with the Completer desugaring. I haven't tried the branch that compiles to .then() but it wouldn't surprise me if that fixes this.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.