OLD | NEW |
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 'package:analyzer/src/generated/scanner.dart'; | 9 import 'package:analyzer/src/generated/scanner.dart'; |
10 | 10 |
(...skipping 9728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9739 /** | 9739 /** |
9740 * The static variables and fields that have an initializer. These are the | 9740 * The static variables and fields that have an initializer. These are the |
9741 * variables that need to be re-resolved after static variables have their | 9741 * variables that need to be re-resolved after static variables have their |
9742 * types inferred. A subset of these variables are those whose types should | 9742 * types inferred. A subset of these variables are those whose types should |
9743 * be inferred. The list will be empty unless the resolver is being run in | 9743 * be inferred. The list will be empty unless the resolver is being run in |
9744 * strong mode. | 9744 * strong mode. |
9745 */ | 9745 */ |
9746 final List<VariableElement> variablesAndFields = <VariableElement>[]; | 9746 final List<VariableElement> variablesAndFields = <VariableElement>[]; |
9747 | 9747 |
9748 /** | 9748 /** |
9749 * A flag indicating whether we should discard errors while resolving the | |
9750 * initializer for variable declarations. We do this for top-level variables | |
9751 * and fields because their initializer will be re-resolved at a later time. | |
9752 */ | |
9753 bool discardErrorsInInitializer = false; | |
9754 | |
9755 /** | |
9756 * Initialize a newly created visitor to resolve the nodes in an AST node. | 9749 * Initialize a newly created visitor to resolve the nodes in an AST node. |
9757 * | 9750 * |
9758 * The [definingLibrary] is the element for the library containing the node | 9751 * The [definingLibrary] is the element for the library containing the node |
9759 * being visited. The [source] is the source representing the compilation unit | 9752 * being visited. The [source] is the source representing the compilation unit |
9760 * containing the node being visited. The [typeProvider] is the object used to | 9753 * containing the node being visited. The [typeProvider] is the object used to |
9761 * access the types from the core library. The [errorListener] is the error | 9754 * access the types from the core library. The [errorListener] is the error |
9762 * listener that will be informed of any errors that are found during | 9755 * listener that will be informed of any errors that are found during |
9763 * resolution. The [nameScope] is the scope used to resolve identifiers in the | 9756 * resolution. The [nameScope] is the scope used to resolve identifiers in the |
9764 * node that will first be visited. If `null` or unspecified, a new | 9757 * node that will first be visited. If `null` or unspecified, a new |
9765 * [LibraryScope] will be created based on [definingLibrary] and | 9758 * [LibraryScope] will be created based on [definingLibrary] and |
9766 * [typeProvider]. The [inheritanceManager] is used to perform inheritance | 9759 * [typeProvider]. The [inheritanceManager] is used to perform inheritance |
9767 * lookups. If `null` or unspecified, a new [InheritanceManager] will be | 9760 * lookups. If `null` or unspecified, a new [InheritanceManager] will be |
9768 * created based on [definingLibrary]. The [typeAnalyzerFactory] is used to | 9761 * created based on [definingLibrary]. The [typeAnalyzerFactory] is used to |
9769 * create the type analyzer. If `null` or unspecified, a type analyzer of | 9762 * create the type analyzer. If `null` or unspecified, a type analyzer of |
9770 * type [StaticTypeAnalyzer] will be created. | 9763 * type [StaticTypeAnalyzer] will be created. |
9771 */ | 9764 */ |
9772 PartialResolverVisitor(LibraryElement definingLibrary, Source source, | 9765 PartialResolverVisitor(LibraryElement definingLibrary, Source source, |
9773 TypeProvider typeProvider, AnalysisErrorListener errorListener, | 9766 TypeProvider typeProvider, AnalysisErrorListener errorListener, |
9774 {Scope nameScope, | 9767 {Scope nameScope, |
9775 InheritanceManager inheritanceManager, | 9768 InheritanceManager inheritanceManager, |
9776 StaticTypeAnalyzerFactory typeAnalyzerFactory}) | 9769 StaticTypeAnalyzerFactory typeAnalyzerFactory}) |
9777 : strongMode = definingLibrary.context.analysisOptions.strongMode, | 9770 : strongMode = definingLibrary.context.analysisOptions.strongMode, |
9778 super(definingLibrary, source, typeProvider, | 9771 super(definingLibrary, source, typeProvider, errorListener); |
9779 new DisablableErrorListener(errorListener)); | |
9780 | 9772 |
9781 @override | 9773 @override |
9782 Object visitBlockFunctionBody(BlockFunctionBody node) { | 9774 Object visitBlockFunctionBody(BlockFunctionBody node) { |
9783 if (_shouldBeSkipped(node)) { | 9775 if (_shouldBeSkipped(node)) { |
9784 return null; | 9776 return null; |
9785 } | 9777 } |
9786 return super.visitBlockFunctionBody(node); | 9778 return super.visitBlockFunctionBody(node); |
9787 } | 9779 } |
9788 | 9780 |
9789 @override | 9781 @override |
9790 Object visitExpressionFunctionBody(ExpressionFunctionBody node) { | 9782 Object visitExpressionFunctionBody(ExpressionFunctionBody node) { |
9791 if (_shouldBeSkipped(node)) { | 9783 if (_shouldBeSkipped(node)) { |
9792 return null; | 9784 return null; |
9793 } | 9785 } |
9794 return super.visitExpressionFunctionBody(node); | 9786 return super.visitExpressionFunctionBody(node); |
9795 } | 9787 } |
9796 | 9788 |
9797 @override | 9789 @override |
9798 Object visitFieldDeclaration(FieldDeclaration node) { | 9790 Object visitFieldDeclaration(FieldDeclaration node) { |
9799 if (strongMode && node.isStatic) { | 9791 if (strongMode && node.isStatic) { |
9800 _addVariables(node.fields.variables); | 9792 _addVariables(node.fields.variables); |
9801 bool wasDiscarding = discardErrorsInInitializer; | |
9802 discardErrorsInInitializer = true; | |
9803 try { | |
9804 return super.visitFieldDeclaration(node); | |
9805 } finally { | |
9806 discardErrorsInInitializer = wasDiscarding; | |
9807 } | |
9808 } | 9793 } |
9809 return super.visitFieldDeclaration(node); | 9794 return super.visitFieldDeclaration(node); |
9810 } | 9795 } |
9811 | 9796 |
9812 @override | 9797 @override |
9813 Object visitNode(AstNode node) { | 9798 Object visitNode(AstNode node) { |
9814 if (discardErrorsInInitializer) { | |
9815 AstNode parent = node.parent; | |
9816 if (parent is VariableDeclaration && parent.initializer == node) { | |
9817 DisablableErrorListener listener = errorListener; | |
9818 return listener.disableWhile(() => super.visitNode(node)); | |
9819 } | |
9820 } | |
9821 return super.visitNode(node); | 9799 return super.visitNode(node); |
9822 } | 9800 } |
9823 | 9801 |
9824 @override | 9802 @override |
9825 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { | 9803 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { |
9826 if (strongMode) { | 9804 if (strongMode) { |
9827 _addVariables(node.variables.variables); | 9805 _addVariables(node.variables.variables); |
9828 bool wasDiscarding = discardErrorsInInitializer; | |
9829 discardErrorsInInitializer = true; | |
9830 try { | |
9831 return super.visitTopLevelVariableDeclaration(node); | |
9832 } finally { | |
9833 discardErrorsInInitializer = wasDiscarding; | |
9834 } | |
9835 } | 9806 } |
9836 return super.visitTopLevelVariableDeclaration(node); | 9807 return super.visitTopLevelVariableDeclaration(node); |
9837 } | 9808 } |
9838 | 9809 |
9839 /** | 9810 /** |
9840 * Add all of the [variables] with initializers to the list of variables whose | 9811 * Add all of the [variables] with initializers to the list of variables whose |
9841 * type can be inferred. Technically, we only infer the types of variables | 9812 * type can be inferred. Technically, we only infer the types of variables |
9842 * that do not have a static type, but all variables with initializers | 9813 * that do not have a static type, but all variables with initializers |
9843 * potentially need to be re-resolved after inference because they might | 9814 * potentially need to be re-resolved after inference because they might |
9844 * refer to a field whose type was inferred. | 9815 * refer to a field whose type was inferred. |
(...skipping 6224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16069 nonFields.add(node); | 16040 nonFields.add(node); |
16070 return null; | 16041 return null; |
16071 } | 16042 } |
16072 | 16043 |
16073 @override | 16044 @override |
16074 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 16045 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
16075 | 16046 |
16076 @override | 16047 @override |
16077 Object visitWithClause(WithClause node) => null; | 16048 Object visitWithClause(WithClause node) => null; |
16078 } | 16049 } |
OLD | NEW |