blob: ac77c443779555cbeb6157731608d192cc1b7dcd [file] [log] [blame]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/exception/exception.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/lint/analysis_rule_timers.dart';
import 'package:analyzer/src/lint/linter.dart';
/// The AST visitor that runs handlers for nodes from the [_registry].
class AnalysisRuleVisitor implements AstVisitor<void> {
final NodeLintRegistry _registry;
/// Whether exceptions should be propagated (by rethrowing them).
final bool _shouldPropagateExceptions;
AnalysisRuleVisitor(
this._registry, {
bool shouldPropagateExceptions = false,
}) : _shouldPropagateExceptions = shouldPropagateExceptions;
void afterLibrary() {
_runAfterLibrarySubscriptions(_registry._afterLibrary);
}
@override
void visitAdjacentStrings(AdjacentStrings node) {
_runSubscriptions(node, _registry._forAdjacentStrings);
node.visitChildren(this);
}
@override
void visitAnnotation(Annotation node) {
_runSubscriptions(node, _registry._forAnnotation);
node.visitChildren(this);
}
@override
void visitArgumentList(ArgumentList node) {
_runSubscriptions(node, _registry._forArgumentList);
node.visitChildren(this);
}
@override
void visitAsExpression(AsExpression node) {
_runSubscriptions(node, _registry._forAsExpression);
node.visitChildren(this);
}
@override
void visitAssertInitializer(AssertInitializer node) {
_runSubscriptions(node, _registry._forAssertInitializer);
node.visitChildren(this);
}
@override
void visitAssertStatement(AssertStatement node) {
_runSubscriptions(node, _registry._forAssertStatement);
node.visitChildren(this);
}
@override
void visitAssignedVariablePattern(AssignedVariablePattern node) {
_runSubscriptions(node, _registry._forAssignedVariablePattern);
node.visitChildren(this);
}
@override
void visitAssignmentExpression(AssignmentExpression node) {
_runSubscriptions(node, _registry._forAssignmentExpression);
node.visitChildren(this);
}
@override
void visitAugmentedExpression(AugmentedExpression node) {
_runSubscriptions(node, _registry._forAugmentedExpression);
node.visitChildren(this);
}
@override
void visitAugmentedInvocation(AugmentedInvocation node) {
_runSubscriptions(node, _registry._forAugmentedInvocation);
node.visitChildren(this);
}
@override
void visitAwaitExpression(AwaitExpression node) {
_runSubscriptions(node, _registry._forAwaitExpression);
node.visitChildren(this);
}
@override
void visitBinaryExpression(BinaryExpression node) {
_runSubscriptions(node, _registry._forBinaryExpression);
node.visitChildren(this);
}
@override
void visitBlock(Block node) {
_runSubscriptions(node, _registry._forBlock);
node.visitChildren(this);
}
@override
void visitBlockFunctionBody(BlockFunctionBody node) {
_runSubscriptions(node, _registry._forBlockFunctionBody);
node.visitChildren(this);
}
@override
void visitBooleanLiteral(BooleanLiteral node) {
_runSubscriptions(node, _registry._forBooleanLiteral);
node.visitChildren(this);
}
@override
void visitBreakStatement(BreakStatement node) {
_runSubscriptions(node, _registry._forBreakStatement);
node.visitChildren(this);
}
@override
void visitCascadeExpression(CascadeExpression node) {
_runSubscriptions(node, _registry._forCascadeExpression);
node.visitChildren(this);
}
@override
void visitCaseClause(CaseClause node) {
_runSubscriptions(node, _registry._forCaseClause);
node.visitChildren(this);
}
@override
void visitCastPattern(CastPattern node) {
_runSubscriptions(node, _registry._forCastPattern);
node.visitChildren(this);
}
@override
void visitCatchClause(CatchClause node) {
_runSubscriptions(node, _registry._forCatchClause);
node.visitChildren(this);
}
@override
void visitCatchClauseParameter(CatchClauseParameter node) {
_runSubscriptions(node, _registry._forCatchClauseParameter);
node.visitChildren(this);
}
@override
void visitClassDeclaration(ClassDeclaration node) {
_runSubscriptions(node, _registry._forClassDeclaration);
node.visitChildren(this);
}
@override
void visitClassTypeAlias(ClassTypeAlias node) {
_runSubscriptions(node, _registry._forClassTypeAlias);
node.visitChildren(this);
}
@override
void visitComment(Comment node) {
_runSubscriptions(node, _registry._forComment);
node.visitChildren(this);
}
@override
void visitCommentReference(CommentReference node) {
_runSubscriptions(node, _registry._forCommentReference);
node.visitChildren(this);
}
@override
void visitCompilationUnit(CompilationUnit node) {
_runSubscriptions(node, _registry._forCompilationUnit);
node.visitChildren(this);
}
@override
void visitConditionalExpression(ConditionalExpression node) {
_runSubscriptions(node, _registry._forConditionalExpression);
node.visitChildren(this);
}
@override
void visitConfiguration(Configuration node) {
_runSubscriptions(node, _registry._forConfiguration);
node.visitChildren(this);
}
@override
void visitConstantPattern(ConstantPattern node) {
_runSubscriptions(node, _registry._forConstantPattern);
node.visitChildren(this);
}
@override
void visitConstructorDeclaration(ConstructorDeclaration node) {
_runSubscriptions(node, _registry._forConstructorDeclaration);
node.visitChildren(this);
}
@override
void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
_runSubscriptions(node, _registry._forConstructorFieldInitializer);
node.visitChildren(this);
}
@override
void visitConstructorName(ConstructorName node) {
_runSubscriptions(node, _registry._forConstructorName);
node.visitChildren(this);
}
@override
void visitConstructorReference(ConstructorReference node) {
_runSubscriptions(node, _registry._forConstructorReference);
node.visitChildren(this);
}
@override
void visitConstructorSelector(ConstructorSelector node) {
_runSubscriptions(node, _registry._forConstructorSelector);
node.visitChildren(this);
}
@override
void visitContinueStatement(ContinueStatement node) {
_runSubscriptions(node, _registry._forContinueStatement);
node.visitChildren(this);
}
@override
void visitDeclaredIdentifier(DeclaredIdentifier node) {
_runSubscriptions(node, _registry._forDeclaredIdentifier);
node.visitChildren(this);
}
@override
void visitDeclaredVariablePattern(DeclaredVariablePattern node) {
_runSubscriptions(node, _registry._forDeclaredVariablePattern);
node.visitChildren(this);
}
@override
void visitDefaultFormalParameter(DefaultFormalParameter node) {
_runSubscriptions(node, _registry._forDefaultFormalParameter);
node.visitChildren(this);
}
@override
void visitDoStatement(DoStatement node) {
_runSubscriptions(node, _registry._forDoStatement);
node.visitChildren(this);
}
@override
void visitDotShorthandInvocation(DotShorthandInvocation node) {
_runSubscriptions(node, _registry._forDotShorthandInvocation);
node.visitChildren(this);
}
@override
void visitDotShorthandPropertyAccess(DotShorthandPropertyAccess node) {
_runSubscriptions(node, _registry._forDotShorthandPropertyAccess);
node.visitChildren(this);
}
@override
void visitDottedName(DottedName node) {
_runSubscriptions(node, _registry._forDottedName);
node.visitChildren(this);
}
@override
void visitDoubleLiteral(DoubleLiteral node) {
_runSubscriptions(node, _registry._forDoubleLiteral);
node.visitChildren(this);
}
@override
void visitEmptyFunctionBody(EmptyFunctionBody node) {
_runSubscriptions(node, _registry._forEmptyFunctionBody);
node.visitChildren(this);
}
@override
void visitEmptyStatement(EmptyStatement node) {
_runSubscriptions(node, _registry._forEmptyStatement);
node.visitChildren(this);
}
@override
void visitEnumConstantArguments(EnumConstantArguments node) {
_runSubscriptions(node, _registry._forEnumConstantArguments);
node.visitChildren(this);
}
@override
void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
_runSubscriptions(node, _registry._forEnumConstantDeclaration);
node.visitChildren(this);
}
@override
void visitEnumDeclaration(EnumDeclaration node) {
_runSubscriptions(node, _registry._forEnumDeclaration);
node.visitChildren(this);
}
@override
void visitExportDirective(ExportDirective node) {
_runSubscriptions(node, _registry._forExportDirective);
node.visitChildren(this);
}
@override
void visitExpressionFunctionBody(ExpressionFunctionBody node) {
_runSubscriptions(node, _registry._forExpressionFunctionBody);
node.visitChildren(this);
}
@override
void visitExpressionStatement(ExpressionStatement node) {
_runSubscriptions(node, _registry._forExpressionStatement);
node.visitChildren(this);
}
@override
void visitExtendsClause(ExtendsClause node) {
_runSubscriptions(node, _registry._forExtendsClause);
node.visitChildren(this);
}
@override
void visitExtensionDeclaration(ExtensionDeclaration node) {
_runSubscriptions(node, _registry._forExtensionDeclaration);
node.visitChildren(this);
}
@override
void visitExtensionOnClause(ExtensionOnClause node) {
_runSubscriptions(node, _registry._forExtensionOnClause);
node.visitChildren(this);
}
@override
void visitExtensionOverride(ExtensionOverride node) {
_runSubscriptions(node, _registry._forExtensionOverride);
node.visitChildren(this);
}
@override
void visitExtensionTypeDeclaration(ExtensionTypeDeclaration node) {
_runSubscriptions(node, _registry._forExtensionTypeDeclaration);
node.visitChildren(this);
}
@override
void visitFieldDeclaration(FieldDeclaration node) {
_runSubscriptions(node, _registry._forFieldDeclaration);
node.visitChildren(this);
}
@override
void visitFieldFormalParameter(FieldFormalParameter node) {
_runSubscriptions(node, _registry._forFieldFormalParameter);
node.visitChildren(this);
}
@override
void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
_runSubscriptions(node, _registry._forForEachPartsWithDeclaration);
node.visitChildren(this);
}
@override
void visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
_runSubscriptions(node, _registry._forForEachPartsWithIdentifier);
node.visitChildren(this);
}
@override
void visitForEachPartsWithPattern(ForEachPartsWithPattern node) {
_runSubscriptions(node, _registry._forForEachPartsWithPattern);
node.visitChildren(this);
}
@override
void visitForElement(ForElement node) {
_runSubscriptions(node, _registry._forForElement);
node.visitChildren(this);
}
@override
void visitFormalParameterList(FormalParameterList node) {
_runSubscriptions(node, _registry._forFormalParameterList);
node.visitChildren(this);
}
@override
void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
_runSubscriptions(node, _registry._forForPartsWithDeclarations);
node.visitChildren(this);
}
@override
void visitForPartsWithExpression(ForPartsWithExpression node) {
_runSubscriptions(node, _registry._forForPartsWithExpression);
node.visitChildren(this);
}
@override
void visitForPartsWithPattern(ForPartsWithPattern node) {
_runSubscriptions(node, _registry._forForPartsWithPattern);
node.visitChildren(this);
}
@override
void visitForStatement(ForStatement node) {
_runSubscriptions(node, _registry._forForStatement);
node.visitChildren(this);
}
@override
void visitFunctionDeclaration(FunctionDeclaration node) {
_runSubscriptions(node, _registry._forFunctionDeclaration);
node.visitChildren(this);
}
@override
void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
_runSubscriptions(node, _registry._forFunctionDeclarationStatement);
node.visitChildren(this);
}
@override
void visitFunctionExpression(FunctionExpression node) {
_runSubscriptions(node, _registry._forFunctionExpression);
node.visitChildren(this);
}
@override
void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
_runSubscriptions(node, _registry._forFunctionExpressionInvocation);
node.visitChildren(this);
}
@override
void visitFunctionReference(FunctionReference node) {
_runSubscriptions(node, _registry._forFunctionReference);
node.visitChildren(this);
}
@override
void visitFunctionTypeAlias(FunctionTypeAlias node) {
_runSubscriptions(node, _registry._forFunctionTypeAlias);
node.visitChildren(this);
}
@override
void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
_runSubscriptions(node, _registry._forFunctionTypedFormalParameter);
node.visitChildren(this);
}
@override
void visitGenericFunctionType(GenericFunctionType node) {
_runSubscriptions(node, _registry._forGenericFunctionType);
node.visitChildren(this);
}
@override
void visitGenericTypeAlias(GenericTypeAlias node) {
_runSubscriptions(node, _registry._forGenericTypeAlias);
node.visitChildren(this);
}
@override
void visitGuardedPattern(GuardedPattern node) {
_runSubscriptions(node, _registry._forCaseClause);
node.visitChildren(this);
}
@override
void visitHideCombinator(HideCombinator node) {
_runSubscriptions(node, _registry._forHideCombinator);
node.visitChildren(this);
}
@override
void visitIfElement(IfElement node) {
_runSubscriptions(node, _registry._forIfElement);
node.visitChildren(this);
}
@override
void visitIfStatement(IfStatement node) {
_runSubscriptions(node, _registry._forIfStatement);
node.visitChildren(this);
}
@override
void visitImplementsClause(ImplementsClause node) {
_runSubscriptions(node, _registry._forImplementsClause);
node.visitChildren(this);
}
@override
void visitImplicitCallReference(ImplicitCallReference node) {
_runSubscriptions(node, _registry._forImplicitCallReference);
node.visitChildren(this);
}
@override
void visitImportDirective(ImportDirective node) {
_runSubscriptions(node, _registry._forImportDirective);
node.visitChildren(this);
}
@override
void visitImportPrefixReference(ImportPrefixReference node) {
_runSubscriptions(node, _registry._forImportPrefixReference);
node.visitChildren(this);
}
@override
void visitIndexExpression(IndexExpression node) {
_runSubscriptions(node, _registry._forIndexExpression);
node.visitChildren(this);
}
@override
void visitInstanceCreationExpression(InstanceCreationExpression node) {
_runSubscriptions(node, _registry._forInstanceCreationExpression);
node.visitChildren(this);
}
@override
void visitIntegerLiteral(IntegerLiteral node) {
_runSubscriptions(node, _registry._forIntegerLiteral);
node.visitChildren(this);
}
@override
void visitInterpolationExpression(InterpolationExpression node) {
_runSubscriptions(node, _registry._forInterpolationExpression);
node.visitChildren(this);
}
@override
void visitInterpolationString(InterpolationString node) {
_runSubscriptions(node, _registry._forInterpolationString);
node.visitChildren(this);
}
@override
void visitIsExpression(IsExpression node) {
_runSubscriptions(node, _registry._forIsExpression);
node.visitChildren(this);
}
@override
void visitLabel(Label node) {
_runSubscriptions(node, _registry._forLabel);
node.visitChildren(this);
}
@override
void visitLabeledStatement(LabeledStatement node) {
_runSubscriptions(node, _registry._forLabeledStatement);
node.visitChildren(this);
}
@override
void visitLibraryDirective(LibraryDirective node) {
_runSubscriptions(node, _registry._forLibraryDirective);
node.visitChildren(this);
}
@override
void visitLibraryIdentifier(LibraryIdentifier node) {
_runSubscriptions(node, _registry._forLibraryIdentifier);
node.visitChildren(this);
}
@override
void visitListLiteral(ListLiteral node) {
_runSubscriptions(node, _registry._forListLiteral);
node.visitChildren(this);
}
@override
void visitListPattern(ListPattern node) {
_runSubscriptions(node, _registry._forListPattern);
node.visitChildren(this);
}
@override
void visitLogicalAndPattern(LogicalAndPattern node) {
_runSubscriptions(node, _registry._forLogicalAndPattern);
node.visitChildren(this);
}
@override
void visitLogicalOrPattern(LogicalOrPattern node) {
_runSubscriptions(node, _registry._forLogicalOrPattern);
node.visitChildren(this);
}
@override
void visitMapLiteralEntry(MapLiteralEntry node) {
_runSubscriptions(node, _registry._forMapLiteralEntry);
node.visitChildren(this);
}
@override
void visitMapPattern(MapPattern node) {
_runSubscriptions(node, _registry._forMapPattern);
node.visitChildren(this);
}
@override
void visitMapPatternEntry(MapPatternEntry node) {
_runSubscriptions(node, _registry._forMapPatternEntry);
node.visitChildren(this);
}
@override
void visitMethodDeclaration(MethodDeclaration node) {
_runSubscriptions(node, _registry._forMethodDeclaration);
node.visitChildren(this);
}
@override
void visitMethodInvocation(MethodInvocation node) {
_runSubscriptions(node, _registry._forMethodInvocation);
node.visitChildren(this);
}
@override
void visitMixinDeclaration(MixinDeclaration node) {
_runSubscriptions(node, _registry._forMixinDeclaration);
node.visitChildren(this);
}
@override
void visitMixinOnClause(MixinOnClause node) {
_runSubscriptions(node, _registry._forMixinOnClause);
node.visitChildren(this);
}
@override
void visitNamedExpression(NamedExpression node) {
_runSubscriptions(node, _registry._forNamedExpression);
node.visitChildren(this);
}
@override
void visitNamedType(NamedType node) {
_runSubscriptions(node, _registry._forNamedType);
node.visitChildren(this);
}
@override
void visitNativeClause(NativeClause node) {
_runSubscriptions(node, _registry._forNativeClause);
node.visitChildren(this);
}
@override
void visitNativeFunctionBody(NativeFunctionBody node) {
_runSubscriptions(node, _registry._forNativeFunctionBody);
node.visitChildren(this);
}
@override
void visitNullAssertPattern(NullAssertPattern node) {
_runSubscriptions(node, _registry._forNullAssertPattern);
node.visitChildren(this);
}
@override
void visitNullAwareElement(NullAwareElement node) {
_runSubscriptions(node, _registry._forNullAwareElement);
node.visitChildren(this);
}
@override
void visitNullCheckPattern(NullCheckPattern node) {
_runSubscriptions(node, _registry._forNullCheckPattern);
node.visitChildren(this);
}
@override
void visitNullLiteral(NullLiteral node) {
_runSubscriptions(node, _registry._forNullLiteral);
node.visitChildren(this);
}
@override
void visitObjectPattern(ObjectPattern node) {
_runSubscriptions(node, _registry._forObjectPattern);
node.visitChildren(this);
}
@override
void visitParenthesizedExpression(ParenthesizedExpression node) {
_runSubscriptions(node, _registry._forParenthesizedExpression);
node.visitChildren(this);
}
@override
void visitParenthesizedPattern(ParenthesizedPattern node) {
_runSubscriptions(node, _registry._forParenthesizedPattern);
node.visitChildren(this);
}
@override
void visitPartDirective(PartDirective node) {
_runSubscriptions(node, _registry._forPartDirective);
node.visitChildren(this);
}
@override
void visitPartOfDirective(PartOfDirective node) {
_runSubscriptions(node, _registry._forPartOfDirective);
node.visitChildren(this);
}
@override
void visitPatternAssignment(PatternAssignment node) {
_runSubscriptions(node, _registry._forPatternAssignment);
node.visitChildren(this);
}
@override
void visitPatternField(PatternField node) {
_runSubscriptions(node, _registry._forPatternField);
node.visitChildren(this);
}
@override
void visitPatternFieldName(PatternFieldName node) {
_runSubscriptions(node, _registry._forPatternFieldName);
node.visitChildren(this);
}
@override
void visitPatternVariableDeclaration(PatternVariableDeclaration node) {
_runSubscriptions(node, _registry._forPatternVariableDeclaration);
node.visitChildren(this);
}
@override
void visitPatternVariableDeclarationStatement(
PatternVariableDeclarationStatement node) {
_runSubscriptions(node, _registry._forPatternVariableDeclarationStatement);
node.visitChildren(this);
}
@override
void visitPostfixExpression(PostfixExpression node) {
_runSubscriptions(node, _registry._forPostfixExpression);
node.visitChildren(this);
}
@override
void visitPrefixedIdentifier(PrefixedIdentifier node) {
_runSubscriptions(node, _registry._forPrefixedIdentifier);
node.visitChildren(this);
}
@override
void visitPrefixExpression(PrefixExpression node) {
_runSubscriptions(node, _registry._forPrefixExpression);
node.visitChildren(this);
}
@override
void visitPropertyAccess(PropertyAccess node) {
_runSubscriptions(node, _registry._forPropertyAccess);
node.visitChildren(this);
}
@override
void visitRecordLiteral(RecordLiteral node) {
_runSubscriptions(node, _registry._forRecordLiterals);
node.visitChildren(this);
}
@override
void visitRecordPattern(RecordPattern node) {
_runSubscriptions(node, _registry._forRecordPattern);
node.visitChildren(this);
}
@override
void visitRecordTypeAnnotation(RecordTypeAnnotation node) {
_runSubscriptions(node, _registry._forRecordTypeAnnotation);
node.visitChildren(this);
}
@override
void visitRecordTypeAnnotationNamedField(
RecordTypeAnnotationNamedField node) {
_runSubscriptions(node, _registry._forRecordTypeAnnotationNamedField);
node.visitChildren(this);
}
@override
void visitRecordTypeAnnotationNamedFields(
RecordTypeAnnotationNamedFields node) {
_runSubscriptions(node, _registry._forRecordTypeAnnotationNamedFields);
node.visitChildren(this);
}
@override
void visitRecordTypeAnnotationPositionalField(
RecordTypeAnnotationPositionalField node) {
_runSubscriptions(node, _registry._forRecordTypeAnnotationPositionalField);
node.visitChildren(this);
}
@override
void visitRedirectingConstructorInvocation(
RedirectingConstructorInvocation node) {
_runSubscriptions(node, _registry._forRedirectingConstructorInvocation);
node.visitChildren(this);
}
@override
void visitRelationalPattern(RelationalPattern node) {
_runSubscriptions(node, _registry._forRelationalPattern);
node.visitChildren(this);
}
@override
void visitRepresentationConstructorName(RepresentationConstructorName node) {
_runSubscriptions(node, _registry._forRepresentationConstructorName);
node.visitChildren(this);
}
@override
void visitRepresentationDeclaration(RepresentationDeclaration node) {
_runSubscriptions(node, _registry._forRepresentationDeclaration);
node.visitChildren(this);
}
@override
void visitRestPatternElement(RestPatternElement node) {
_runSubscriptions(node, _registry._forRestPatternElement);
node.visitChildren(this);
}
@override
void visitRethrowExpression(RethrowExpression node) {
_runSubscriptions(node, _registry._forRethrowExpression);
node.visitChildren(this);
}
@override
void visitReturnStatement(ReturnStatement node) {
_runSubscriptions(node, _registry._forReturnStatement);
node.visitChildren(this);
}
@override
void visitScriptTag(ScriptTag node) {
_runSubscriptions(node, _registry._forScriptTag);
node.visitChildren(this);
}
@override
void visitSetOrMapLiteral(SetOrMapLiteral node) {
_runSubscriptions(node, _registry._forSetOrMapLiteral);
node.visitChildren(this);
}
@override
void visitShowCombinator(ShowCombinator node) {
_runSubscriptions(node, _registry._forShowCombinator);
node.visitChildren(this);
}
@override
void visitSimpleFormalParameter(SimpleFormalParameter node) {
_runSubscriptions(node, _registry._forSimpleFormalParameter);
node.visitChildren(this);
}
@override
void visitSimpleIdentifier(SimpleIdentifier node) {
_runSubscriptions(node, _registry._forSimpleIdentifier);
node.visitChildren(this);
}
@override
void visitSimpleStringLiteral(SimpleStringLiteral node) {
_runSubscriptions(node, _registry._forSimpleStringLiteral);
node.visitChildren(this);
}
@override
void visitSpreadElement(SpreadElement node) {
_runSubscriptions(node, _registry._forSpreadElement);
node.visitChildren(this);
}
@override
void visitStringInterpolation(StringInterpolation node) {
_runSubscriptions(node, _registry._forStringInterpolation);
node.visitChildren(this);
}
@override
void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
_runSubscriptions(node, _registry._forSuperConstructorInvocation);
node.visitChildren(this);
}
@override
void visitSuperExpression(SuperExpression node) {
_runSubscriptions(node, _registry._forSuperExpression);
node.visitChildren(this);
}
@override
void visitSuperFormalParameter(SuperFormalParameter node) {
_runSubscriptions(node, _registry._forSuperFormalParameter);
node.visitChildren(this);
}
@override
void visitSwitchCase(SwitchCase node) {
_runSubscriptions(node, _registry._forSwitchCase);
node.visitChildren(this);
}
@override
void visitSwitchDefault(SwitchDefault node) {
_runSubscriptions(node, _registry._forSwitchDefault);
node.visitChildren(this);
}
@override
void visitSwitchExpression(SwitchExpression node) {
_runSubscriptions(node, _registry._forSwitchExpression);
node.visitChildren(this);
}
@override
void visitSwitchExpressionCase(SwitchExpressionCase node) {
_runSubscriptions(node, _registry._forSwitchExpressionCase);
node.visitChildren(this);
}
@override
void visitSwitchPatternCase(SwitchPatternCase node) {
_runSubscriptions(node, _registry._forSwitchPatternCase);
node.visitChildren(this);
}
@override
void visitSwitchStatement(SwitchStatement node) {
_runSubscriptions(node, _registry._forSwitchStatement);
node.visitChildren(this);
}
@override
void visitSymbolLiteral(SymbolLiteral node) {
_runSubscriptions(node, _registry._forSymbolLiteral);
node.visitChildren(this);
}
@override
void visitThisExpression(ThisExpression node) {
_runSubscriptions(node, _registry._forThisExpression);
node.visitChildren(this);
}
@override
void visitThrowExpression(ThrowExpression node) {
_runSubscriptions(node, _registry._forThrowExpression);
node.visitChildren(this);
}
@override
void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
_runSubscriptions(node, _registry._forTopLevelVariableDeclaration);
node.visitChildren(this);
}
@override
void visitTryStatement(TryStatement node) {
_runSubscriptions(node, _registry._forTryStatement);
node.visitChildren(this);
}
@override
void visitTypeArgumentList(TypeArgumentList node) {
_runSubscriptions(node, _registry._forTypeArgumentList);
node.visitChildren(this);
}
@override
void visitTypeLiteral(TypeLiteral node) {
_runSubscriptions(node, _registry._forTypeLiteral);
node.visitChildren(this);
}
@override
void visitTypeParameter(TypeParameter node) {
_runSubscriptions(node, _registry._forTypeParameter);
node.visitChildren(this);
}
@override
void visitTypeParameterList(TypeParameterList node) {
_runSubscriptions(node, _registry._forTypeParameterList);
node.visitChildren(this);
}
@override
void visitVariableDeclaration(VariableDeclaration node) {
_runSubscriptions(node, _registry._forVariableDeclaration);
node.visitChildren(this);
}
@override
void visitVariableDeclarationList(VariableDeclarationList node) {
_runSubscriptions(node, _registry._forVariableDeclarationList);
node.visitChildren(this);
}
@override
void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
_runSubscriptions(node, _registry._forVariableDeclarationStatement);
node.visitChildren(this);
}
@override
void visitWhenClause(WhenClause node) {
_runSubscriptions(node, _registry._forWhenClause);
node.visitChildren(this);
}
@override
void visitWhileStatement(WhileStatement node) {
_runSubscriptions(node, _registry._forWhileStatement);
node.visitChildren(this);
}
@override
void visitWildcardPattern(WildcardPattern node) {
_runSubscriptions(node, _registry._forWildcardPattern);
node.visitChildren(this);
}
@override
void visitWithClause(WithClause node) {
_runSubscriptions(node, _registry._forWithClause);
node.visitChildren(this);
}
@override
void visitYieldStatement(YieldStatement node) {
_runSubscriptions(node, _registry._forYieldStatement);
node.visitChildren(this);
}
/// Handles exceptions that occur during the execution of an [AnalysisRule].
void _logException(AstNode node, AnalysisRule visitor, Object exception,
StackTrace stackTrace) {
var buffer = StringBuffer();
buffer.write('Exception while using a ${visitor.runtimeType} to visit a ');
AstNode? currentNode = node;
var first = true;
while (currentNode != null) {
if (first) {
first = false;
} else {
buffer.write(' in ');
}
buffer.write(currentNode.runtimeType);
currentNode = currentNode.parent;
}
// TODO(39284): should this exception be silent?
AnalysisEngine.instance.instrumentationService.logException(
SilentException(buffer.toString(), exception, stackTrace));
}
void _runAfterLibrarySubscriptions(
List<_AfterLibrarySubscription> subscriptions) {
for (var subscription in subscriptions) {
var timer = subscription.timer;
timer?.start();
subscription.callback();
timer?.stop();
}
}
void _runSubscriptions<T extends AstNode>(
T node, List<_Subscription<T>> subscriptions) {
for (var subscription in subscriptions) {
var timer = subscription.timer;
timer?.start();
try {
node.accept(subscription.visitor);
} catch (exception, stackTrace) {
_logException(node, subscription.rule, exception, stackTrace);
if (_shouldPropagateExceptions) {
rethrow;
}
}
timer?.stop();
}
}
}
/// The container to register visitors for separate AST node types.
class NodeLintRegistry {
final bool _enableTiming;
final List<_AfterLibrarySubscription> _afterLibrary = [];
final List<_Subscription<AdjacentStrings>> _forAdjacentStrings = [];
final List<_Subscription<Annotation>> _forAnnotation = [];
final List<_Subscription<ArgumentList>> _forArgumentList = [];
final List<_Subscription<AsExpression>> _forAsExpression = [];
final List<_Subscription<AssertInitializer>> _forAssertInitializer = [];
final List<_Subscription<AssertStatement>> _forAssertStatement = [];
final List<_Subscription<AssignedVariablePattern>>
_forAssignedVariablePattern = [];
final List<_Subscription<AssignmentExpression>> _forAssignmentExpression = [];
final List<_Subscription<AugmentedExpression>> _forAugmentedExpression = [];
final List<_Subscription<AugmentedInvocation>> _forAugmentedInvocation = [];
final List<_Subscription<AwaitExpression>> _forAwaitExpression = [];
final List<_Subscription<BinaryExpression>> _forBinaryExpression = [];
final List<_Subscription<Block>> _forBlock = [];
final List<_Subscription<BlockFunctionBody>> _forBlockFunctionBody = [];
final List<_Subscription<BooleanLiteral>> _forBooleanLiteral = [];
final List<_Subscription<BreakStatement>> _forBreakStatement = [];
final List<_Subscription<CascadeExpression>> _forCascadeExpression = [];
final List<_Subscription<CaseClause>> _forCaseClause = [];
final List<_Subscription<CastPattern>> _forCastPattern = [];
final List<_Subscription<CatchClause>> _forCatchClause = [];
final List<_Subscription<CatchClauseParameter>> _forCatchClauseParameter = [];
final List<_Subscription<ClassDeclaration>> _forClassDeclaration = [];
final List<_Subscription<ClassTypeAlias>> _forClassTypeAlias = [];
final List<_Subscription<Comment>> _forComment = [];
final List<_Subscription<CommentReference>> _forCommentReference = [];
final List<_Subscription<CompilationUnit>> _forCompilationUnit = [];
final List<_Subscription<ConditionalExpression>> _forConditionalExpression =
[];
final List<_Subscription<Configuration>> _forConfiguration = [];
final List<_Subscription<ConstantPattern>> _forConstantPattern = [];
final List<_Subscription<ConstructorDeclaration>> _forConstructorDeclaration =
[];
final List<_Subscription<ConstructorFieldInitializer>>
_forConstructorFieldInitializer = [];
final List<_Subscription<ConstructorName>> _forConstructorName = [];
final List<_Subscription<ConstructorReference>> _forConstructorReference = [];
final List<_Subscription<ConstructorSelector>> _forConstructorSelector = [];
final List<_Subscription<ContinueStatement>> _forContinueStatement = [];
final List<_Subscription<DeclaredIdentifier>> _forDeclaredIdentifier = [];
final List<_Subscription<DeclaredVariablePattern>>
_forDeclaredVariablePattern = [];
final List<_Subscription<DefaultFormalParameter>> _forDefaultFormalParameter =
[];
final List<_Subscription<DoStatement>> _forDoStatement = [];
final List<_Subscription<DotShorthandInvocation>> _forDotShorthandInvocation =
[];
final List<_Subscription<DotShorthandPropertyAccess>>
_forDotShorthandPropertyAccess = [];
final List<_Subscription<DottedName>> _forDottedName = [];
final List<_Subscription<DoubleLiteral>> _forDoubleLiteral = [];
final List<_Subscription<EmptyFunctionBody>> _forEmptyFunctionBody = [];
final List<_Subscription<EmptyStatement>> _forEmptyStatement = [];
final List<_Subscription<EnumConstantArguments>> _forEnumConstantArguments =
[];
final List<_Subscription<EnumConstantDeclaration>>
_forEnumConstantDeclaration = [];
final List<_Subscription<EnumDeclaration>> _forEnumDeclaration = [];
final List<_Subscription<ExportDirective>> _forExportDirective = [];
final List<_Subscription<ExpressionFunctionBody>> _forExpressionFunctionBody =
[];
final List<_Subscription<ExpressionStatement>> _forExpressionStatement = [];
final List<_Subscription<ExtendsClause>> _forExtendsClause = [];
final List<_Subscription<ExtensionDeclaration>> _forExtensionDeclaration = [];
final List<_Subscription<ExtensionTypeDeclaration>>
_forExtensionTypeDeclaration = [];
final List<_Subscription<ExtensionOnClause>> _forExtensionOnClause = [];
final List<_Subscription<ExtensionOverride>> _forExtensionOverride = [];
final List<_Subscription<ObjectPattern>> _forObjectPattern = [];
final List<_Subscription<FieldDeclaration>> _forFieldDeclaration = [];
final List<_Subscription<FieldFormalParameter>> _forFieldFormalParameter = [];
final List<_Subscription<ForEachPartsWithDeclaration>>
_forForEachPartsWithDeclaration = [];
final List<_Subscription<ForEachPartsWithIdentifier>>
_forForEachPartsWithIdentifier = [];
final List<_Subscription<ForEachPartsWithPattern>>
_forForEachPartsWithPattern = [];
final List<_Subscription<ForElement>> _forForElement = [];
final List<_Subscription<FormalParameterList>> _forFormalParameterList = [];
final List<_Subscription<ForPartsWithDeclarations>>
_forForPartsWithDeclarations = [];
final List<_Subscription<ForPartsWithExpression>> _forForPartsWithExpression =
[];
final List<_Subscription<ForPartsWithPattern>> _forForPartsWithPattern = [];
final List<_Subscription<ForStatement>> _forForStatement = [];
final List<_Subscription<FunctionDeclaration>> _forFunctionDeclaration = [];
final List<_Subscription<FunctionDeclarationStatement>>
_forFunctionDeclarationStatement = [];
final List<_Subscription<FunctionExpression>> _forFunctionExpression = [];
final List<_Subscription<FunctionExpressionInvocation>>
_forFunctionExpressionInvocation = [];
final List<_Subscription<FunctionReference>> _forFunctionReference = [];
final List<_Subscription<FunctionTypeAlias>> _forFunctionTypeAlias = [];
final List<_Subscription<FunctionTypedFormalParameter>>
_forFunctionTypedFormalParameter = [];
final List<_Subscription<GenericFunctionType>> _forGenericFunctionType = [];
final List<_Subscription<GenericTypeAlias>> _forGenericTypeAlias = [];
final List<_Subscription<GuardedPattern>> _forGuardedPattern = [];
final List<_Subscription<HideCombinator>> _forHideCombinator = [];
final List<_Subscription<IfElement>> _forIfElement = [];
final List<_Subscription<IfStatement>> _forIfStatement = [];
final List<_Subscription<ImplementsClause>> _forImplementsClause = [];
final List<_Subscription<ImplicitCallReference>> _forImplicitCallReference =
[];
final List<_Subscription<ImportDirective>> _forImportDirective = [];
final List<_Subscription<ImportPrefixReference>> _forImportPrefixReference =
[];
final List<_Subscription<IndexExpression>> _forIndexExpression = [];
final List<_Subscription<InstanceCreationExpression>>
_forInstanceCreationExpression = [];
final List<_Subscription<IntegerLiteral>> _forIntegerLiteral = [];
final List<_Subscription<InterpolationExpression>>
_forInterpolationExpression = [];
final List<_Subscription<InterpolationString>> _forInterpolationString = [];
final List<_Subscription<IsExpression>> _forIsExpression = [];
final List<_Subscription<Label>> _forLabel = [];
final List<_Subscription<LabeledStatement>> _forLabeledStatement = [];
final List<_Subscription<LibraryDirective>> _forLibraryDirective = [];
final List<_Subscription<LibraryIdentifier>> _forLibraryIdentifier = [];
final List<_Subscription<ListLiteral>> _forListLiteral = [];
final List<_Subscription<ListPattern>> _forListPattern = [];
final List<_Subscription<LogicalAndPattern>> _forLogicalAndPattern = [];
final List<_Subscription<LogicalOrPattern>> _forLogicalOrPattern = [];
final List<_Subscription<MapLiteralEntry>> _forMapLiteralEntry = [];
final List<_Subscription<MapPatternEntry>> _forMapPatternEntry = [];
final List<_Subscription<MapPattern>> _forMapPattern = [];
final List<_Subscription<MethodDeclaration>> _forMethodDeclaration = [];
final List<_Subscription<MethodInvocation>> _forMethodInvocation = [];
final List<_Subscription<MixinDeclaration>> _forMixinDeclaration = [];
final List<_Subscription<MixinOnClause>> _forMixinOnClause = [];
final List<_Subscription<NamedExpression>> _forNamedExpression = [];
final List<_Subscription<NamedType>> _forNamedType = [];
final List<_Subscription<NativeClause>> _forNativeClause = [];
final List<_Subscription<NativeFunctionBody>> _forNativeFunctionBody = [];
final List<_Subscription<NullAssertPattern>> _forNullAssertPattern = [];
final List<_Subscription<NullAwareElement>> _forNullAwareElement = [];
final List<_Subscription<NullCheckPattern>> _forNullCheckPattern = [];
final List<_Subscription<NullLiteral>> _forNullLiteral = [];
final List<_Subscription<ParenthesizedExpression>>
_forParenthesizedExpression = [];
final List<_Subscription<ParenthesizedPattern>> _forParenthesizedPattern = [];
final List<_Subscription<PartDirective>> _forPartDirective = [];
final List<_Subscription<PartOfDirective>> _forPartOfDirective = [];
final List<_Subscription<PatternAssignment>> _forPatternAssignment = [];
final List<_Subscription<PatternField>> _forPatternField = [];
final List<_Subscription<PatternFieldName>> _forPatternFieldName = [];
final List<_Subscription<PatternVariableDeclaration>>
_forPatternVariableDeclaration = [];
final List<_Subscription<PatternVariableDeclarationStatement>>
_forPatternVariableDeclarationStatement = [];
final List<_Subscription<PostfixExpression>> _forPostfixExpression = [];
final List<_Subscription<PrefixedIdentifier>> _forPrefixedIdentifier = [];
final List<_Subscription<PrefixExpression>> _forPrefixExpression = [];
final List<_Subscription<PropertyAccess>> _forPropertyAccess = [];
final List<_Subscription<RecordLiteral>> _forRecordLiterals = [];
final List<_Subscription<RecordPattern>> _forRecordPattern = [];
final List<_Subscription<RecordTypeAnnotation>> _forRecordTypeAnnotation = [];
final List<_Subscription<RecordTypeAnnotationNamedField>>
_forRecordTypeAnnotationNamedField = [];
final List<_Subscription<RecordTypeAnnotationNamedFields>>
_forRecordTypeAnnotationNamedFields = [];
final List<_Subscription<RecordTypeAnnotationPositionalField>>
_forRecordTypeAnnotationPositionalField = [];
final List<_Subscription<RedirectingConstructorInvocation>>
_forRedirectingConstructorInvocation = [];
final List<_Subscription<RelationalPattern>> _forRelationalPattern = [];
final List<_Subscription<RestPatternElement>> _forRestPatternElement = [];
final List<_Subscription<RethrowExpression>> _forRethrowExpression = [];
final List<_Subscription<ReturnStatement>> _forReturnStatement = [];
final List<_Subscription<RepresentationConstructorName>>
_forRepresentationConstructorName = [];
final List<_Subscription<RepresentationDeclaration>>
_forRepresentationDeclaration = [];
final List<_Subscription<ScriptTag>> _forScriptTag = [];
final List<_Subscription<SetOrMapLiteral>> _forSetOrMapLiteral = [];
final List<_Subscription<ShowCombinator>> _forShowCombinator = [];
final List<_Subscription<SimpleFormalParameter>> _forSimpleFormalParameter =
[];
final List<_Subscription<SimpleIdentifier>> _forSimpleIdentifier = [];
final List<_Subscription<SimpleStringLiteral>> _forSimpleStringLiteral = [];
final List<_Subscription<SpreadElement>> _forSpreadElement = [];
final List<_Subscription<StringInterpolation>> _forStringInterpolation = [];
final List<_Subscription<SuperConstructorInvocation>>
_forSuperConstructorInvocation = [];
final List<_Subscription<SuperExpression>> _forSuperExpression = [];
final List<_Subscription<SuperFormalParameter>> _forSuperFormalParameter = [];
final List<_Subscription<SwitchCase>> _forSwitchCase = [];
final List<_Subscription<SwitchDefault>> _forSwitchDefault = [];
final List<_Subscription<SwitchExpressionCase>> _forSwitchExpressionCase = [];
final List<_Subscription<SwitchExpression>> _forSwitchExpression = [];
final List<_Subscription<SwitchPatternCase>> _forSwitchPatternCase = [];
final List<_Subscription<SwitchStatement>> _forSwitchStatement = [];
final List<_Subscription<SymbolLiteral>> _forSymbolLiteral = [];
final List<_Subscription<ThisExpression>> _forThisExpression = [];
final List<_Subscription<ThrowExpression>> _forThrowExpression = [];
final List<_Subscription<TopLevelVariableDeclaration>>
_forTopLevelVariableDeclaration = [];
final List<_Subscription<TryStatement>> _forTryStatement = [];
final List<_Subscription<TypeArgumentList>> _forTypeArgumentList = [];
final List<_Subscription<TypeLiteral>> _forTypeLiteral = [];
final List<_Subscription<TypeParameter>> _forTypeParameter = [];
final List<_Subscription<TypeParameterList>> _forTypeParameterList = [];
final List<_Subscription<VariableDeclaration>> _forVariableDeclaration = [];
final List<_Subscription<VariableDeclarationList>>
_forVariableDeclarationList = [];
final List<_Subscription<VariableDeclarationStatement>>
_forVariableDeclarationStatement = [];
final List<_Subscription<WhenClause>> _forWhenClause = [];
final List<_Subscription<WhileStatement>> _forWhileStatement = [];
final List<_Subscription<WildcardPattern>> _forWildcardPattern = [];
final List<_Subscription<WithClause>> _forWithClause = [];
final List<_Subscription<YieldStatement>> _forYieldStatement = [];
NodeLintRegistry({required bool enableTiming}) : _enableTiming = enableTiming;
void addAdjacentStrings(AnalysisRule rule, AstVisitor visitor) {
_forAdjacentStrings.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAnnotation(AnalysisRule rule, AstVisitor visitor) {
_forAnnotation.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addArgumentList(AnalysisRule rule, AstVisitor visitor) {
_forArgumentList.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAsExpression(AnalysisRule rule, AstVisitor visitor) {
_forAsExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAssertInitializer(AnalysisRule rule, AstVisitor visitor) {
_forAssertInitializer.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAssertStatement(AnalysisRule rule, AstVisitor visitor) {
_forAssertStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAssignedVariablePattern(AnalysisRule rule, AstVisitor visitor) {
_forAssignedVariablePattern
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAssignmentExpression(AnalysisRule rule, AstVisitor visitor) {
_forAssignmentExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAugmentedExpression(AnalysisRule rule, AstVisitor visitor) {
_forAugmentedExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAugmentedInvocation(AnalysisRule rule, AstVisitor visitor) {
_forAugmentedInvocation.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addAwaitExpression(AnalysisRule rule, AstVisitor visitor) {
_forAwaitExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addBinaryExpression(AnalysisRule rule, AstVisitor visitor) {
_forBinaryExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addBlock(AnalysisRule rule, AstVisitor visitor) {
_forBlock.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addBlockFunctionBody(AnalysisRule rule, AstVisitor visitor) {
_forBlockFunctionBody.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addBooleanLiteral(AnalysisRule rule, AstVisitor visitor) {
_forBooleanLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addBreakStatement(AnalysisRule rule, AstVisitor visitor) {
_forBreakStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addCascadeExpression(AnalysisRule rule, AstVisitor visitor) {
_forCascadeExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addCaseClause(AnalysisRule rule, AstVisitor visitor) {
_forCaseClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addCastPattern(AnalysisRule rule, AstVisitor visitor) {
_forCastPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addCatchClause(AnalysisRule rule, AstVisitor visitor) {
_forCatchClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addCatchClauseParameter(AnalysisRule rule, AstVisitor visitor) {
_forCatchClauseParameter.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addClassDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forClassDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addClassTypeAlias(AnalysisRule rule, AstVisitor visitor) {
_forClassTypeAlias.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addComment(AnalysisRule rule, AstVisitor visitor) {
_forComment.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addCommentReference(AnalysisRule rule, AstVisitor visitor) {
_forCommentReference.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addCompilationUnit(AnalysisRule rule, AstVisitor visitor) {
_forCompilationUnit.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConditionalExpression(AnalysisRule rule, AstVisitor visitor) {
_forConditionalExpression
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConfiguration(AnalysisRule rule, AstVisitor visitor) {
_forConfiguration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConstantPattern(AnalysisRule rule, AstVisitor visitor) {
_forConstantPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConstructorDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forConstructorDeclaration
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConstructorFieldInitializer(AnalysisRule rule, AstVisitor visitor) {
_forConstructorFieldInitializer
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConstructorName(AnalysisRule rule, AstVisitor visitor) {
_forConstructorName.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConstructorReference(AnalysisRule rule, AstVisitor visitor) {
_forConstructorReference.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addConstructorSelector(AnalysisRule rule, AstVisitor visitor) {
_forConstructorSelector.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addContinueStatement(AnalysisRule rule, AstVisitor visitor) {
_forContinueStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDeclaredIdentifier(AnalysisRule rule, AstVisitor visitor) {
_forDeclaredIdentifier.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDeclaredVariablePattern(AnalysisRule rule, AstVisitor visitor) {
_forDeclaredVariablePattern
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDefaultFormalParameter(AnalysisRule rule, AstVisitor visitor) {
_forDefaultFormalParameter
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDoStatement(AnalysisRule rule, AstVisitor visitor) {
_forDoStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDotShorthandInvocation(AnalysisRule rule, AstVisitor visitor) {
_forDotShorthandInvocation
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDotShorthandPropertyAccess(AnalysisRule rule, AstVisitor visitor) {
_forDotShorthandInvocation
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDottedName(AnalysisRule rule, AstVisitor visitor) {
_forDottedName.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addDoubleLiteral(AnalysisRule rule, AstVisitor visitor) {
_forDoubleLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addEmptyFunctionBody(AnalysisRule rule, AstVisitor visitor) {
_forEmptyFunctionBody.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addEmptyStatement(AnalysisRule rule, AstVisitor visitor) {
_forEmptyStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addEnumConstantArguments(AnalysisRule rule, AstVisitor visitor) {
_forEnumConstantArguments
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addEnumConstantDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forEnumConstantDeclaration
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addEnumDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forEnumDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExportDirective(AnalysisRule rule, AstVisitor visitor) {
_forExportDirective.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExpressionFunctionBody(AnalysisRule rule, AstVisitor visitor) {
_forExpressionFunctionBody
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExpressionStatement(AnalysisRule rule, AstVisitor visitor) {
_forExpressionStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExtendsClause(AnalysisRule rule, AstVisitor visitor) {
_forExtendsClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExtensionDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forExtensionDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExtensionOnClause(AnalysisRule rule, AstVisitor visitor) {
_forExtensionOnClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExtensionOverride(AnalysisRule rule, AstVisitor visitor) {
_forExtensionOverride.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addExtensionTypeDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forExtensionTypeDeclaration
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFieldDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forFieldDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFieldFormalParameter(AnalysisRule rule, AstVisitor visitor) {
_forFieldFormalParameter.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForEachPartsWithDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forForEachPartsWithDeclaration
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForEachPartsWithIdentifier(AnalysisRule rule, AstVisitor visitor) {
_forForEachPartsWithIdentifier
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForEachPartsWithPattern(AnalysisRule rule, AstVisitor visitor) {
_forForEachPartsWithPattern
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForElement(AnalysisRule rule, AstVisitor visitor) {
_forForElement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFormalParameterList(AnalysisRule rule, AstVisitor visitor) {
_forFormalParameterList.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForPartsWithDeclarations(AnalysisRule rule, AstVisitor visitor) {
_forForPartsWithDeclarations
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForPartsWithExpression(AnalysisRule rule, AstVisitor visitor) {
_forForPartsWithExpression
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForPartsWithPattern(AnalysisRule rule, AstVisitor visitor) {
_forForPartsWithPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addForStatement(AnalysisRule rule, AstVisitor visitor) {
_forForStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFunctionDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forFunctionDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFunctionDeclarationStatement(AnalysisRule rule, AstVisitor visitor) {
_forFunctionDeclarationStatement
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFunctionExpression(AnalysisRule rule, AstVisitor visitor) {
_forFunctionExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFunctionExpressionInvocation(AnalysisRule rule, AstVisitor visitor) {
_forFunctionExpressionInvocation
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFunctionReference(AnalysisRule rule, AstVisitor visitor) {
_forFunctionReference.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFunctionTypeAlias(AnalysisRule rule, AstVisitor visitor) {
_forFunctionTypeAlias.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addFunctionTypedFormalParameter(AnalysisRule rule, AstVisitor visitor) {
_forFunctionTypedFormalParameter
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addGenericFunctionType(AnalysisRule rule, AstVisitor visitor) {
_forGenericFunctionType.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addGenericTypeAlias(AnalysisRule rule, AstVisitor visitor) {
_forGenericTypeAlias.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addGuardedPattern(AnalysisRule rule, AstVisitor visitor) {
_forGuardedPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addHideCombinator(AnalysisRule rule, AstVisitor visitor) {
_forHideCombinator.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addIfElement(AnalysisRule rule, AstVisitor visitor) {
_forIfElement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addIfStatement(AnalysisRule rule, AstVisitor visitor) {
_forIfStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addImplementsClause(AnalysisRule rule, AstVisitor visitor) {
_forImplementsClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addImplicitCallReference(AnalysisRule rule, AstVisitor visitor) {
_forImplicitCallReference
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addImportDirective(AnalysisRule rule, AstVisitor visitor) {
_forImportDirective.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addImportPrefixReference(AnalysisRule rule, AstVisitor visitor) {
_forImportPrefixReference
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addIndexExpression(AnalysisRule rule, AstVisitor visitor) {
_forIndexExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addInstanceCreationExpression(AnalysisRule rule, AstVisitor visitor) {
_forInstanceCreationExpression
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addIntegerLiteral(AnalysisRule rule, AstVisitor visitor) {
_forIntegerLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addInterpolationExpression(AnalysisRule rule, AstVisitor visitor) {
_forInterpolationExpression
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addInterpolationString(AnalysisRule rule, AstVisitor visitor) {
_forInterpolationString.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addIsExpression(AnalysisRule rule, AstVisitor visitor) {
_forIsExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addLabel(AnalysisRule rule, AstVisitor visitor) {
_forLabel.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addLabeledStatement(AnalysisRule rule, AstVisitor visitor) {
_forLabeledStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addLibraryDirective(AnalysisRule rule, AstVisitor visitor) {
_forLibraryDirective.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addLibraryIdentifier(AnalysisRule rule, AstVisitor visitor) {
_forLibraryIdentifier.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addListLiteral(AnalysisRule rule, AstVisitor visitor) {
_forListLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addListPattern(AnalysisRule rule, AstVisitor visitor) {
_forListPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addLogicalAndPattern(AnalysisRule rule, AstVisitor visitor) {
_forLogicalAndPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addLogicalOrPattern(AnalysisRule rule, AstVisitor visitor) {
_forLogicalOrPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addMapLiteralEntry(AnalysisRule rule, AstVisitor visitor) {
_forMapLiteralEntry.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addMapPattern(AnalysisRule rule, AstVisitor visitor) {
_forMapPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addMapPatternEntry(AnalysisRule rule, AstVisitor visitor) {
_forMapPatternEntry.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addMethodDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forMethodDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addMethodInvocation(AnalysisRule rule, AstVisitor visitor) {
_forMethodInvocation.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addMixinDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forMixinDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addMixinOnClause(AnalysisRule rule, AstVisitor visitor) {
_forMixinOnClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addNamedExpression(AnalysisRule rule, AstVisitor visitor) {
_forNamedExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addNamedType(AnalysisRule rule, AstVisitor visitor) {
_forNamedType.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addNativeClause(AnalysisRule rule, AstVisitor visitor) {
_forNativeClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addNativeFunctionBody(AnalysisRule rule, AstVisitor visitor) {
_forNativeFunctionBody.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addNullAssertPattern(AnalysisRule rule, AstVisitor visitor) {
_forNullAssertPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addNullCheckPattern(AnalysisRule rule, AstVisitor visitor) {
_forNullCheckPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addNullLiteral(AnalysisRule rule, AstVisitor visitor) {
_forNullLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addObjectPattern(AnalysisRule rule, AstVisitor visitor) {
_forObjectPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addParenthesizedExpression(AnalysisRule rule, AstVisitor visitor) {
_forParenthesizedExpression
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addParenthesizedPattern(AnalysisRule rule, AstVisitor visitor) {
_forParenthesizedPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPartDirective(AnalysisRule rule, AstVisitor visitor) {
_forPartDirective.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPartOfDirective(AnalysisRule rule, AstVisitor visitor) {
_forPartOfDirective.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPatternAssignment(AnalysisRule rule, AstVisitor visitor) {
_forPatternAssignment.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPatternField(AnalysisRule rule, AstVisitor visitor) {
_forPatternField.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPatternFieldName(AnalysisRule rule, AstVisitor visitor) {
_forPatternFieldName.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPatternVariableDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forPatternVariableDeclaration
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPatternVariableDeclarationStatement(
AnalysisRule rule, AstVisitor visitor) {
_forPatternVariableDeclarationStatement
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPostfixExpression(AnalysisRule rule, AstVisitor visitor) {
_forPostfixExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPrefixedIdentifier(AnalysisRule rule, AstVisitor visitor) {
_forPrefixedIdentifier.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPrefixExpression(AnalysisRule rule, AstVisitor visitor) {
_forPrefixExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addPropertyAccess(AnalysisRule rule, AstVisitor visitor) {
_forPropertyAccess.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRecordLiteral(AnalysisRule rule, AstVisitor visitor) {
_forRecordLiterals.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRecordPattern(AnalysisRule rule, AstVisitor visitor) {
_forRecordPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRecordTypeAnnotation(AnalysisRule rule, AstVisitor visitor) {
_forRecordTypeAnnotation.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRedirectingConstructorInvocation(
AnalysisRule rule, AstVisitor visitor) {
_forRedirectingConstructorInvocation
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRelationalPattern(AnalysisRule rule, AstVisitor visitor) {
_forRelationalPattern.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRepresentationConstructorName(AnalysisRule rule, AstVisitor visitor) {
_forRepresentationConstructorName
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRepresentationDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forRepresentationDeclaration
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRestPatternElement(AnalysisRule rule, AstVisitor visitor) {
_forRestPatternElement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addRethrowExpression(AnalysisRule rule, AstVisitor visitor) {
_forRethrowExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addReturnStatement(AnalysisRule rule, AstVisitor visitor) {
_forReturnStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addScriptTag(AnalysisRule rule, AstVisitor visitor) {
_forScriptTag.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSetOrMapLiteral(AnalysisRule rule, AstVisitor visitor) {
_forSetOrMapLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addShowCombinator(AnalysisRule rule, AstVisitor visitor) {
_forShowCombinator.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSimpleFormalParameter(AnalysisRule rule, AstVisitor visitor) {
_forSimpleFormalParameter
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSimpleIdentifier(AnalysisRule rule, AstVisitor visitor) {
_forSimpleIdentifier.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSimpleStringLiteral(AnalysisRule rule, AstVisitor visitor) {
_forSimpleStringLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSpreadElement(AnalysisRule rule, AstVisitor visitor) {
_forSpreadElement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addStringInterpolation(AnalysisRule rule, AstVisitor visitor) {
_forStringInterpolation.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSuperConstructorInvocation(AnalysisRule rule, AstVisitor visitor) {
_forSuperConstructorInvocation
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSuperExpression(AnalysisRule rule, AstVisitor visitor) {
_forSuperExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSuperFormalParameter(AnalysisRule rule, AstVisitor visitor) {
_forSuperFormalParameter.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSwitchCase(AnalysisRule rule, AstVisitor visitor) {
_forSwitchCase.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSwitchDefault(AnalysisRule rule, AstVisitor visitor) {
_forSwitchDefault.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSwitchExpression(AnalysisRule rule, AstVisitor visitor) {
_forSwitchExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSwitchExpressionCase(AnalysisRule rule, AstVisitor visitor) {
_forSwitchExpressionCase.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSwitchPatternCase(AnalysisRule rule, AstVisitor visitor) {
_forSwitchPatternCase.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSwitchStatement(AnalysisRule rule, AstVisitor visitor) {
_forSwitchStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addSymbolLiteral(AnalysisRule rule, AstVisitor visitor) {
_forSymbolLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addThisExpression(AnalysisRule rule, AstVisitor visitor) {
_forThisExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addThrowExpression(AnalysisRule rule, AstVisitor visitor) {
_forThrowExpression.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addTopLevelVariableDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forTopLevelVariableDeclaration
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addTryStatement(AnalysisRule rule, AstVisitor visitor) {
_forTryStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addTypeArgumentList(AnalysisRule rule, AstVisitor visitor) {
_forTypeArgumentList.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addTypeLiteral(AnalysisRule rule, AstVisitor visitor) {
_forTypeLiteral.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addTypeParameter(AnalysisRule rule, AstVisitor visitor) {
_forTypeParameter.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addTypeParameterList(AnalysisRule rule, AstVisitor visitor) {
_forTypeParameterList.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addVariableDeclaration(AnalysisRule rule, AstVisitor visitor) {
_forVariableDeclaration.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addVariableDeclarationList(AnalysisRule rule, AstVisitor visitor) {
_forVariableDeclarationList
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addVariableDeclarationStatement(AnalysisRule rule, AstVisitor visitor) {
_forVariableDeclarationStatement
.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addWhenClause(AnalysisRule rule, AstVisitor visitor) {
_forWhenClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addWhileStatement(AnalysisRule rule, AstVisitor visitor) {
_forWhileStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addWithClause(AnalysisRule rule, AstVisitor visitor) {
_forWithClause.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void addYieldStatement(AnalysisRule rule, AstVisitor visitor) {
_forYieldStatement.add(_Subscription(rule, visitor, _getTimer(rule)));
}
void afterLibrary(AnalysisRule rule, void Function() callback) {
_afterLibrary
.add(_AfterLibrarySubscription(rule, callback, _getTimer(rule)));
}
/// Get the timer associated with the given [rule].
Stopwatch? _getTimer(AnalysisRule rule) {
if (_enableTiming) {
return analysisRuleTimers.getTimer(rule);
} else {
return null;
}
}
}
class _AfterLibrarySubscription {
final AnalysisRule rule;
final void Function() callback;
final Stopwatch? timer;
_AfterLibrarySubscription(this.rule, this.callback, this.timer);
}
/// A single subscription for a node type, by the specified [rule].
class _Subscription<T> {
final AnalysisRule rule;
final AstVisitor visitor;
final Stopwatch? timer;
_Subscription(this.rule, this.visitor, this.timer);
}