Chromium Code Reviews| Index: pkg/analyzer/lib/src/generated/resolver.dart |
| diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart |
| index acd47892a444250536510fdda020a12d1f7eb134..9c28f3e0a6efaba0b59802517f3015eaf17ba8ee 100644 |
| --- a/pkg/analyzer/lib/src/generated/resolver.dart |
| +++ b/pkg/analyzer/lib/src/generated/resolver.dart |
| @@ -12,6 +12,7 @@ import 'package:analyzer/dart/ast/visitor.dart'; |
| import 'package:analyzer/dart/element/element.dart'; |
| import 'package:analyzer/dart/element/type.dart'; |
| import 'package:analyzer/dart/element/visitor.dart'; |
| +import 'package:analyzer/src/dart/ast/ast.dart'; |
| import 'package:analyzer/src/dart/ast/token.dart'; |
| import 'package:analyzer/src/dart/ast/utilities.dart'; |
| import 'package:analyzer/src/dart/element/element.dart'; |
| @@ -12452,6 +12453,11 @@ class VariableResolverVisitor extends ScopedVisitor { |
| ExecutableElement _enclosingFunction; |
| /** |
| + * Information about local variables in the enclosing function or method. |
| + */ |
| + LocalVariableInfo _localVariableInfo; |
| + |
| + /** |
| * Initialize a newly created visitor to resolve the nodes in an AST node. |
| * |
| * [definingLibrary] is the element for the library containing the node being |
| @@ -12473,15 +12479,35 @@ class VariableResolverVisitor extends ScopedVisitor { |
| nameScope: nameScope); |
| @override |
| + Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| + ExecutableElement outerFunction = _enclosingFunction; |
| + LocalVariableInfo outerLocalVariableInfo = _localVariableInfo; |
| + try { |
| + _localVariableInfo ??= new LocalVariableInfoImpl(); |
|
Brian Wilkerson
2016/02/16 21:13:39
Would it make sense to move the creation of the Va
Paul Berry
2016/02/16 21:49:47
(Capturing the result of an in-person discussion a
|
| + (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo; |
| + _enclosingFunction = node.element; |
| + return super.visitConstructorDeclaration(node); |
| + } finally { |
| + _localVariableInfo = outerLocalVariableInfo; |
| + _enclosingFunction = outerFunction; |
| + } |
| + } |
| + |
| + @override |
| Object visitExportDirective(ExportDirective node) => null; |
| @override |
| Object visitFunctionDeclaration(FunctionDeclaration node) { |
| ExecutableElement outerFunction = _enclosingFunction; |
| + LocalVariableInfo outerLocalVariableInfo = _localVariableInfo; |
| try { |
| + _localVariableInfo ??= new LocalVariableInfoImpl(); |
| + (node.functionExpression.body as FunctionBodyImpl).localVariableInfo = |
| + _localVariableInfo; |
| _enclosingFunction = node.element; |
| return super.visitFunctionDeclaration(node); |
| } finally { |
| + _localVariableInfo = outerLocalVariableInfo; |
| _enclosingFunction = outerFunction; |
| } |
| } |
| @@ -12490,10 +12516,14 @@ class VariableResolverVisitor extends ScopedVisitor { |
| Object visitFunctionExpression(FunctionExpression node) { |
| if (node.parent is! FunctionDeclaration) { |
| ExecutableElement outerFunction = _enclosingFunction; |
| + LocalVariableInfo outerLocalVariableInfo = _localVariableInfo; |
| try { |
| + _localVariableInfo ??= new LocalVariableInfoImpl(); |
| + (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo; |
| _enclosingFunction = node.element; |
| return super.visitFunctionExpression(node); |
| } finally { |
| + _localVariableInfo = outerLocalVariableInfo; |
| _enclosingFunction = outerFunction; |
| } |
| } else { |
| @@ -12507,10 +12537,14 @@ class VariableResolverVisitor extends ScopedVisitor { |
| @override |
| Object visitMethodDeclaration(MethodDeclaration node) { |
| ExecutableElement outerFunction = _enclosingFunction; |
| + LocalVariableInfo outerLocalVariableInfo = _localVariableInfo; |
| try { |
| + _localVariableInfo ??= new LocalVariableInfoImpl(); |
| + (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo; |
| _enclosingFunction = node.element; |
| return super.visitMethodDeclaration(node); |
| } finally { |
| + _localVariableInfo = outerLocalVariableInfo; |
| _enclosingFunction = outerFunction; |
| } |
| } |
| @@ -12562,8 +12596,10 @@ class VariableResolverVisitor extends ScopedVisitor { |
| element as LocalVariableElementImpl; |
| if (node.inSetterContext()) { |
| variableImpl.markPotentiallyMutatedInScope(); |
| + _localVariableInfo.potentiallyMutatedInScope.add(element); |
| if (element.enclosingElement != _enclosingFunction) { |
| variableImpl.markPotentiallyMutatedInClosure(); |
| + _localVariableInfo.potentiallyMutatedInClosure.add(element); |
| } |
| } |
| } else if (kind == ElementKind.PARAMETER) { |
| @@ -12571,11 +12607,13 @@ class VariableResolverVisitor extends ScopedVisitor { |
| if (node.inSetterContext()) { |
| ParameterElementImpl parameterImpl = element as ParameterElementImpl; |
| parameterImpl.markPotentiallyMutatedInScope(); |
| + _localVariableInfo.potentiallyMutatedInScope.add(element); |
| // If we are in some closure, check if it is not the same as where |
| // variable is declared. |
| if (_enclosingFunction != null && |
| (element.enclosingElement != _enclosingFunction)) { |
| parameterImpl.markPotentiallyMutatedInClosure(); |
| + _localVariableInfo.potentiallyMutatedInClosure.add(element); |
| } |
| } |
| } |