| 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 /** | 5 /** |
| 6 * Defines element visitors that support useful patterns for visiting the | 6 * Defines element visitors that support useful patterns for visiting the |
| 7 * elements in an [element model](element.dart). | 7 * elements in an [element model](element.dart). |
| 8 * | 8 * |
| 9 * Dart is an evolving language, and the element model must evolved with it. | 9 * Dart is an evolving language, and the element model must evolved with it. |
| 10 * When the element model changes, the visitor interface will sometimes change | 10 * When the element model changes, the visitor interface will sometimes change |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 * LocalVariableElement | 75 * LocalVariableElement |
| 76 * ParameterElement | 76 * ParameterElement |
| 77 * FieldFormalParameterElement | 77 * FieldFormalParameterElement |
| 78 * </pre> | 78 * </pre> |
| 79 * | 79 * |
| 80 * Subclasses that override a visit method must either invoke the overridden | 80 * Subclasses that override a visit method must either invoke the overridden |
| 81 * visit method or explicitly invoke the more general visit method. Failure to | 81 * visit method or explicitly invoke the more general visit method. Failure to |
| 82 * do so will cause the visit methods for superclasses of the element to not be | 82 * do so will cause the visit methods for superclasses of the element to not be |
| 83 * invoked and will cause the children of the visited node to not be visited. | 83 * invoked and will cause the children of the visited node to not be visited. |
| 84 * | 84 * |
| 85 * Clients may extend or implement this class. | 85 * Clients may extend this class. |
| 86 */ | 86 */ |
| 87 class GeneralizingElementVisitor<R> implements ElementVisitor<R> { | 87 class GeneralizingElementVisitor<R> implements ElementVisitor<R> { |
| 88 @override | 88 @override |
| 89 R visitClassElement(ClassElement element) => visitElement(element); | 89 R visitClassElement(ClassElement element) => visitElement(element); |
| 90 | 90 |
| 91 @override | 91 @override |
| 92 R visitCompilationUnitElement(CompilationUnitElement element) => | 92 R visitCompilationUnitElement(CompilationUnitElement element) => |
| 93 visitElement(element); | 93 visitElement(element); |
| 94 | 94 |
| 95 @override | 95 @override |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 * A visitor that will recursively visit all of the element in an element model. | 182 * A visitor that will recursively visit all of the element in an element model. |
| 183 * For example, using an instance of this class to visit a | 183 * For example, using an instance of this class to visit a |
| 184 * [CompilationUnitElement] will also cause all of the types in the compilation | 184 * [CompilationUnitElement] will also cause all of the types in the compilation |
| 185 * unit to be visited. | 185 * unit to be visited. |
| 186 * | 186 * |
| 187 * Subclasses that override a visit method must either invoke the overridden | 187 * Subclasses that override a visit method must either invoke the overridden |
| 188 * visit method or must explicitly ask the visited element to visit its | 188 * visit method or must explicitly ask the visited element to visit its |
| 189 * children. Failure to do so will cause the children of the visited element to | 189 * children. Failure to do so will cause the children of the visited element to |
| 190 * not be visited. | 190 * not be visited. |
| 191 * | 191 * |
| 192 * Clients may extend or implement this class. | 192 * Clients may extend this class. |
| 193 */ | 193 */ |
| 194 class RecursiveElementVisitor<R> implements ElementVisitor<R> { | 194 class RecursiveElementVisitor<R> implements ElementVisitor<R> { |
| 195 @override | 195 @override |
| 196 R visitClassElement(ClassElement element) { | 196 R visitClassElement(ClassElement element) { |
| 197 element.visitChildren(this); | 197 element.visitChildren(this); |
| 198 return null; | 198 return null; |
| 199 } | 199 } |
| 200 | 200 |
| 201 @override | 201 @override |
| 202 R visitCompilationUnitElement(CompilationUnitElement element) { | 202 R visitCompilationUnitElement(CompilationUnitElement element) { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 return null; | 306 return null; |
| 307 } | 307 } |
| 308 } | 308 } |
| 309 | 309 |
| 310 /** | 310 /** |
| 311 * A visitor that will do nothing when visiting an element. It is intended to be | 311 * A visitor that will do nothing when visiting an element. It is intended to be |
| 312 * a superclass for classes that use the visitor pattern primarily as a dispatch | 312 * a superclass for classes that use the visitor pattern primarily as a dispatch |
| 313 * mechanism (and hence don't need to recursively visit a whole structure) and | 313 * mechanism (and hence don't need to recursively visit a whole structure) and |
| 314 * that only need to visit a small number of element types. | 314 * that only need to visit a small number of element types. |
| 315 * | 315 * |
| 316 * Clients may extend or implement this class. | 316 * Clients may extend this class. |
| 317 */ | 317 */ |
| 318 class SimpleElementVisitor<R> implements ElementVisitor<R> { | 318 class SimpleElementVisitor<R> implements ElementVisitor<R> { |
| 319 @override | 319 @override |
| 320 R visitClassElement(ClassElement element) => null; | 320 R visitClassElement(ClassElement element) => null; |
| 321 | 321 |
| 322 @override | 322 @override |
| 323 R visitCompilationUnitElement(CompilationUnitElement element) => null; | 323 R visitCompilationUnitElement(CompilationUnitElement element) => null; |
| 324 | 324 |
| 325 @override | 325 @override |
| 326 R visitConstructorElement(ConstructorElement element) => null; | 326 R visitConstructorElement(ConstructorElement element) => null; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 | 367 |
| 368 @override | 368 @override |
| 369 R visitPropertyAccessorElement(PropertyAccessorElement element) => null; | 369 R visitPropertyAccessorElement(PropertyAccessorElement element) => null; |
| 370 | 370 |
| 371 @override | 371 @override |
| 372 R visitTopLevelVariableElement(TopLevelVariableElement element) => null; | 372 R visitTopLevelVariableElement(TopLevelVariableElement element) => null; |
| 373 | 373 |
| 374 @override | 374 @override |
| 375 R visitTypeParameterElement(TypeParameterElement element) => null; | 375 R visitTypeParameterElement(TypeParameterElement element) => null; |
| 376 } | 376 } |
| 377 |
| 378 /** |
| 379 * An AST visitor that will throw an exception if any of the visit methods that |
| 380 * are invoked have not been overridden. It is intended to be a superclass for |
| 381 * classes that implement the visitor pattern and need to override all of the |
| 382 * visit methods. |
| 383 * |
| 384 * Clients may extend this class. |
| 385 */ |
| 386 class ThrowingElementVisitor<R> implements ElementVisitor<R> { |
| 387 @override |
| 388 R visitClassElement(ClassElement element) => _throw(element); |
| 389 |
| 390 @override |
| 391 R visitCompilationUnitElement(CompilationUnitElement element) => |
| 392 _throw(element); |
| 393 |
| 394 @override |
| 395 R visitConstructorElement(ConstructorElement element) => _throw(element); |
| 396 |
| 397 @override |
| 398 R visitExportElement(ExportElement element) => _throw(element); |
| 399 |
| 400 @override |
| 401 R visitFieldElement(FieldElement element) => _throw(element); |
| 402 |
| 403 @override |
| 404 R visitFieldFormalParameterElement(FieldFormalParameterElement element) => |
| 405 _throw(element); |
| 406 |
| 407 @override |
| 408 R visitFunctionElement(FunctionElement element) => _throw(element); |
| 409 |
| 410 @override |
| 411 R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => |
| 412 _throw(element); |
| 413 |
| 414 @override |
| 415 R visitImportElement(ImportElement element) => _throw(element); |
| 416 |
| 417 @override |
| 418 R visitLabelElement(LabelElement element) => _throw(element); |
| 419 |
| 420 @override |
| 421 R visitLibraryElement(LibraryElement element) => _throw(element); |
| 422 |
| 423 @override |
| 424 R visitLocalVariableElement(LocalVariableElement element) => _throw(element); |
| 425 |
| 426 @override |
| 427 R visitMethodElement(MethodElement element) => _throw(element); |
| 428 |
| 429 @override |
| 430 R visitMultiplyDefinedElement(MultiplyDefinedElement element) => |
| 431 _throw(element); |
| 432 |
| 433 @override |
| 434 R visitParameterElement(ParameterElement element) => _throw(element); |
| 435 |
| 436 @override |
| 437 R visitPrefixElement(PrefixElement element) => _throw(element); |
| 438 |
| 439 @override |
| 440 R visitPropertyAccessorElement(PropertyAccessorElement element) => |
| 441 _throw(element); |
| 442 |
| 443 @override |
| 444 R visitTopLevelVariableElement(TopLevelVariableElement element) => |
| 445 _throw(element); |
| 446 |
| 447 @override |
| 448 R visitTypeParameterElement(TypeParameterElement element) => _throw(element); |
| 449 |
| 450 R _throw(Element element) { |
| 451 throw new Exception( |
| 452 'Missing implementation of visit${element.runtimeType}'); |
| 453 } |
| 454 } |
| OLD | NEW |