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

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

Issue 1768713002: Fixes to associating existing elements with an AST (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Clean up Created 4 years, 9 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.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 18 matching lines...) Expand all
29 import 'package:analyzer/src/generated/source.dart'; 29 import 'package:analyzer/src/generated/source.dart';
30 import 'package:analyzer/src/generated/static_type_analyzer.dart'; 30 import 'package:analyzer/src/generated/static_type_analyzer.dart';
31 import 'package:analyzer/src/generated/type_system.dart'; 31 import 'package:analyzer/src/generated/type_system.dart';
32 import 'package:analyzer/src/generated/utilities_dart.dart'; 32 import 'package:analyzer/src/generated/utilities_dart.dart';
33 import 'package:analyzer/src/task/strong/info.dart' 33 import 'package:analyzer/src/task/strong/info.dart'
34 show InferredType, StaticInfo; 34 show InferredType, StaticInfo;
35 35
36 export 'package:analyzer/src/generated/type_system.dart'; 36 export 'package:analyzer/src/generated/type_system.dart';
37 37
38 /** 38 /**
39 * Throw an [ElementMismatchException] to report that the element model and the
40 * AST do not match. The [message] will have the path to the given [node]
41 * appended to it.
42 */
43 void _mismatch(String message, AstNode node) {
44 StringBuffer buffer = new StringBuffer();
45 buffer.writeln(message);
46 buffer.write('Path to root:');
47 String separator = ' ';
48 AstNode parent = node;
49 while (parent != null) {
50 buffer.write(separator);
51 buffer.write(parent.runtimeType.toString());
52 separator = ', ';
53 parent = parent.parent;
54 }
55 throw new ElementMismatchException(buffer.toString());
56 }
57
58 /**
39 * Instances of the class `BestPracticesVerifier` traverse an AST structure look ing for 59 * Instances of the class `BestPracticesVerifier` traverse an AST structure look ing for
40 * violations of Dart best practices. 60 * violations of Dart best practices.
41 */ 61 */
42 class BestPracticesVerifier extends RecursiveAstVisitor<Object> { 62 class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
43 // static String _HASHCODE_GETTER_NAME = "hashCode"; 63 // static String _HASHCODE_GETTER_NAME = "hashCode";
44 64
45 static String _NULL_TYPE_NAME = "Null"; 65 static String _NULL_TYPE_NAME = "Null";
46 66
47 static String _TO_INT_METHOD_NAME = "toInt"; 67 static String _TO_INT_METHOD_NAME = "toInt";
48 68
(...skipping 2063 matching lines...) Expand 10 before | Expand all | Expand 10 after
2112 void _safelyVisit(AstNode node) { 2132 void _safelyVisit(AstNode node) {
2113 if (node != null) { 2133 if (node != null) {
2114 node.accept(this); 2134 node.accept(this);
2115 } 2135 }
2116 } 2136 }
2117 } 2137 }
2118 2138
2119 /** 2139 /**
2120 * A visitor that resolves declarations in an AST structure to already built 2140 * A visitor that resolves declarations in an AST structure to already built
2121 * elements. 2141 * elements.
2142 *
2143 * The resulting AST must have everything resolved that would have been resolved
2144 * by a [CompilationUnitBuilder] (that is, must be a valid [RESOLVED_UNIT1]).
2145 * This class must not assume that the [CompilationUnitElement] passed to it is
2146 * any more complete than a [COMPILATION_UNIT_ELEMENT].
2122 */ 2147 */
2123 class DeclarationResolver extends RecursiveAstVisitor<Object> { 2148 class DeclarationResolver extends RecursiveAstVisitor<Object> {
2124 /** 2149 /**
2125 * The analysis context containing the sources to be analyzed. 2150 * The analysis context containing the sources to be analyzed.
2126 */ 2151 */
2127 AnalysisContext _context; 2152 AnalysisContext _context;
2128 2153
2129 /** 2154 /**
2130 * The elements that are reachable from the compilation unit element. When a 2155 * The elements that are reachable from the compilation unit element. When a
2131 * compilation unit has been resolved, this set should be empty. 2156 * compilation unit has been resolved, this set should be empty.
2132 */ 2157 */
2133 Set<Element> _expectedElements; 2158 Set<Element> _expectedElements;
2134 2159
2135 /** 2160 /**
2136 * The compilation unit containing the AST nodes being visited. 2161 * The compilation unit containing the AST nodes being visited.
2137 */ 2162 */
2138 CompilationUnitElement _enclosingUnit; 2163 CompilationUnitElementImpl _enclosingUnit;
2139 2164
2140 /** 2165 /**
2141 * The function type alias containing the AST nodes being visited, or `null` 2166 * The function type alias containing the AST nodes being visited, or `null`
2142 * if we are not in the scope of a function type alias. 2167 * if we are not in the scope of a function type alias.
2143 */ 2168 */
2144 FunctionTypeAliasElement _enclosingAlias; 2169 FunctionTypeAliasElement _enclosingAlias;
2145 2170
2146 /** 2171 /**
2147 * The class containing the AST nodes being visited, or `null` if we are not 2172 * The class containing the AST nodes being visited, or `null` if we are not
2148 * in the scope of a class. 2173 * in the scope of a class.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2193 return super.visitCatchClause(node); 2218 return super.visitCatchClause(node);
2194 } 2219 }
2195 2220
2196 @override 2221 @override
2197 Object visitClassDeclaration(ClassDeclaration node) { 2222 Object visitClassDeclaration(ClassDeclaration node) {
2198 ClassElement outerClass = _enclosingClass; 2223 ClassElement outerClass = _enclosingClass;
2199 try { 2224 try {
2200 SimpleIdentifier className = node.name; 2225 SimpleIdentifier className = node.name;
2201 _enclosingClass = _findIdentifier(_enclosingUnit.types, className); 2226 _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
2202 super.visitClassDeclaration(node); 2227 super.visitClassDeclaration(node);
2203 _resolveMetadata(node.metadata, _enclosingClass); 2228 _resolveMetadata(node, node.metadata, _enclosingClass);
2204 return null; 2229 return null;
2205 } finally { 2230 } finally {
2206 _enclosingClass = outerClass; 2231 _enclosingClass = outerClass;
2207 } 2232 }
2208 } 2233 }
2209 2234
2210 @override 2235 @override
2211 Object visitClassTypeAlias(ClassTypeAlias node) { 2236 Object visitClassTypeAlias(ClassTypeAlias node) {
2212 ClassElement outerClass = _enclosingClass; 2237 ClassElement outerClass = _enclosingClass;
2213 try { 2238 try {
2214 SimpleIdentifier className = node.name; 2239 SimpleIdentifier className = node.name;
2215 _enclosingClass = _findIdentifier(_enclosingUnit.types, className); 2240 _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
2216 super.visitClassTypeAlias(node); 2241 super.visitClassTypeAlias(node);
2217 _resolveMetadata(node.metadata, _enclosingClass); 2242 _resolveMetadata(node, node.metadata, _enclosingClass);
2218 return null; 2243 return null;
2219 } finally { 2244 } finally {
2220 _enclosingClass = outerClass; 2245 _enclosingClass = outerClass;
2221 } 2246 }
2222 } 2247 }
2223 2248
2224 @override 2249 @override
2225 Object visitConstructorDeclaration(ConstructorDeclaration node) { 2250 Object visitConstructorDeclaration(ConstructorDeclaration node) {
2226 ExecutableElement outerExecutable = _enclosingExecutable; 2251 ExecutableElement outerExecutable = _enclosingExecutable;
2227 try { 2252 try {
2228 SimpleIdentifier constructorName = node.name; 2253 SimpleIdentifier constructorName = node.name;
2229 if (constructorName == null) { 2254 if (constructorName == null) {
2230 _enclosingExecutable = _enclosingClass.unnamedConstructor; 2255 _enclosingExecutable = _enclosingClass.unnamedConstructor;
2231 if (_enclosingExecutable == null) { 2256 if (_enclosingExecutable == null) {
2232 _mismatch('Could not find default constructor', node); 2257 _mismatch('Could not find default constructor', node);
2233 } 2258 }
2234 } else { 2259 } else {
2235 _enclosingExecutable = 2260 _enclosingExecutable =
2236 _enclosingClass.getNamedConstructor(constructorName.name); 2261 _enclosingClass.getNamedConstructor(constructorName.name);
2237 if (_enclosingExecutable == null) { 2262 if (_enclosingExecutable == null) {
2238 _mismatch( 2263 _mismatch(
2239 'Could not find constructor element with name "${constructorName.n ame}', 2264 'Could not find constructor element with name "${constructorName.n ame}',
2240 node); 2265 node);
2241 } 2266 }
2242 constructorName.staticElement = _enclosingExecutable; 2267 constructorName.staticElement = _enclosingExecutable;
2243 } 2268 }
2244 _expectedElements.remove(_enclosingExecutable); 2269 _expectedElements.remove(_enclosingExecutable);
2245 node.element = _enclosingExecutable as ConstructorElement; 2270 node.element = _enclosingExecutable as ConstructorElement;
2246 super.visitConstructorDeclaration(node); 2271 super.visitConstructorDeclaration(node);
2247 _resolveMetadata(node.metadata, _enclosingExecutable); 2272 _resolveMetadata(node, node.metadata, _enclosingExecutable);
2248 return null; 2273 return null;
2249 } finally { 2274 } finally {
2250 _enclosingExecutable = outerExecutable; 2275 _enclosingExecutable = outerExecutable;
2251 } 2276 }
2252 } 2277 }
2253 2278
2254 @override 2279 @override
2255 Object visitDeclaredIdentifier(DeclaredIdentifier node) { 2280 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
2256 SimpleIdentifier variableName = node.identifier; 2281 SimpleIdentifier variableName = node.identifier;
2257 Element element = 2282 Element element =
2258 _findIdentifier(_enclosingExecutable.localVariables, variableName); 2283 _findIdentifier(_enclosingExecutable.localVariables, variableName);
2259 super.visitDeclaredIdentifier(node); 2284 super.visitDeclaredIdentifier(node);
2260 _resolveMetadata(node.metadata, element); 2285 _resolveMetadata(node, node.metadata, element);
2261 return null; 2286 return null;
2262 } 2287 }
2263 2288
2264 @override 2289 @override
2265 Object visitDefaultFormalParameter(DefaultFormalParameter node) { 2290 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
2266 SimpleIdentifier parameterName = node.parameter.identifier; 2291 SimpleIdentifier parameterName = node.parameter.identifier;
2267 ParameterElement element = _getElementForParameter(node, parameterName); 2292 ParameterElement element = _getElementForParameter(node, parameterName);
2268 Expression defaultValue = node.defaultValue; 2293 Expression defaultValue = node.defaultValue;
2269 if (defaultValue != null) { 2294 if (defaultValue != null) {
2270 ExecutableElement outerExecutable = _enclosingExecutable; 2295 ExecutableElement outerExecutable = _enclosingExecutable;
2271 try { 2296 try {
2272 _enclosingExecutable = element.initializer; 2297 _enclosingExecutable = element.initializer;
2273 defaultValue.accept(this); 2298 defaultValue.accept(this);
2274 } finally { 2299 } finally {
2275 _enclosingExecutable = outerExecutable; 2300 _enclosingExecutable = outerExecutable;
2276 } 2301 }
2277 } 2302 }
2278 ParameterElement outerParameter = _enclosingParameter; 2303 ParameterElement outerParameter = _enclosingParameter;
2279 try { 2304 try {
2280 _enclosingParameter = element; 2305 _enclosingParameter = element;
2281 super.visitDefaultFormalParameter(node); 2306 super.visitDefaultFormalParameter(node);
2282 _resolveMetadata(node.metadata, element); 2307 _resolveMetadata(node, node.metadata, element);
2283 return null; 2308 return null;
2284 } finally { 2309 } finally {
2285 _enclosingParameter = outerParameter; 2310 _enclosingParameter = outerParameter;
2286 } 2311 }
2287 } 2312 }
2288 2313
2289 @override 2314 @override
2290 Object visitEnumDeclaration(EnumDeclaration node) { 2315 Object visitEnumDeclaration(EnumDeclaration node) {
2291 ClassElement enclosingEnum = 2316 ClassElement enclosingEnum =
2292 _findIdentifier(_enclosingUnit.enums, node.name); 2317 _findIdentifier(_enclosingUnit.enums, node.name);
2293 List<FieldElement> constants = enclosingEnum.fields; 2318 List<FieldElement> constants = enclosingEnum.fields;
2294 for (EnumConstantDeclaration constant in node.constants) { 2319 for (EnumConstantDeclaration constant in node.constants) {
2295 _findIdentifier(constants, constant.name); 2320 _findIdentifier(constants, constant.name);
2296 } 2321 }
2297 super.visitEnumDeclaration(node); 2322 super.visitEnumDeclaration(node);
2298 _resolveMetadata(node.metadata, enclosingEnum); 2323 _resolveMetadata(node, node.metadata, enclosingEnum);
2299 return null; 2324 return null;
2300 } 2325 }
2301 2326
2302 @override 2327 @override
2303 Object visitExportDirective(ExportDirective node) { 2328 Object visitExportDirective(ExportDirective node) {
2304 String uri = _getStringValue(node.uri);
2305 ExportElement exportElement;
2306 if (uri != null) {
2307 LibraryElement library = _enclosingUnit.library;
2308 Source source = _enclosingUnit.context.sourceFactory
2309 .resolveUri(_enclosingUnit.source, uri);
2310 exportElement = _findExport(node, library.exports, source);
2311 node.element = exportElement;
2312 }
2313 super.visitExportDirective(node); 2329 super.visitExportDirective(node);
2314 _resolveMetadata(node.metadata, exportElement); 2330 _resolveAnnotations(
2331 node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
2315 return null; 2332 return null;
2316 } 2333 }
2317 2334
2318 @override 2335 @override
2319 Object visitFieldDeclaration(FieldDeclaration node) { 2336 Object visitFieldDeclaration(FieldDeclaration node) {
2320 super.visitFieldDeclaration(node); 2337 super.visitFieldDeclaration(node);
2321 _resolveMetadata(node.metadata, node.fields.variables[0].element); 2338 _resolveMetadata(node, node.metadata, node.fields.variables[0].element);
2322 return null; 2339 return null;
2323 } 2340 }
2324 2341
2325 @override 2342 @override
2326 Object visitFieldFormalParameter(FieldFormalParameter node) { 2343 Object visitFieldFormalParameter(FieldFormalParameter node) {
2327 if (node.parent is! DefaultFormalParameter) { 2344 if (node.parent is! DefaultFormalParameter) {
2328 SimpleIdentifier parameterName = node.identifier; 2345 SimpleIdentifier parameterName = node.identifier;
2329 ParameterElement element = _getElementForParameter(node, parameterName); 2346 ParameterElement element = _getElementForParameter(node, parameterName);
2330 ParameterElement outerParameter = _enclosingParameter; 2347 ParameterElement outerParameter = _enclosingParameter;
2331 try { 2348 try {
2332 _enclosingParameter = element; 2349 _enclosingParameter = element;
2333 super.visitFieldFormalParameter(node); 2350 super.visitFieldFormalParameter(node);
2334 _resolveMetadata(node.metadata, element); 2351 _resolveMetadata(node, node.metadata, element);
2335 return null; 2352 return null;
2336 } finally { 2353 } finally {
2337 _enclosingParameter = outerParameter; 2354 _enclosingParameter = outerParameter;
2338 } 2355 }
2339 } else { 2356 } else {
2340 return super.visitFieldFormalParameter(node); 2357 return super.visitFieldFormalParameter(node);
2341 } 2358 }
2342 } 2359 }
2343 2360
2344 @override 2361 @override
(...skipping 28 matching lines...) Expand all
2373 accessor = _findWithNameAndOffset(accessors, functionName, 2390 accessor = _findWithNameAndOffset(accessors, functionName,
2374 functionName.name + '=', functionName.offset); 2391 functionName.name + '=', functionName.offset);
2375 _expectedElements.remove(accessor); 2392 _expectedElements.remove(accessor);
2376 functionName.staticElement = accessor; 2393 functionName.staticElement = accessor;
2377 } 2394 }
2378 _enclosingExecutable = accessor; 2395 _enclosingExecutable = accessor;
2379 } 2396 }
2380 } 2397 }
2381 node.functionExpression.element = _enclosingExecutable; 2398 node.functionExpression.element = _enclosingExecutable;
2382 super.visitFunctionDeclaration(node); 2399 super.visitFunctionDeclaration(node);
2383 _resolveMetadata(node.metadata, _enclosingExecutable); 2400 _resolveMetadata(node, node.metadata, _enclosingExecutable);
2384 return null; 2401 return null;
2385 } finally { 2402 } finally {
2386 _enclosingExecutable = outerExecutable; 2403 _enclosingExecutable = outerExecutable;
2387 } 2404 }
2388 } 2405 }
2389 2406
2390 @override 2407 @override
2391 Object visitFunctionExpression(FunctionExpression node) { 2408 Object visitFunctionExpression(FunctionExpression node) {
2392 if (node.parent is! FunctionDeclaration) { 2409 if (node.parent is! FunctionDeclaration) {
2393 FunctionElement element = _findAtOffset( 2410 FunctionElement element = _findAtOffset(
(...skipping 11 matching lines...) Expand all
2405 } 2422 }
2406 2423
2407 @override 2424 @override
2408 Object visitFunctionTypeAlias(FunctionTypeAlias node) { 2425 Object visitFunctionTypeAlias(FunctionTypeAlias node) {
2409 FunctionTypeAliasElement outerAlias = _enclosingAlias; 2426 FunctionTypeAliasElement outerAlias = _enclosingAlias;
2410 try { 2427 try {
2411 SimpleIdentifier aliasName = node.name; 2428 SimpleIdentifier aliasName = node.name;
2412 _enclosingAlias = 2429 _enclosingAlias =
2413 _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName); 2430 _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
2414 super.visitFunctionTypeAlias(node); 2431 super.visitFunctionTypeAlias(node);
2415 _resolveMetadata(node.metadata, _enclosingAlias); 2432 _resolveMetadata(node, node.metadata, _enclosingAlias);
2416 return null; 2433 return null;
2417 } finally { 2434 } finally {
2418 _enclosingAlias = outerAlias; 2435 _enclosingAlias = outerAlias;
2419 } 2436 }
2420 } 2437 }
2421 2438
2422 @override 2439 @override
2423 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { 2440 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
2424 if (node.parent is! DefaultFormalParameter) { 2441 if (node.parent is! DefaultFormalParameter) {
2425 SimpleIdentifier parameterName = node.identifier; 2442 SimpleIdentifier parameterName = node.identifier;
2426 ParameterElement element = _getElementForParameter(node, parameterName); 2443 ParameterElement element = _getElementForParameter(node, parameterName);
2427 ParameterElement outerParameter = _enclosingParameter; 2444 ParameterElement outerParameter = _enclosingParameter;
2428 try { 2445 try {
2429 _enclosingParameter = element; 2446 _enclosingParameter = element;
2430 super.visitFunctionTypedFormalParameter(node); 2447 super.visitFunctionTypedFormalParameter(node);
2431 _resolveMetadata(node.metadata, _enclosingParameter); 2448 _resolveMetadata(node, node.metadata, _enclosingParameter);
2432 return null; 2449 return null;
2433 } finally { 2450 } finally {
2434 _enclosingParameter = outerParameter; 2451 _enclosingParameter = outerParameter;
2435 } 2452 }
2436 } else { 2453 } else {
2437 return super.visitFunctionTypedFormalParameter(node); 2454 return super.visitFunctionTypedFormalParameter(node);
2438 } 2455 }
2439 } 2456 }
2440 2457
2441 @override 2458 @override
2442 Object visitImportDirective(ImportDirective node) { 2459 Object visitImportDirective(ImportDirective node) {
2443 String uri = _getStringValue(node.uri);
2444 ImportElement importElement;
2445 if (uri != null) {
2446 LibraryElement library = _enclosingUnit.library;
2447 Source source = _enclosingUnit.context.sourceFactory
2448 .resolveUri(_enclosingUnit.source, uri);
2449 importElement = _findImport(node, library.imports, source);
2450 node.element = importElement;
2451 }
2452 super.visitImportDirective(node); 2460 super.visitImportDirective(node);
2453 _resolveMetadata(node.metadata, importElement); 2461 _resolveAnnotations(
2462 node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
2454 return null; 2463 return null;
2455 } 2464 }
2456 2465
2457 @override 2466 @override
2458 Object visitLabeledStatement(LabeledStatement node) { 2467 Object visitLabeledStatement(LabeledStatement node) {
2459 for (Label label in node.labels) { 2468 for (Label label in node.labels) {
2460 SimpleIdentifier labelName = label.label; 2469 SimpleIdentifier labelName = label.label;
2461 _findIdentifier(_enclosingExecutable.labels, labelName); 2470 _findIdentifier(_enclosingExecutable.labels, labelName);
2462 } 2471 }
2463 return super.visitLabeledStatement(node); 2472 return super.visitLabeledStatement(node);
2464 } 2473 }
2465 2474
2466 @override 2475 @override
2467 Object visitLibraryDirective(LibraryDirective node) { 2476 Object visitLibraryDirective(LibraryDirective node) {
2468 LibraryElement libraryElement = _enclosingUnit.library;
2469 node.element = libraryElement;
2470 super.visitLibraryDirective(node); 2477 super.visitLibraryDirective(node);
2471 _resolveMetadata(node.metadata, libraryElement); 2478 _resolveAnnotations(
2479 node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
2472 return null; 2480 return null;
2473 } 2481 }
2474 2482
2475 @override 2483 @override
2476 Object visitMethodDeclaration(MethodDeclaration node) { 2484 Object visitMethodDeclaration(MethodDeclaration node) {
2477 ExecutableElement outerExecutable = _enclosingExecutable; 2485 ExecutableElement outerExecutable = _enclosingExecutable;
2478 try { 2486 try {
2479 Token property = node.propertyKeyword; 2487 Token property = node.propertyKeyword;
2480 SimpleIdentifier methodName = node.name; 2488 SimpleIdentifier methodName = node.name;
2481 String nameOfMethod = methodName.name; 2489 String nameOfMethod = methodName.name;
(...skipping 11 matching lines...) Expand all
2493 accessor = _findIdentifier(_enclosingClass.accessors, methodName); 2501 accessor = _findIdentifier(_enclosingClass.accessors, methodName);
2494 } else if ((property as KeywordToken).keyword == Keyword.SET) { 2502 } else if ((property as KeywordToken).keyword == Keyword.SET) {
2495 accessor = _findWithNameAndOffset(_enclosingClass.accessors, 2503 accessor = _findWithNameAndOffset(_enclosingClass.accessors,
2496 methodName, nameOfMethod + '=', methodName.offset); 2504 methodName, nameOfMethod + '=', methodName.offset);
2497 _expectedElements.remove(accessor); 2505 _expectedElements.remove(accessor);
2498 methodName.staticElement = accessor; 2506 methodName.staticElement = accessor;
2499 } 2507 }
2500 _enclosingExecutable = accessor; 2508 _enclosingExecutable = accessor;
2501 } 2509 }
2502 super.visitMethodDeclaration(node); 2510 super.visitMethodDeclaration(node);
2503 _resolveMetadata(node.metadata, _enclosingExecutable); 2511 _resolveMetadata(node, node.metadata, _enclosingExecutable);
2504 return null; 2512 return null;
2505 } finally { 2513 } finally {
2506 _enclosingExecutable = outerExecutable; 2514 _enclosingExecutable = outerExecutable;
2507 } 2515 }
2508 } 2516 }
2509 2517
2510 @override 2518 @override
2511 Object visitPartDirective(PartDirective node) { 2519 Object visitPartDirective(PartDirective node) {
2512 String uri = _getStringValue(node.uri);
2513 CompilationUnitElement compilationUnitElement;
2514 if (uri != null) {
2515 Source partSource = _enclosingUnit.context.sourceFactory
2516 .resolveUri(_enclosingUnit.source, uri);
2517 compilationUnitElement =
2518 _findPart(_enclosingUnit.library.parts, node, partSource);
2519 }
2520 super.visitPartDirective(node); 2520 super.visitPartDirective(node);
2521 _resolveMetadata(node.metadata, compilationUnitElement); 2521 _resolveAnnotations(
2522 node, node.metadata, _enclosingUnit.getAnnotations(node.offset));
2522 return null; 2523 return null;
2523 } 2524 }
2524 2525
2525 @override 2526 @override
2526 Object visitPartOfDirective(PartOfDirective node) { 2527 Object visitPartOfDirective(PartOfDirective node) {
2527 node.element = _enclosingUnit.library; 2528 node.element = _enclosingUnit.library;
2528 return super.visitPartOfDirective(node); 2529 return super.visitPartOfDirective(node);
2529 } 2530 }
2530 2531
2531 @override 2532 @override
2532 Object visitSimpleFormalParameter(SimpleFormalParameter node) { 2533 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
2533 if (node.parent is! DefaultFormalParameter) { 2534 if (node.parent is! DefaultFormalParameter) {
2534 SimpleIdentifier parameterName = node.identifier; 2535 SimpleIdentifier parameterName = node.identifier;
2535 ParameterElement element = _getElementForParameter(node, parameterName); 2536 ParameterElement element = _getElementForParameter(node, parameterName);
2536 ParameterElement outerParameter = _enclosingParameter; 2537 ParameterElement outerParameter = _enclosingParameter;
2537 try { 2538 try {
2538 _enclosingParameter = element; 2539 _enclosingParameter = element;
2539 super.visitSimpleFormalParameter(node); 2540 super.visitSimpleFormalParameter(node);
2540 _resolveMetadata(node.metadata, element); 2541 _resolveMetadata(node, node.metadata, element);
2541 return null; 2542 return null;
2542 } finally { 2543 } finally {
2543 _enclosingParameter = outerParameter; 2544 _enclosingParameter = outerParameter;
2544 } 2545 }
2545 } else {} 2546 } else {}
2546 return super.visitSimpleFormalParameter(node); 2547 return super.visitSimpleFormalParameter(node);
2547 } 2548 }
2548 2549
2549 @override 2550 @override
2550 Object visitSwitchCase(SwitchCase node) { 2551 Object visitSwitchCase(SwitchCase node) {
2551 for (Label label in node.labels) { 2552 for (Label label in node.labels) {
2552 SimpleIdentifier labelName = label.label; 2553 SimpleIdentifier labelName = label.label;
2553 _findIdentifier(_enclosingExecutable.labels, labelName); 2554 _findIdentifier(_enclosingExecutable.labels, labelName);
2554 } 2555 }
2555 return super.visitSwitchCase(node); 2556 return super.visitSwitchCase(node);
2556 } 2557 }
2557 2558
2558 @override 2559 @override
2559 Object visitSwitchDefault(SwitchDefault node) { 2560 Object visitSwitchDefault(SwitchDefault node) {
2560 for (Label label in node.labels) { 2561 for (Label label in node.labels) {
2561 SimpleIdentifier labelName = label.label; 2562 SimpleIdentifier labelName = label.label;
2562 _findIdentifier(_enclosingExecutable.labels, labelName); 2563 _findIdentifier(_enclosingExecutable.labels, labelName);
2563 } 2564 }
2564 return super.visitSwitchDefault(node); 2565 return super.visitSwitchDefault(node);
2565 } 2566 }
2566 2567
2567 @override 2568 @override
2568 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { 2569 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
2569 super.visitTopLevelVariableDeclaration(node); 2570 super.visitTopLevelVariableDeclaration(node);
2570 _resolveMetadata(node.metadata, node.variables.variables[0].element); 2571 _resolveMetadata(node, node.metadata, node.variables.variables[0].element);
2571 return null; 2572 return null;
2572 } 2573 }
2573 2574
2574 @override 2575 @override
2575 Object visitTypeParameter(TypeParameter node) { 2576 Object visitTypeParameter(TypeParameter node) {
2576 SimpleIdentifier parameterName = node.name; 2577 SimpleIdentifier parameterName = node.name;
2577 Element element = null; 2578 Element element = null;
2578 if (_enclosingExecutable != null) { 2579 if (_enclosingExecutable != null) {
2579 element = _findIdentifier( 2580 element = _findIdentifier(
2580 _enclosingExecutable.typeParameters, parameterName, 2581 _enclosingExecutable.typeParameters, parameterName,
2581 required: false); 2582 required: false);
2582 } 2583 }
2583 if (element == null) { 2584 if (element == null) {
2584 if (_enclosingClass != null) { 2585 if (_enclosingClass != null) {
2585 element = 2586 element =
2586 _findIdentifier(_enclosingClass.typeParameters, parameterName); 2587 _findIdentifier(_enclosingClass.typeParameters, parameterName);
2587 } else if (_enclosingAlias != null) { 2588 } else if (_enclosingAlias != null) {
2588 element = 2589 element =
2589 _findIdentifier(_enclosingAlias.typeParameters, parameterName); 2590 _findIdentifier(_enclosingAlias.typeParameters, parameterName);
2590 } 2591 }
2591 } 2592 }
2592 if (element == null) { 2593 if (element == null) {
2593 String name = parameterName.name; 2594 String name = parameterName.name;
2594 int offset = parameterName.offset; 2595 int offset = parameterName.offset;
2595 _mismatch( 2596 _mismatch(
2596 'Could not find type parameter with name "$name" at $offset', node); 2597 'Could not find type parameter with name "$name" at $offset', node);
2597 } 2598 }
2598 super.visitTypeParameter(node); 2599 super.visitTypeParameter(node);
2599 _resolveMetadata(node.metadata, element); 2600 _resolveMetadata(node, node.metadata, element);
2600 return null; 2601 return null;
2601 } 2602 }
2602 2603
2603 @override 2604 @override
2604 Object visitVariableDeclaration(VariableDeclaration node) { 2605 Object visitVariableDeclaration(VariableDeclaration node) {
2605 VariableElement element = null; 2606 VariableElement element = null;
2606 SimpleIdentifier variableName = node.name; 2607 SimpleIdentifier variableName = node.name;
2607 if (_enclosingExecutable != null) { 2608 if (_enclosingExecutable != null) {
2608 element = _findIdentifier( 2609 element = _findIdentifier(
2609 _enclosingExecutable.localVariables, variableName, 2610 _enclosingExecutable.localVariables, variableName,
(...skipping 17 matching lines...) Expand all
2627 } 2628 }
2628 } 2629 }
2629 return super.visitVariableDeclaration(node); 2630 return super.visitVariableDeclaration(node);
2630 } 2631 }
2631 2632
2632 @override 2633 @override
2633 Object visitVariableDeclarationList(VariableDeclarationList node) { 2634 Object visitVariableDeclarationList(VariableDeclarationList node) {
2634 super.visitVariableDeclarationList(node); 2635 super.visitVariableDeclarationList(node);
2635 if (node.parent is! FieldDeclaration && 2636 if (node.parent is! FieldDeclaration &&
2636 node.parent is! TopLevelVariableDeclaration) { 2637 node.parent is! TopLevelVariableDeclaration) {
2637 _resolveMetadata(node.metadata, node.variables[0].element); 2638 _resolveMetadata(node, node.metadata, node.variables[0].element);
2638 } 2639 }
2639 return null; 2640 return null;
2640 } 2641 }
2641 2642
2642 /** 2643 /**
2643 * Return the element in the given list of [elements] that was created for the 2644 * Return the element in the given list of [elements] that was created for the
2644 * declaration at the given [offset]. Throw an [ElementMismatchException] if 2645 * declaration at the given [offset]. Throw an [ElementMismatchException] if
2645 * an element at that offset cannot be found. 2646 * an element at that offset cannot be found.
2646 * 2647 *
2647 * This method should only be used when there is no name associated with the 2648 * This method should only be used when there is no name associated with the
2648 * node. 2649 * node.
2649 */ 2650 */
2650 Element _findAtOffset(List<Element> elements, AstNode node, int offset) => 2651 Element _findAtOffset(List<Element> elements, AstNode node, int offset) =>
2651 _findWithNameAndOffset(elements, node, '', offset); 2652 _findWithNameAndOffset(elements, node, '', offset);
2652 2653
2653 /** 2654 /**
2654 * Return the export element from the given list of [exports] whose library
2655 * has the given [source]. Throw an [ElementMismatchException] if an element
2656 * corresponding to the identifier cannot be found.
2657 */
2658 ExportElement _findExport(
2659 ExportDirective node, List<ExportElement> exports, Source source) {
2660 if (source == null || !_context.exists(source)) {
2661 return null;
2662 }
2663 for (ExportElement export in exports) {
2664 if (export.exportedLibrary.source == source) {
2665 return export;
2666 }
2667 }
2668 _mismatch("Could not find export element for '$source'", node);
2669 return null; // Never reached
2670 }
2671
2672 /**
2673 * Return the element in the given list of [elements] that was created for the 2655 * Return the element in the given list of [elements] that was created for the
2674 * declaration with the given [identifier]. As a side-effect, associate the 2656 * declaration with the given [identifier]. As a side-effect, associate the
2675 * returned element with the identifier. Throw an [ElementMismatchException] 2657 * returned element with the identifier. Throw an [ElementMismatchException]
2676 * if an element corresponding to the identifier cannot be found unless 2658 * if an element corresponding to the identifier cannot be found unless
2677 * [required] is `false`, in which case return `null`. 2659 * [required] is `false`, in which case return `null`.
2678 */ 2660 */
2679 Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier, 2661 Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier,
2680 {bool required: true}) { 2662 {bool required: true}) {
2681 Element element = _findWithNameAndOffset( 2663 Element element = _findWithNameAndOffset(
2682 elements, identifier, identifier.name, identifier.offset, 2664 elements, identifier, identifier.name, identifier.offset,
2683 required: required); 2665 required: required);
2684 _expectedElements.remove(element); 2666 _expectedElements.remove(element);
2685 identifier.staticElement = element; 2667 identifier.staticElement = element;
2686 return element; 2668 return element;
2687 } 2669 }
2688 2670
2689 /** 2671 /**
2690 * Return the import element from the given list of [imports] whose library
2691 * has the given [source]. Throw an [ElementMismatchException] if an element
2692 * corresponding to the [source] cannot be found.
2693 */
2694 ImportElement _findImport(
2695 ImportDirective node, List<ImportElement> imports, Source source) {
2696 if (source == null || !_context.exists(source)) {
2697 return null;
2698 }
2699 SimpleIdentifier prefix = node.prefix;
2700 bool foundSource = false;
2701 for (ImportElement element in imports) {
2702 if (element.importedLibrary.source == source) {
2703 foundSource = true;
2704 PrefixElement prefixElement = element.prefix;
2705 if (prefix == null) {
2706 if (prefixElement == null) {
2707 return element;
2708 }
2709 } else {
2710 if (prefixElement != null &&
2711 prefix.name == prefixElement.displayName) {
2712 return element;
2713 }
2714 }
2715 }
2716 }
2717 if (foundSource) {
2718 if (prefix == null) {
2719 _mismatch(
2720 "Could not find import element for '$source' with no prefix", node);
2721 }
2722 _mismatch(
2723 "Could not find import element for '$source' with prefix ${prefix.name }",
2724 node);
2725 }
2726 _mismatch("Could not find import element for '$source'", node);
2727 return null; // Never reached
2728 }
2729
2730 /**
2731 * Return the element in the given list of [parts] that was created for the
2732 * part with the given [source]. Throw an [ElementMismatchException] if an
2733 * element corresponding to the source cannot be found.
2734 */
2735 CompilationUnitElement _findPart(List<CompilationUnitElement> parts,
2736 PartDirective directive, Source source) {
2737 for (CompilationUnitElement part in parts) {
2738 if (part.source == source) {
2739 return part;
2740 }
2741 }
2742 _mismatch(
2743 'Could not find compilation unit element for "$source"', directive);
2744 return null; // Never reached
2745 }
2746
2747 /**
2748 * Return the element in the given list of [elements] that was created for the 2672 * Return the element in the given list of [elements] that was created for the
2749 * declaration with the given [name] at the given [offset]. Throw an 2673 * declaration with the given [name] at the given [offset]. Throw an
2750 * [ElementMismatchException] if an element corresponding to the identifier 2674 * [ElementMismatchException] if an element corresponding to the identifier
2751 * cannot be found unless [required] is `false`, in which case return `null`. 2675 * cannot be found unless [required] is `false`, in which case return `null`.
2752 */ 2676 */
2753 Element _findWithNameAndOffset( 2677 Element _findWithNameAndOffset(
2754 List<Element> elements, AstNode node, String name, int offset, 2678 List<Element> elements, AstNode node, String name, int offset,
2755 {bool required: true}) { 2679 {bool required: true}) {
2756 for (Element element in elements) { 2680 for (Element element in elements) {
2757 if (element.nameOffset == offset && element.name == name) { 2681 if (element.nameOffset == offset && element.name == name) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2804 '(_enclosingParameter == null) == ${_enclosingParameter == null}'); 2728 '(_enclosingParameter == null) == ${_enclosingParameter == null}');
2805 buffer.writeln( 2729 buffer.writeln(
2806 '(_enclosingExecutable == null) == ${_enclosingExecutable == null}'); 2730 '(_enclosingExecutable == null) == ${_enclosingExecutable == null}');
2807 buffer.writeln('(_enclosingAlias == null) == ${_enclosingAlias == null}'); 2731 buffer.writeln('(_enclosingAlias == null) == ${_enclosingAlias == null}');
2808 _mismatch(buffer.toString(), parameterName); 2732 _mismatch(buffer.toString(), parameterName);
2809 } 2733 }
2810 return _findIdentifier(parameters, parameterName); 2734 return _findIdentifier(parameters, parameterName);
2811 } 2735 }
2812 2736
2813 /** 2737 /**
2814 * Return the value of the given string [literal], or `null` if the string is 2738 * Associate each of the annotation [nodes] with the corresponding
2815 * not a constant string without any string interpolation. 2739 * [ElementAnnotation] in [annotations]. If there is a problem, report it
2740 * against the given [parent] node.
2816 */ 2741 */
2817 String _getStringValue(StringLiteral literal) { 2742 void _resolveAnnotations(AstNode parent, NodeList<Annotation> nodes,
2818 if (literal is StringInterpolation) { 2743 List<ElementAnnotation> annotations) {
2819 return null; 2744 int nodeCount = nodes.length;
2745 if (nodeCount != annotations.length) {
Paul Berry 2016/03/04 22:02:11 Nit: in the previous version of the code, this che
Brian Wilkerson 2016/03/07 16:20:28 I made the change intentionally so that we would c
2746 _mismatch(
2747 'Found $nodeCount annotation nodes and ${annotations.length} element a nnotations',
Paul Berry 2016/03/04 22:02:11 Nit: this line is more than 80 columns. I recomme
Brian Wilkerson 2016/03/07 16:20:28 Done
2748 parent);
2820 } 2749 }
2821 return literal.stringValue; 2750 for (int i = 0; i < nodeCount; i++) {
2751 nodes[i].elementAnnotation = annotations[i];
2752 }
2822 } 2753 }
2823 2754
2824 /** 2755 /**
2825 * Throw an [ElementMismatchException] to report that the element model and 2756 * If [element] is not `null`, associate each of the annotation [nodes] with
2826 * the AST do not match. The [message] will have the path to the given [node] 2757 * the corresponding [ElementAnnotation] in [element.metadata]. If there is a
2827 * appended to it. 2758 * problem, report it against the given [parent] node.
2828 */
2829 void _mismatch(String message, AstNode node) {
2830 StringBuffer buffer = new StringBuffer();
2831 buffer.writeln(message);
2832 buffer.write('Path to root:');
2833 String separator = ' ';
2834 AstNode parent = node;
2835 while (parent != null) {
2836 buffer.write(separator);
2837 buffer.write(parent.runtimeType.toString());
2838 separator = ', ';
2839 parent = parent.parent;
2840 }
2841 throw new ElementMismatchException(buffer.toString());
2842 }
2843
2844 /**
2845 * If [element] is not `null`, associate each [Annotation] in [astMetadata]
2846 * with the corresponding [ElementAnnotation] in [element.metadata].
2847 * 2759 *
2848 * If [element] is `null`, do nothing--this allows us to be robust in the 2760 * If [element] is `null`, do nothing--this allows us to be robust in the
2849 * case where we are operating on an element model that hasn't been fully 2761 * case where we are operating on an element model that hasn't been fully
2850 * built. 2762 * built.
2851 */ 2763 */
2852 void _resolveMetadata(NodeList<Annotation> astMetadata, Element element) { 2764 void _resolveMetadata(
2765 AstNode parent, NodeList<Annotation> nodes, Element element) {
2853 if (element != null) { 2766 if (element != null) {
2854 List<ElementAnnotation> elementMetadata = element.metadata; 2767 _resolveAnnotations(parent, nodes, element.metadata);
2855 assert(astMetadata.length == elementMetadata.length);
2856 for (int i = 0; i < astMetadata.length; i++) {
2857 astMetadata[i].elementAnnotation = elementMetadata[i];
2858 }
2859 } 2768 }
2860 } 2769 }
2861 2770
2862 /** 2771 /**
2863 * Throw an exception if there are non-synthetic elements in the element model 2772 * Throw an exception if there are non-synthetic elements in the element model
2864 * that were not associated with an AST node. 2773 * that were not associated with an AST node.
2865 */ 2774 */
2866 void _validateResolution() { 2775 void _validateResolution() {
2867 if (_expectedElements.isNotEmpty) { 2776 if (_expectedElements.isNotEmpty) {
2868 StringBuffer buffer = new StringBuffer(); 2777 StringBuffer buffer = new StringBuffer();
2869 buffer.write(_expectedElements.length); 2778 buffer.write(_expectedElements.length);
2870 buffer.writeln(' unmatched elements found:'); 2779 buffer.writeln(' unmatched elements found:');
2871 for (Element element in _expectedElements) { 2780 for (Element element in _expectedElements) {
2872 buffer.write(' '); 2781 buffer.write(' ');
2873 buffer.writeln(element); 2782 buffer.writeln(element);
2874 } 2783 }
2875 throw new ElementMismatchException(buffer.toString()); 2784 throw new ElementMismatchException(buffer.toString());
2876 } 2785 }
2877 } 2786 }
2878 } 2787 }
2879 2788
2880 /** 2789 /**
2790 * A visitor that resolves directives in an AST structure to already built
2791 * elements.
2792 *
2793 * The resulting AST must have everything resolved that would have been resolved
2794 * by a [DirectiveElementBuilder].
2795 */
2796 class DirectiveResolver extends SimpleAstVisitor {
2797 CompilationUnitElementImpl _enclosingUnit;
2798
2799 @override
2800 void visitCompilationUnit(CompilationUnit node) {
2801 _enclosingUnit = node.element;
2802 for (Directive directive in node.directives) {
2803 directive.accept(this);
2804 }
2805 }
2806
2807 @override
2808 void visitExportDirective(ExportDirective node) {
2809 String uri = _getStringValue(node.uri);
2810 if (uri != null) {
2811 LibraryElement library = _enclosingUnit.library;
2812 Source source = _enclosingUnit.context.sourceFactory
2813 .resolveUri(_enclosingUnit.source, uri);
2814 ExportElement exportElement = _findExport(node, library.exports, source);
2815 node.element = exportElement;
2816 } else {
2817 node.element = null;
2818 }
2819 }
2820
2821 @override
2822 void visitImportDirective(ImportDirective node) {
2823 String uri = _getStringValue(node.uri);
2824 if (uri != null) {
2825 LibraryElement library = _enclosingUnit.library;
2826 Source source = _enclosingUnit.context.sourceFactory
2827 .resolveUri(_enclosingUnit.source, uri);
2828 ImportElement importElement = _findImport(node, library.imports, source);
2829 node.element = importElement;
2830 } else {
2831 node.element = null;
2832 }
2833 }
2834
2835 @override
2836 void visitLibraryDirective(LibraryDirective node) {
2837 node.element = _enclosingUnit.library;
2838 }
2839
2840 /**
2841 * Return the export element from the given list of [exports] whose library
2842 * has the given [source]. Throw an [ElementMismatchException] if an element
2843 * corresponding to the identifier cannot be found.
2844 */
2845 ExportElement _findExport(
2846 ExportDirective node, List<ExportElement> exports, Source source) {
2847 if (source == null || !_enclosingUnit.context.exists(source)) {
2848 return null;
2849 }
2850 for (ExportElement export in exports) {
2851 if (export.exportedLibrary.source == source) {
2852 return export;
2853 }
2854 }
2855 _mismatch("Could not find export element for '$source'", node);
2856 return null; // Never reached
2857 }
2858
2859 /**
2860 * Return the import element from the given list of [imports] whose library
2861 * has the given [source]. Throw an [ElementMismatchException] if an element
2862 * corresponding to the [source] cannot be found.
2863 */
2864 ImportElement _findImport(
2865 ImportDirective node, List<ImportElement> imports, Source source) {
2866 if (source == null || !_enclosingUnit.context.exists(source)) {
2867 return null;
2868 }
2869 SimpleIdentifier prefix = node.prefix;
2870 bool foundSource = false;
2871 for (ImportElement element in imports) {
2872 if (element.importedLibrary.source == source) {
2873 foundSource = true;
2874 PrefixElement prefixElement = element.prefix;
2875 if (prefix == null) {
2876 if (prefixElement == null) {
2877 return element;
2878 }
2879 } else {
2880 if (prefixElement != null &&
2881 prefix.name == prefixElement.displayName) {
2882 return element;
2883 }
2884 }
2885 }
2886 }
2887 if (foundSource) {
2888 if (prefix == null) {
2889 _mismatch(
2890 "Could not find import element for '$source' with no prefix", node);
2891 }
2892 _mismatch(
2893 "Could not find import element for '$source' with prefix ${prefix.name }",
2894 node);
2895 }
2896 _mismatch("Could not find any import element for '$source'", node);
2897 return null; // Never reached
2898 }
2899
2900 /**
2901 * Return the value of the given string [literal], or `null` if the string is
2902 * not a constant string without any string interpolation.
2903 */
2904 String _getStringValue(StringLiteral literal) {
2905 if (literal is StringInterpolation) {
2906 return null;
2907 }
2908 return literal.stringValue;
2909 }
2910 }
2911
2912 /**
2881 * Instances of the class `ElementHolder` hold on to elements created while trav ersing an AST 2913 * Instances of the class `ElementHolder` hold on to elements created while trav ersing an AST
2882 * structure so that they can be accessed when creating their enclosing element. 2914 * structure so that they can be accessed when creating their enclosing element.
2883 */ 2915 */
2884 class ElementHolder { 2916 class ElementHolder {
2885 List<PropertyAccessorElement> _accessors; 2917 List<PropertyAccessorElement> _accessors;
2886 2918
2887 List<ConstructorElement> _constructors; 2919 List<ConstructorElement> _constructors;
2888 2920
2889 List<ClassElement> _enums; 2921 List<ClassElement> _enums;
2890 2922
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
3248 } 3280 }
3249 3281
3250 /** 3282 /**
3251 * Instances of the class `EnclosedScope` implement a scope that is lexically en closed in 3283 * Instances of the class `EnclosedScope` implement a scope that is lexically en closed in
3252 * another scope. 3284 * another scope.
3253 */ 3285 */
3254 class EnclosedScope extends Scope { 3286 class EnclosedScope extends Scope {
3255 /** 3287 /**
3256 * The scope in which this scope is lexically enclosed. 3288 * The scope in which this scope is lexically enclosed.
3257 */ 3289 */
3290 @override
3258 final Scope enclosingScope; 3291 final Scope enclosingScope;
3259 3292
3260 /** 3293 /**
3261 * A table mapping names that will be defined in this scope, but right now are not initialized. 3294 * A table mapping names that will be defined in this scope, but right now are not initialized.
3262 * According to the scoping rules these names are hidden, even if they were de fined in an outer 3295 * According to the scoping rules these names are hidden, even if they were de fined in an outer
3263 * scope. 3296 * scope.
3264 */ 3297 */
3265 HashMap<String, Element> _hiddenElements = new HashMap<String, Element>(); 3298 HashMap<String, Element> _hiddenElements = new HashMap<String, Element>();
3266 3299
3267 /** 3300 /**
(...skipping 2771 matching lines...) Expand 10 before | Expand all | Expand 10 after
6039 */ 6072 */
6040 class LibraryImportScope extends Scope { 6073 class LibraryImportScope extends Scope {
6041 /** 6074 /**
6042 * The element representing the library in which this scope is enclosed. 6075 * The element representing the library in which this scope is enclosed.
6043 */ 6076 */
6044 final LibraryElement _definingLibrary; 6077 final LibraryElement _definingLibrary;
6045 6078
6046 /** 6079 /**
6047 * The listener that is to be informed when an error is encountered. 6080 * The listener that is to be informed when an error is encountered.
6048 */ 6081 */
6082 @override
6049 final AnalysisErrorListener errorListener; 6083 final AnalysisErrorListener errorListener;
6050 6084
6051 /** 6085 /**
6052 * A list of the namespaces representing the names that are available in this scope from imported 6086 * A list of the namespaces representing the names that are available in this scope from imported
6053 * libraries. 6087 * libraries.
6054 */ 6088 */
6055 List<Namespace> _importedNamespaces; 6089 List<Namespace> _importedNamespaces;
6056 6090
6057 /** 6091 /**
6058 * Initialize a newly created scope representing the names imported into the g iven library. 6092 * Initialize a newly created scope representing the names imported into the g iven library.
(...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after
7236 7270
7237 /** 7271 /**
7238 * The type system in use during resolution. 7272 * The type system in use during resolution.
7239 */ 7273 */
7240 TypeSystem typeSystem; 7274 TypeSystem typeSystem;
7241 7275
7242 /** 7276 /**
7243 * The class element representing the class containing the current node, 7277 * The class element representing the class containing the current node,
7244 * or `null` if the current node is not contained in a class. 7278 * or `null` if the current node is not contained in a class.
7245 */ 7279 */
7280 @override
7246 ClassElement enclosingClass = null; 7281 ClassElement enclosingClass = null;
7247 7282
7248 /** 7283 /**
7249 * The class declaration representing the class containing the current node, o r `null` if 7284 * The class declaration representing the class containing the current node, o r `null` if
7250 * the current node is not contained in a class. 7285 * the current node is not contained in a class.
7251 */ 7286 */
7252 ClassDeclaration _enclosingClassDeclaration = null; 7287 ClassDeclaration _enclosingClassDeclaration = null;
7253 7288
7254 /** 7289 /**
7255 * The function type alias representing the function type containing the curre nt node, or 7290 * The function type alias representing the function type containing the curre nt node, or
(...skipping 5684 matching lines...) Expand 10 before | Expand all | Expand 10 after
12940 nonFields.add(node); 12975 nonFields.add(node);
12941 return null; 12976 return null;
12942 } 12977 }
12943 12978
12944 @override 12979 @override
12945 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); 12980 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
12946 12981
12947 @override 12982 @override
12948 Object visitWithClause(WithClause node) => null; 12983 Object visitWithClause(WithClause node) => null;
12949 } 12984 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698