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

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

Issue 2439583003: Validate local resolution scope, and compute initial name scope. (Closed)
Patch Set: Created 4 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/test/generated/parser_test.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 analyzer.src.generated.resolver; 5 library analyzer.src.generated.resolver;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 9377 matching lines...) Expand 10 before | Expand all | Expand 10 after
9388 everything, 9388 everything,
9389 9389
9390 /** 9390 /**
9391 * Resolve only type names outside of function bodies, variable initializers, 9391 * Resolve only type names outside of function bodies, variable initializers,
9392 * and parameter default values. 9392 * and parameter default values.
9393 */ 9393 */
9394 api, 9394 api,
9395 9395
9396 /** 9396 /**
9397 * Resolve only type names that would be skipped during [api]. 9397 * Resolve only type names that would be skipped during [api].
9398 *
9399 * Resolution must start from a unit member or a class member. For example
9400 * it is not allowed to resolve types in a separate statement, or a function
9401 * body.
9398 */ 9402 */
9399 local 9403 local
9400 } 9404 }
9401 9405
9402 /** 9406 /**
9403 * Instances of the class `TypeResolverVisitor` are used to resolve the types as sociated with 9407 * Instances of the class `TypeResolverVisitor` are used to resolve the types as sociated with
9404 * the elements in the element model. This includes the types of superclasses, m ixins, interfaces, 9408 * the elements in the element model. This includes the types of superclasses, m ixins, interfaces,
9405 * fields, methods, parameters, and local variables. As a side-effect, this also finishes building 9409 * fields, methods, parameters, and local variables. As a side-effect, this also finishes building
9406 * the type hierarchy. 9410 * the type hierarchy.
9407 */ 9411 */
(...skipping 23 matching lines...) Expand all
9431 */ 9435 */
9432 TypeSystem _typeSystem; 9436 TypeSystem _typeSystem;
9433 9437
9434 /** 9438 /**
9435 * The helper to resolve [TypeName]s. 9439 * The helper to resolve [TypeName]s.
9436 */ 9440 */
9437 TypeNameResolver _typeNameResolver; 9441 TypeNameResolver _typeNameResolver;
9438 9442
9439 final TypeResolverMode mode; 9443 final TypeResolverMode mode;
9440 9444
9441 bool _visitAllInLocalMode = false; 9445 /**
9446 * Is `true` when we are visiting all nodes in [TypeResolverMode.local] mode.
9447 */
9448 bool _localModeVisitAll = false;
9449
9450 /**
9451 * Is `true` is we are in [TypeResolverMode.local] mode, and the initial
Brian Wilkerson 2016/10/19 21:00:36 "is we" --> "if we"
9452 * [nameScope] was computed.
9453 */
9454 bool _localModeScopeReady = false;
9442 9455
9443 /** 9456 /**
9444 * Initialize a newly created visitor to resolve the nodes in an AST node. 9457 * Initialize a newly created visitor to resolve the nodes in an AST node.
9445 * 9458 *
9446 * [definingLibrary] is the element for the library containing the node being 9459 * [definingLibrary] is the element for the library containing the node being
9447 * visited. 9460 * visited.
9448 * [source] is the source representing the compilation unit containing the 9461 * [source] is the source representing the compilation unit containing the
9449 * node being visited. 9462 * node being visited.
9450 * [typeProvider] is the object used to access the types from the core 9463 * [typeProvider] is the object used to access the types from the core
9451 * library. 9464 * library.
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
9787 9800
9788 // In local mode we need to resolve only: 9801 // In local mode we need to resolve only:
9789 // - function bodies; 9802 // - function bodies;
9790 // - default values of parameters; 9803 // - default values of parameters;
9791 // - initializers of top-level variables. 9804 // - initializers of top-level variables.
9792 // So, we carefully visit only nodes that are, or contain, these nodes. 9805 // So, we carefully visit only nodes that are, or contain, these nodes.
9793 // The client may choose to start visiting any node, but we still want to 9806 // The client may choose to start visiting any node, but we still want to
9794 // resolve only type names that are local. 9807 // resolve only type names that are local.
9795 if (mode == TypeResolverMode.local) { 9808 if (mode == TypeResolverMode.local) {
9796 // We are in the state of visiting all nodes. 9809 // We are in the state of visiting all nodes.
9797 if (_visitAllInLocalMode) { 9810 if (_localModeVisitAll) {
9798 return super.visitNode(node); 9811 return super.visitNode(node);
9799 } 9812 }
9800 9813
9814 // Ensure that the name scope is ready.
9815 if (!_localModeScopeReady) {
9816 void fillNameScope(AstNode node) {
9817 if (node is FunctionBody ||
9818 node is FormalParameterList ||
9819 node is VariableDeclaration) {
9820 throw new StateError(
9821 'Local type resolution must start from a class or unit member.') ;
9822 }
9823 // Create enclosing name scopes.
9824 AstNode parent = node.parent;
9825 if (parent != null) {
9826 fillNameScope(parent);
9827 }
9828 // Create the name scope for the node.
9829 if (node is ClassDeclaration) {
9830 ClassElement classElement = node.element;
9831 nameScope = new TypeParameterScope(nameScope, classElement);
9832 nameScope = new ClassScope(nameScope, classElement);
9833 }
9834 }
9835
9836 fillNameScope(node);
9837 _localModeScopeReady = true;
9838 }
9839
9801 /** 9840 /**
9802 * Visit the given [node] and all its children. 9841 * Visit the given [node] and all its children.
9803 */ 9842 */
9804 void visitAllNodes(AstNode node) { 9843 void visitAllNodes(AstNode node) {
9805 if (node != null) { 9844 if (node != null) {
9806 bool wasVisitAllInLocalMode = _visitAllInLocalMode; 9845 bool wasVisitAllInLocalMode = _localModeVisitAll;
9807 try { 9846 try {
9808 _visitAllInLocalMode = true; 9847 _localModeVisitAll = true;
9809 node.accept(this); 9848 node.accept(this);
9810 } finally { 9849 } finally {
9811 _visitAllInLocalMode = wasVisitAllInLocalMode; 9850 _localModeVisitAll = wasVisitAllInLocalMode;
9812 } 9851 }
9813 } 9852 }
9814 } 9853 }
9815 9854
9816 // Visit only nodes that may contain type names to resolve. 9855 // Visit only nodes that may contain type names to resolve.
9817 if (node is CompilationUnit) { 9856 if (node is CompilationUnit) {
9818 node.declarations.forEach(visitNode); 9857 node.declarations.forEach(visitNode);
9819 } else if (node is ClassDeclaration) { 9858 } else if (node is ClassDeclaration) {
9820 node.members.forEach(visitNode); 9859 node.members.forEach(visitNode);
9821 } else if (node is DefaultFormalParameter) { 9860 } else if (node is DefaultFormalParameter) {
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
10681 return null; 10720 return null;
10682 } 10721 }
10683 if (identical(node.staticElement, variable)) { 10722 if (identical(node.staticElement, variable)) {
10684 if (node.inSetterContext()) { 10723 if (node.inSetterContext()) {
10685 result = true; 10724 result = true;
10686 } 10725 }
10687 } 10726 }
10688 return null; 10727 return null;
10689 } 10728 }
10690 } 10729 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/parser_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698