Chromium Code Reviews| Index: pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart |
| diff --git a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart |
| index 277966315b3c6ee24c63c05a598664cff5034e28..cfd3994ebebe2b41c36db3b79d0892131ae9fcc0 100644 |
| --- a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart |
| +++ b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart |
| @@ -93,6 +93,12 @@ class BuilderContext<T> { |
| variables.add(decl); |
| } |
| + /// Creates an [Identifier] referring to the given variable. |
| + Expression makeVariableAccess(tree.Variable variable) { |
| + return new Identifier(getVariableName(variable)) |
| + ..element = variable.element; |
| + } |
| + |
| /// Generates a name for the given variable and synthesizes an element for it, |
| /// if necessary. |
| String getVariableName(tree.Variable variable) { |
| @@ -536,7 +542,7 @@ class ASTEmitter |
| } |
| // Emit a variable declaration if we are required to do so. |
| - // This is to ensure that a fresh closure variable is created. |
| + // For captured variables, this ensures that a fresh variable is created. |
| if (stmt.isDeclaration) { |
| assert(isFirstOccurrence); |
| assert(isDeclaredHere); |
| @@ -550,7 +556,7 @@ class ASTEmitter |
| } |
| context.addStatement(new ExpressionStatement(makeAssignment( |
| - visitVariable(stmt.variable, context), |
| + context.makeVariableAccess(stmt.variable), |
| definition))); |
| visitStatement(stmt.next, context); |
| } |
| @@ -831,10 +837,9 @@ class ASTEmitter |
| } |
| @override |
| - Expression visitVariable(tree.Variable exp, |
| - BuilderContext<Statement> context) { |
| - return new Identifier(context.getVariableName(exp)) |
| - ..element = exp.element; |
| + Expression visitVariableUse(tree.VariableUse exp, |
| + BuilderContext<Statement> context) { |
| + return context.makeVariableAccess(exp.variable); |
| } |
| FunctionExpression makeSubFunction(tree.FunctionDefinition function, |
| @@ -1233,13 +1238,16 @@ class UnshadowParameters extends tree.RecursiveVisitor { |
| tree.Variable newParam = new tree.Variable(definition.element, |
| param.element); |
| definition.parameters[i] = newParam; |
| - definition.body = new tree.Assign(param, newParam, definition.body); |
| + definition.body = new tree.Assign(param, new tree.VariableUse(newParam), |
| + definition.body); |
| newParam.writeCount = 1; // Being a parameter counts as a write. |
| + param.writeCount--; // Not a parameter anymore. |
| } |
| } |
| } |
| - visitVariable(tree.Variable variable) { |
| + @override |
| + invalidateMovingAssignment(tree.Variable variable) { |
|
Kevin Millikin (Google)
2015/02/27 12:17:18
This seems like a rename refactoring that went wro
asgerf
2015/02/27 12:20:53
Ah, thanks.
|
| if (shadowedParameters.contains(variable)) { |
| hasShadowedUse.add(variable); |
| } |