Add variable support for new DDC async lowering #2471
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The Dart web team recently updated DDC's async lowering to be more similar to that of dart2js. The previous lowering did not correctly implement the Dart language's async/await semantics causing divergences in code's behavior between production and development.
The new lowering creates a state machine that simulates the control flow from the Dart code. This lowering flattens the async function's body removing the scopes established by the Dart code (normally JS's scopes act as a proxy for Dart's scopes). To get around this we introduce scope objects that we use to manually reconstruct the original scopes.
For debugging purposes we want to make all the variables in these scope objects available as they are all user-declared variables in the source code. So to achieve this we unpack the available scope objects into the set of available variables (and hide the scope objects). DDC ensures that the names of the properties within the scope object match those used in the source code.
Fixes #2469