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

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

Issue 2306223002: Move more error detection out of Scope (Closed)
Patch Set: clean-up Created 4 years, 3 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
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.dart.resolver.scope; 5 library analyzer.src.dart.resolver.scope;
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/element/element.dart'; 10 import 'package:analyzer/dart/element/element.dart';
11 import 'package:analyzer/src/dart/element/element.dart'; 11 import 'package:analyzer/src/dart/element/element.dart';
12 import 'package:analyzer/src/generated/engine.dart'; 12 import 'package:analyzer/src/generated/engine.dart';
13 import 'package:analyzer/src/generated/error.dart'; 13 import 'package:analyzer/src/generated/error.dart';
14 import 'package:analyzer/src/generated/java_core.dart'; 14 import 'package:analyzer/src/generated/java_core.dart';
15 import 'package:analyzer/src/generated/java_engine.dart'; 15 import 'package:analyzer/src/generated/java_engine.dart';
16 import 'package:analyzer/src/generated/source.dart'; 16 import 'package:analyzer/src/generated/source.dart';
17 17
18 /** 18 /**
19 * The scope defined by a block.
20 */
21 class BlockScope extends EnclosedScope {
22 /**
23 * Initialize a newly created scope, enclosed within the [enclosingScope],
24 * based on the given [classElement].
25 */
26 BlockScope(Scope enclosingScope, Block block) : super(enclosingScope) {
27 if (block == null) {
28 throw new IllegalArgumentException("block cannot be null");
29 }
30 _defineElements(block);
31 }
32
33 void _defineElements(block) {
scheglov 2016/09/02 23:46:50 Type for "block"?
Brian Wilkerson 2016/09/03 17:12:37 Done
34 for (var element in elementsInBlock(block)) {
35 define(element);
36 }
scheglov 2016/09/02 23:46:50 This could be written as: elementsInBlock(block).f
Brian Wilkerson 2016/09/03 17:12:37 Leaving it as is.
37 }
38
39 /**
40 * Return the elements that are declared directly in the given [block]. This
41 * does not include elements declared in nested blocks.
42 */
43 static Iterable<Element> elementsInBlock(Block block) sync* {
44 NodeList<Statement> statements = block.statements;
45 int statementCount = statements.length;
46 for (int i = 0; i < statementCount; i++) {
47 Statement statement = statements[i];
48 if (statement is VariableDeclarationStatement) {
49 NodeList<VariableDeclaration> variables = statement.variables.variables;
50 int variableCount = variables.length;
51 for (int j = 0; j < variableCount; j++) {
52 yield variables[j].element;
53 }
54 } else if (statement is FunctionDeclarationStatement) {
55 yield statement.functionDeclaration.element;
56 }
57 }
58 }
59 }
60
61 /**
19 * The scope defined by a class. 62 * The scope defined by a class.
20 */ 63 */
21 class ClassScope extends EnclosedScope { 64 class ClassScope extends EnclosedScope {
22 /** 65 /**
23 * Initialize a newly created scope, enclosed within the [enclosingScope], 66 * Initialize a newly created scope, enclosed within the [enclosingScope],
24 * based on the given [classElement]. 67 * based on the given [classElement].
25 */ 68 */
26 ClassScope(Scope enclosingScope, ClassElement classElement) 69 ClassScope(Scope enclosingScope, ClassElement classElement)
27 : super(enclosingScope) { 70 : super(enclosingScope) {
28 if (classElement == null) { 71 if (classElement == null) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 * A scope that is lexically enclosed in another scope. 117 * A scope that is lexically enclosed in another scope.
75 */ 118 */
76 class EnclosedScope extends Scope { 119 class EnclosedScope extends Scope {
77 /** 120 /**
78 * The scope in which this scope is lexically enclosed. 121 * The scope in which this scope is lexically enclosed.
79 */ 122 */
80 @override 123 @override
81 final Scope enclosingScope; 124 final Scope enclosingScope;
82 125
83 /** 126 /**
84 * A table mapping names that will be defined in this scope, but right now are
85 * not initialized. According to the scoping rules these names are hidden,
86 * even if they were defined in an outer scope.
87 */
88 HashMap<String, Element> _hiddenElements = null;
89
90 /**
91 * Initialize a newly created scope, enclosed within the [enclosingScope]. 127 * Initialize a newly created scope, enclosed within the [enclosingScope].
92 */ 128 */
93 EnclosedScope(this.enclosingScope); 129 EnclosedScope(this.enclosingScope);
94 130
95 @override 131 @override
96 AnalysisErrorListener get errorListener => enclosingScope.errorListener; 132 AnalysisErrorListener get errorListener => enclosingScope.errorListener;
97 133
98 /**
99 * Record that given [element] is declared in this scope, but hasn't been
100 * initialized yet, so it is error to use. If there is already an element with
101 * the given name defined in an outer scope, then it will become unavailable.
102 */
103 void hide(Element element) {
104 if (element != null) {
105 String name = element.name;
106 if (name != null && !name.isEmpty) {
107 _hiddenElements ??= new HashMap<String, Element>();
108 _hiddenElements[name] = element;
109 }
110 }
111 }
112
113 @override 134 @override
114 Element internalLookup( 135 Element internalLookup(
115 Identifier identifier, String name, LibraryElement referencingLibrary) { 136 Identifier identifier, String name, LibraryElement referencingLibrary) {
116 Element element = localLookup(name, referencingLibrary); 137 Element element = localLookup(name, referencingLibrary);
117 if (element != null) { 138 if (element != null) {
118 return element; 139 return element;
119 } 140 }
120 // May be there is a hidden Element.
121 if (_hiddenElements != null) {
122 Element hiddenElement = _hiddenElements[name];
123 if (hiddenElement != null) {
124 errorListener.onError(new AnalysisError(
125 getSource(identifier),
126 identifier.offset,
127 identifier.length,
128 CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
129 [name]));
130 return hiddenElement;
131 }
132 }
133 // Check enclosing scope. 141 // Check enclosing scope.
134 return enclosingScope.internalLookup(identifier, name, referencingLibrary); 142 return enclosingScope.internalLookup(identifier, name, referencingLibrary);
135 } 143 }
136 144
137 @override 145 @override
138 Element _internalLookupPrefixed(Identifier identifier, String prefix, 146 Element _internalLookupPrefixed(Identifier identifier, String prefix,
139 String name, LibraryElement referencingLibrary) { 147 String name, LibraryElement referencingLibrary) {
140 return enclosingScope._internalLookupPrefixed( 148 return enclosingScope._internalLookupPrefixed(
141 identifier, prefix, name, referencingLibrary); 149 identifier, prefix, name, referencingLibrary);
142 } 150 }
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 1273
1266 /** 1274 /**
1267 * Define the type parameters declared by the [classElement]. 1275 * Define the type parameters declared by the [classElement].
1268 */ 1276 */
1269 void _defineTypeParameters(ClassElement classElement) { 1277 void _defineTypeParameters(ClassElement classElement) {
1270 for (TypeParameterElement typeParameter in classElement.typeParameters) { 1278 for (TypeParameterElement typeParameter in classElement.typeParameters) {
1271 define(typeParameter); 1279 define(typeParameter);
1272 } 1280 }
1273 } 1281 }
1274 } 1282 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/generated/error_verifier.dart » ('j') | pkg/analyzer/lib/src/generated/error_verifier.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698