Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 1370793002: Improve the handling of inference for instance fields in the task model (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address comments 1 Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/task/dart.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 engine.resolver; 5 library engine.resolver;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'ast.dart'; 9 import 'ast.dart';
10 import 'constant.dart'; 10 import 'constant.dart';
(...skipping 9595 matching lines...) Expand 10 before | Expand all | Expand 10 after
9606 * compilation unit. The nodes that are skipped are those that are within 9606 * compilation unit. The nodes that are skipped are those that are within
9607 * function bodies. 9607 * function bodies.
9608 */ 9608 */
9609 class PartialResolverVisitor extends ResolverVisitor { 9609 class PartialResolverVisitor extends ResolverVisitor {
9610 /** 9610 /**
9611 * A flag indicating whether the resolver is being run in strong mode. 9611 * A flag indicating whether the resolver is being run in strong mode.
9612 */ 9612 */
9613 final bool strongMode; 9613 final bool strongMode;
9614 9614
9615 /** 9615 /**
9616 * The static variables that have an initializer. These are the variables that 9616 * The static variables and fields that have an initializer. These are the
9617 * need to be re-resolved after static variables have their types inferred. A 9617 * variables that need to be re-resolved after static variables have their
9618 * subset of these variables are those whose types should be inferred. The 9618 * types inferred. A subset of these variables are those whose types should
9619 * list will be empty unless the resolver is being run in strong mode. 9619 * be inferred. The list will be empty unless the resolver is being run in
9620 * strong mode.
9620 */ 9621 */
9621 final List<VariableElement> staticVariables = <VariableElement>[]; 9622 final List<VariableElement> variablesAndFields = <VariableElement>[];
9622 9623
9623 /** 9624 /**
9624 * A flag indicating whether we should discard errors while resolving the 9625 * A flag indicating whether we should discard errors while resolving the
9625 * initializer for variable declarations. We do this for top-level variables 9626 * initializer for variable declarations. We do this for top-level variables
9626 * and fields because their initializer will be re-resolved at a later time. 9627 * and fields because their initializer will be re-resolved at a later time.
9627 */ 9628 */
9628 bool discardErrorsInInitializer = false; 9629 bool discardErrorsInInitializer = false;
9629 9630
9630 /** 9631 /**
9631 * Initialize a newly created visitor to resolve the nodes in an AST node. 9632 * Initialize a newly created visitor to resolve the nodes in an AST node.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
9664 @override 9665 @override
9665 Object visitExpressionFunctionBody(ExpressionFunctionBody node) { 9666 Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
9666 if (_shouldBeSkipped(node)) { 9667 if (_shouldBeSkipped(node)) {
9667 return null; 9668 return null;
9668 } 9669 }
9669 return super.visitExpressionFunctionBody(node); 9670 return super.visitExpressionFunctionBody(node);
9670 } 9671 }
9671 9672
9672 @override 9673 @override
9673 Object visitFieldDeclaration(FieldDeclaration node) { 9674 Object visitFieldDeclaration(FieldDeclaration node) {
9674 if (strongMode && node.isStatic) { 9675 if (strongMode) {
9675 _addStaticVariables(node.fields.variables); 9676 _addVariables(node.fields.variables);
9676 bool wasDiscarding = discardErrorsInInitializer; 9677 bool wasDiscarding = discardErrorsInInitializer;
9677 discardErrorsInInitializer = true; 9678 discardErrorsInInitializer = true;
9678 try { 9679 try {
9679 return super.visitFieldDeclaration(node); 9680 return super.visitFieldDeclaration(node);
9680 } finally { 9681 } finally {
9681 discardErrorsInInitializer = wasDiscarding; 9682 discardErrorsInInitializer = wasDiscarding;
9682 } 9683 }
9683 } 9684 }
9684 return super.visitFieldDeclaration(node); 9685 return super.visitFieldDeclaration(node);
9685 } 9686 }
9686 9687
9687 @override 9688 @override
9688 Object visitNode(AstNode node) { 9689 Object visitNode(AstNode node) {
9689 if (discardErrorsInInitializer) { 9690 if (discardErrorsInInitializer) {
9690 AstNode parent = node.parent; 9691 AstNode parent = node.parent;
9691 if (parent is VariableDeclaration && parent.initializer == node) { 9692 if (parent is VariableDeclaration && parent.initializer == node) {
9692 DisablableErrorListener listener = errorListener; 9693 DisablableErrorListener listener = errorListener;
9693 return listener.disableWhile(() => super.visitNode(node)); 9694 return listener.disableWhile(() => super.visitNode(node));
9694 } 9695 }
9695 } 9696 }
9696 return super.visitNode(node); 9697 return super.visitNode(node);
9697 } 9698 }
9698 9699
9699 @override 9700 @override
9700 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { 9701 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
9701 if (strongMode) { 9702 if (strongMode) {
9702 _addStaticVariables(node.variables.variables); 9703 _addVariables(node.variables.variables);
9703 bool wasDiscarding = discardErrorsInInitializer; 9704 bool wasDiscarding = discardErrorsInInitializer;
9704 discardErrorsInInitializer = true; 9705 discardErrorsInInitializer = true;
9705 try { 9706 try {
9706 return super.visitTopLevelVariableDeclaration(node); 9707 return super.visitTopLevelVariableDeclaration(node);
9707 } finally { 9708 } finally {
9708 discardErrorsInInitializer = wasDiscarding; 9709 discardErrorsInInitializer = wasDiscarding;
9709 } 9710 }
9710 } 9711 }
9711 return super.visitTopLevelVariableDeclaration(node); 9712 return super.visitTopLevelVariableDeclaration(node);
9712 } 9713 }
9713 9714
9714 /** 9715 /**
9715 * Add all of the [variables] with initializers to the list of variables whose 9716 * Add all of the [variables] with initializers to the list of variables whose
9716 * type can be inferred. Technically, we only infer the types of variables 9717 * type can be inferred. Technically, we only infer the types of variables
9717 * that do not have a static type, but all variables with initializers 9718 * that do not have a static type, but all variables with initializers
9718 * potentially need to be re-resolved after inference because they might 9719 * potentially need to be re-resolved after inference because they might
9719 * refer to a field whose type was inferred. 9720 * refer to a field whose type was inferred.
9720 */ 9721 */
9721 void _addStaticVariables(NodeList<VariableDeclaration> variables) { 9722 void _addVariables(NodeList<VariableDeclaration> variables) {
9722 for (VariableDeclaration variable in variables) { 9723 for (VariableDeclaration variable in variables) {
9723 if (variable.initializer != null) { 9724 if (variable.initializer != null) {
9724 staticVariables.add(variable.element); 9725 variablesAndFields.add(variable.element);
9725 } 9726 }
9726 } 9727 }
9727 } 9728 }
9728 9729
9729 /** 9730 /**
9730 * Return `true` if the given function body should be skipped because it is 9731 * Return `true` if the given function body should be skipped because it is
9731 * the body of a top-level function, method or constructor. 9732 * the body of a top-level function, method or constructor.
9732 */ 9733 */
9733 bool _shouldBeSkipped(FunctionBody body) { 9734 bool _shouldBeSkipped(FunctionBody body) {
9734 AstNode parent = body.parent; 9735 AstNode parent = body.parent;
(...skipping 6212 matching lines...) Expand 10 before | Expand all | Expand 10 after
15947 nonFields.add(node); 15948 nonFields.add(node);
15948 return null; 15949 return null;
15949 } 15950 }
15950 15951
15951 @override 15952 @override
15952 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); 15953 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
15953 15954
15954 @override 15955 @override
15955 Object visitWithClause(WithClause node) => null; 15956 Object visitWithClause(WithClause node) => null;
15956 } 15957 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/task/dart.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698