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

Side by Side Diff: pkg/analyzer/lib/dart/element/visitor.dart

Issue 2623453003: Add visitors that throw by default (Closed)
Patch Set: rework implementation Created 3 years, 11 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 /** 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
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
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
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
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 }
OLDNEW
« pkg/analyzer/lib/dart/element/element.dart ('K') | « pkg/analyzer/lib/dart/element/element.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698