4d3d70af23
Kernel sdk version was bumped from 3.6 to 3.12 in https://dart-review.googlesource.com/c/sdk/+/487542 (and to `^3.12.0-0` in https://dart-review.googlesource.com/c/sdk/+/487880) but the source was never formatted. This is, if nothing else, bad for reviews, where editing a file changes the file in lots of places because of new formatting. This CL is the result of running ``` out/ReleaseX64/dart-sdk/bin/dart format pkg/kernel/ ``` but also updates the formatter version used by a source generator (`pkg/front_end/tool/visitor_generator.dart`) so things agree. Change-Id: I66e35d4f1e2d08cecc30fb314546cae78b49e99b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/490082 Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Jens Johansen <jensj@google.com>
3478 lines
124 KiB
Dart
3478 lines
124 KiB
Dart
// Copyright (c) 2016, 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.
|
|
|
|
library kernel.ast.visitor;
|
|
|
|
import 'dart:collection';
|
|
|
|
import 'ast.dart';
|
|
|
|
abstract class ExpressionVisitor<R> {
|
|
const ExpressionVisitor();
|
|
|
|
R visitAuxiliaryExpression(AuxiliaryExpression node);
|
|
R visitInvalidExpression(InvalidExpression node);
|
|
R visitVariableGet(VariableGet node);
|
|
R visitVariableSet(VariableSet node);
|
|
R visitDynamicGet(DynamicGet node);
|
|
R visitDynamicSet(DynamicSet node);
|
|
R visitFunctionTearOff(FunctionTearOff node);
|
|
R visitInstanceGet(InstanceGet node);
|
|
R visitInstanceSet(InstanceSet node);
|
|
R visitInstanceTearOff(InstanceTearOff node);
|
|
R visitAbstractSuperPropertyGet(AbstractSuperPropertyGet node);
|
|
R visitAbstractSuperPropertySet(AbstractSuperPropertySet node);
|
|
R visitSuperPropertyGet(SuperPropertyGet node);
|
|
R visitSuperPropertySet(SuperPropertySet node);
|
|
R visitStaticGet(StaticGet node);
|
|
R visitStaticSet(StaticSet node);
|
|
R visitStaticTearOff(StaticTearOff node);
|
|
R visitLocalFunctionInvocation(LocalFunctionInvocation node);
|
|
R visitDynamicInvocation(DynamicInvocation node);
|
|
R visitFunctionInvocation(FunctionInvocation node);
|
|
R visitInstanceInvocation(InstanceInvocation node);
|
|
R visitInstanceGetterInvocation(InstanceGetterInvocation node);
|
|
R visitEqualsNull(EqualsNull node);
|
|
R visitEqualsCall(EqualsCall node);
|
|
R visitAbstractSuperMethodInvocation(AbstractSuperMethodInvocation node);
|
|
R visitSuperMethodInvocation(SuperMethodInvocation node);
|
|
R visitStaticInvocation(StaticInvocation node);
|
|
R visitConstructorInvocation(ConstructorInvocation node);
|
|
R visitRedirectingFactoryInvocation(RedirectingFactoryInvocation node);
|
|
R visitNot(Not node);
|
|
R visitNullCheck(NullCheck node);
|
|
R visitLogicalExpression(LogicalExpression node);
|
|
R visitConditionalExpression(ConditionalExpression node);
|
|
R visitStringConcatenation(StringConcatenation node);
|
|
R visitListConcatenation(ListConcatenation node);
|
|
R visitSetConcatenation(SetConcatenation node);
|
|
R visitMapConcatenation(MapConcatenation node);
|
|
R visitInstanceCreation(InstanceCreation node);
|
|
R visitFileUriExpression(FileUriExpression node);
|
|
R visitIsExpression(IsExpression node);
|
|
R visitAsExpression(AsExpression node);
|
|
R visitSymbolLiteral(SymbolLiteral node);
|
|
R visitTypeLiteral(TypeLiteral node);
|
|
R visitThisExpression(ThisExpression node);
|
|
R visitRethrow(Rethrow node);
|
|
R visitThrow(Throw node);
|
|
R visitListLiteral(ListLiteral node);
|
|
R visitSetLiteral(SetLiteral node);
|
|
R visitMapLiteral(MapLiteral node);
|
|
R visitRecordLiteral(RecordLiteral node);
|
|
R visitAwaitExpression(AwaitExpression node);
|
|
R visitFunctionExpression(FunctionExpression node);
|
|
R visitConstantExpression(ConstantExpression node);
|
|
R visitStringLiteral(StringLiteral node);
|
|
R visitIntLiteral(IntLiteral node);
|
|
R visitDoubleLiteral(DoubleLiteral node);
|
|
R visitBoolLiteral(BoolLiteral node);
|
|
R visitNullLiteral(NullLiteral node);
|
|
R visitLet(Let node);
|
|
R visitBlockExpression(BlockExpression node);
|
|
R visitInstantiation(Instantiation node);
|
|
R visitLoadLibrary(LoadLibrary node);
|
|
R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node);
|
|
R visitConstructorTearOff(ConstructorTearOff node);
|
|
R visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node);
|
|
R visitTypedefTearOff(TypedefTearOff node);
|
|
R visitRecordIndexGet(RecordIndexGet node);
|
|
R visitRecordNameGet(RecordNameGet node);
|
|
R visitSwitchExpression(SwitchExpression node);
|
|
R visitPatternAssignment(PatternAssignment node);
|
|
R visitVariableRead(VariableRead node);
|
|
R visitVariableWrite(VariableWrite node);
|
|
}
|
|
|
|
/// Helper mixin for [ExpressionVisitor] that implements visit methods by
|
|
/// delegating to the [defaultBasicLiteral] and [defaultExpression] methods.
|
|
mixin ExpressionVisitorDefaultMixin<R> implements ExpressionVisitor<R> {
|
|
R defaultExpression(Expression node);
|
|
R defaultBasicLiteral(BasicLiteral node) => defaultExpression(node);
|
|
|
|
@override
|
|
R visitAuxiliaryExpression(AuxiliaryExpression node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitInvalidExpression(InvalidExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitVariableGet(VariableGet node) => defaultExpression(node);
|
|
@override
|
|
R visitVariableSet(VariableSet node) => defaultExpression(node);
|
|
@override
|
|
R visitDynamicGet(DynamicGet node) => defaultExpression(node);
|
|
@override
|
|
R visitDynamicSet(DynamicSet node) => defaultExpression(node);
|
|
@override
|
|
R visitFunctionTearOff(FunctionTearOff node) => defaultExpression(node);
|
|
@override
|
|
R visitInstanceGet(InstanceGet node) => defaultExpression(node);
|
|
@override
|
|
R visitInstanceSet(InstanceSet node) => defaultExpression(node);
|
|
@override
|
|
R visitInstanceTearOff(InstanceTearOff node) => defaultExpression(node);
|
|
@override
|
|
R visitAbstractSuperPropertyGet(AbstractSuperPropertyGet node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitAbstractSuperPropertySet(AbstractSuperPropertySet node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitSuperPropertyGet(SuperPropertyGet node) => defaultExpression(node);
|
|
@override
|
|
R visitSuperPropertySet(SuperPropertySet node) => defaultExpression(node);
|
|
@override
|
|
R visitStaticGet(StaticGet node) => defaultExpression(node);
|
|
@override
|
|
R visitStaticSet(StaticSet node) => defaultExpression(node);
|
|
@override
|
|
R visitStaticTearOff(StaticTearOff node) => defaultExpression(node);
|
|
@override
|
|
R visitLocalFunctionInvocation(LocalFunctionInvocation node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitDynamicInvocation(DynamicInvocation node) => defaultExpression(node);
|
|
@override
|
|
R visitFunctionInvocation(FunctionInvocation node) => defaultExpression(node);
|
|
@override
|
|
R visitInstanceInvocation(InstanceInvocation node) => defaultExpression(node);
|
|
@override
|
|
R visitInstanceGetterInvocation(InstanceGetterInvocation node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitEqualsNull(EqualsNull node) => defaultExpression(node);
|
|
@override
|
|
R visitEqualsCall(EqualsCall node) => defaultExpression(node);
|
|
@override
|
|
R visitAbstractSuperMethodInvocation(AbstractSuperMethodInvocation node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitSuperMethodInvocation(SuperMethodInvocation node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitStaticInvocation(StaticInvocation node) => defaultExpression(node);
|
|
@override
|
|
R visitConstructorInvocation(ConstructorInvocation node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitRedirectingFactoryInvocation(RedirectingFactoryInvocation node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitNot(Not node) => defaultExpression(node);
|
|
@override
|
|
R visitNullCheck(NullCheck node) => defaultExpression(node);
|
|
@override
|
|
R visitLogicalExpression(LogicalExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitConditionalExpression(ConditionalExpression node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitStringConcatenation(StringConcatenation node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitListConcatenation(ListConcatenation node) => defaultExpression(node);
|
|
@override
|
|
R visitSetConcatenation(SetConcatenation node) => defaultExpression(node);
|
|
@override
|
|
R visitMapConcatenation(MapConcatenation node) => defaultExpression(node);
|
|
@override
|
|
R visitInstanceCreation(InstanceCreation node) => defaultExpression(node);
|
|
@override
|
|
R visitFileUriExpression(FileUriExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitIsExpression(IsExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitAsExpression(AsExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitSymbolLiteral(SymbolLiteral node) => defaultExpression(node);
|
|
@override
|
|
R visitTypeLiteral(TypeLiteral node) => defaultExpression(node);
|
|
@override
|
|
R visitThisExpression(ThisExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitRethrow(Rethrow node) => defaultExpression(node);
|
|
@override
|
|
R visitThrow(Throw node) => defaultExpression(node);
|
|
@override
|
|
R visitListLiteral(ListLiteral node) => defaultExpression(node);
|
|
@override
|
|
R visitSetLiteral(SetLiteral node) => defaultExpression(node);
|
|
@override
|
|
R visitMapLiteral(MapLiteral node) => defaultExpression(node);
|
|
@override
|
|
R visitRecordLiteral(RecordLiteral node) => defaultExpression(node);
|
|
@override
|
|
R visitAwaitExpression(AwaitExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitFunctionExpression(FunctionExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitConstantExpression(ConstantExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitStringLiteral(StringLiteral node) => defaultBasicLiteral(node);
|
|
@override
|
|
R visitIntLiteral(IntLiteral node) => defaultBasicLiteral(node);
|
|
@override
|
|
R visitDoubleLiteral(DoubleLiteral node) => defaultBasicLiteral(node);
|
|
@override
|
|
R visitBoolLiteral(BoolLiteral node) => defaultBasicLiteral(node);
|
|
@override
|
|
R visitNullLiteral(NullLiteral node) => defaultBasicLiteral(node);
|
|
@override
|
|
R visitLet(Let node) => defaultExpression(node);
|
|
@override
|
|
R visitBlockExpression(BlockExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitInstantiation(Instantiation node) => defaultExpression(node);
|
|
@override
|
|
R visitLoadLibrary(LoadLibrary node) => defaultExpression(node);
|
|
@override
|
|
R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitConstructorTearOff(ConstructorTearOff node) => defaultExpression(node);
|
|
@override
|
|
R visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node) =>
|
|
defaultExpression(node);
|
|
@override
|
|
R visitTypedefTearOff(TypedefTearOff node) => defaultExpression(node);
|
|
@override
|
|
R visitRecordIndexGet(RecordIndexGet node) => defaultExpression(node);
|
|
@override
|
|
R visitRecordNameGet(RecordNameGet node) => defaultExpression(node);
|
|
@override
|
|
R visitSwitchExpression(SwitchExpression node) => defaultExpression(node);
|
|
@override
|
|
R visitPatternAssignment(PatternAssignment node) => defaultExpression(node);
|
|
@override
|
|
R visitVariableRead(VariableRead node) => defaultExpression(node);
|
|
@override
|
|
R visitVariableWrite(VariableWrite node) => defaultExpression(node);
|
|
}
|
|
|
|
abstract class PatternVisitor<R> {
|
|
R visitAndPattern(AndPattern node);
|
|
R visitAssignedVariablePattern(AssignedVariablePattern node);
|
|
R visitCastPattern(CastPattern node);
|
|
R visitConstantPattern(ConstantPattern node);
|
|
R visitInvalidPattern(InvalidPattern node);
|
|
R visitListPattern(ListPattern node);
|
|
R visitMapPattern(MapPattern node);
|
|
R visitNamedPattern(NamedPattern node);
|
|
R visitNullAssertPattern(NullAssertPattern node);
|
|
R visitNullCheckPattern(NullCheckPattern node);
|
|
R visitObjectPattern(ObjectPattern node);
|
|
R visitOrPattern(OrPattern node);
|
|
R visitRecordPattern(RecordPattern node);
|
|
R visitRelationalPattern(RelationalPattern node);
|
|
R visitRestPattern(RestPattern node);
|
|
R visitVariablePattern(VariablePattern node);
|
|
R visitWildcardPattern(WildcardPattern node);
|
|
}
|
|
|
|
/// Helper mixin for [PatternVisitor] that implements visit methods by
|
|
/// delegating to the [defaultPattern] method.
|
|
mixin PatternVisitorDefaultMixin<R> implements PatternVisitor<R> {
|
|
R defaultPattern(Pattern node);
|
|
@override
|
|
R visitAndPattern(AndPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitAssignedVariablePattern(AssignedVariablePattern node) =>
|
|
defaultPattern(node);
|
|
@override
|
|
R visitCastPattern(CastPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitConstantPattern(ConstantPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitInvalidPattern(InvalidPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitListPattern(ListPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitMapPattern(MapPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitNamedPattern(NamedPattern node) => defaultPattern(node);
|
|
@override
|
|
@override
|
|
R visitNullAssertPattern(NullAssertPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitNullCheckPattern(NullCheckPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitObjectPattern(ObjectPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitOrPattern(OrPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitRecordPattern(RecordPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitRelationalPattern(RelationalPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitRestPattern(RestPattern node) => defaultPattern(node);
|
|
@override
|
|
R visitVariablePattern(VariablePattern node) => defaultPattern(node);
|
|
@override
|
|
R visitWildcardPattern(WildcardPattern node) => defaultPattern(node);
|
|
}
|
|
|
|
/// [PatternVisitorInternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin PatternVisitorInternalNodeMixin<R> implements PatternVisitor<R> {
|
|
@override
|
|
R visitAndPattern(AndPattern node) {
|
|
throw StateError("${runtimeType}.visitAndPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitAssignedVariablePattern(AssignedVariablePattern node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitAssignedVariablePattern isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitCastPattern(CastPattern node) {
|
|
throw StateError("${runtimeType}.visitCastPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitConstantPattern(ConstantPattern node) {
|
|
throw StateError("${runtimeType}.visitConstantPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitInvalidPattern(InvalidPattern node) {
|
|
throw StateError("${runtimeType}.visitInvalidPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitListPattern(ListPattern node) {
|
|
throw StateError("${runtimeType}.visitListPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitMapPattern(MapPattern node) {
|
|
throw StateError("${runtimeType}.visitMapPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitNamedPattern(NamedPattern node) {
|
|
throw StateError("${runtimeType}.visitNamedPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitNullAssertPattern(NullAssertPattern node) {
|
|
throw StateError("${runtimeType}.visitNullAssertPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitNullCheckPattern(NullCheckPattern node) {
|
|
throw StateError("${runtimeType}.visitNullCheckPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitObjectPattern(ObjectPattern node) {
|
|
throw StateError("${runtimeType}.visitObjectPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitOrPattern(OrPattern node) {
|
|
throw StateError("${runtimeType}.visitOrPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRecordPattern(RecordPattern node) {
|
|
throw StateError("${runtimeType}.visitRecordPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRelationalPattern(RelationalPattern node) {
|
|
throw StateError("${runtimeType}.visitRelationalPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRestPattern(RestPattern node) {
|
|
throw StateError("${runtimeType}.visitRestPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitVariablePattern(VariablePattern node) {
|
|
throw StateError("${runtimeType}.visitVariablePattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitWildcardPattern(WildcardPattern node) {
|
|
throw StateError("${runtimeType}.visitWildcardPattern isn't supported.");
|
|
}
|
|
}
|
|
|
|
/// [PatternVisitor1InternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin PatternVisitor1InternalNodeMixin<R, A> implements PatternVisitor1<R, A> {
|
|
@override
|
|
R visitAndPattern(AndPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitAndPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitAssignedVariablePattern(AssignedVariablePattern node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitAssignedVariablePattern isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitCastPattern(CastPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitCastPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitConstantPattern(ConstantPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitConstantPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitInvalidPattern(InvalidPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitInvalidPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitListPattern(ListPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitListPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitMapPattern(MapPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitMapPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitNamedPattern(NamedPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitNamedPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitNullAssertPattern(NullAssertPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitNullAssertPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitNullCheckPattern(NullCheckPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitNullCheckPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitObjectPattern(ObjectPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitObjectPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitOrPattern(OrPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitOrPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRecordPattern(RecordPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitRecordPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRelationalPattern(RelationalPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitRelationalPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRestPattern(RestPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitRestPattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitVariablePattern(VariablePattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitVariablePattern isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitWildcardPattern(WildcardPattern node, A arg) {
|
|
throw StateError("${runtimeType}.visitWildcardPattern isn't supported.");
|
|
}
|
|
}
|
|
|
|
abstract class StatementVisitor<R> {
|
|
const StatementVisitor();
|
|
|
|
R visitAuxiliaryStatement(AuxiliaryStatement node);
|
|
R visitExpressionStatement(ExpressionStatement node);
|
|
R visitBlock(Block node);
|
|
R visitAssertBlock(AssertBlock node);
|
|
R visitEmptyStatement(EmptyStatement node);
|
|
R visitAssertStatement(AssertStatement node);
|
|
R visitLabeledStatement(LabeledStatement node);
|
|
R visitVariableInitialization(VariableInitialization node);
|
|
R visitBreakStatement(BreakStatement node);
|
|
R visitWhileStatement(WhileStatement node);
|
|
R visitDoStatement(DoStatement node);
|
|
R visitForStatement(ForStatement node);
|
|
R visitForInStatement(ForInStatement node);
|
|
R visitSwitchStatement(SwitchStatement node);
|
|
R visitPatternSwitchStatement(PatternSwitchStatement node);
|
|
R visitContinueSwitchStatement(ContinueSwitchStatement node);
|
|
R visitIfStatement(IfStatement node);
|
|
R visitIfCaseStatement(IfCaseStatement node);
|
|
R visitReturnStatement(ReturnStatement node);
|
|
R visitTryCatch(TryCatch node);
|
|
R visitTryFinally(TryFinally node);
|
|
R visitYieldStatement(YieldStatement node);
|
|
R visitPatternVariableDeclaration(PatternVariableDeclaration node);
|
|
R visitFunctionDeclaration(FunctionDeclaration node);
|
|
R visitVariableStatement(VariableStatement node);
|
|
R visitPositionalParameter(PositionalParameter node);
|
|
R visitNamedParameter(NamedParameter node);
|
|
}
|
|
|
|
/// Helper mixin for [StatementVisitor] that implements visit methods by
|
|
/// delegating to the [defaultStatement] method.
|
|
mixin StatementVisitorDefaultMixin<R> implements StatementVisitor<R> {
|
|
R defaultStatement(Statement node);
|
|
|
|
@override
|
|
R visitAuxiliaryStatement(AuxiliaryStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitExpressionStatement(ExpressionStatement node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitBlock(Block node) => defaultStatement(node);
|
|
@override
|
|
R visitAssertBlock(AssertBlock node) => defaultStatement(node);
|
|
@override
|
|
R visitEmptyStatement(EmptyStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitAssertStatement(AssertStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitLabeledStatement(LabeledStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitVariableInitialization(VariableInitialization node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitBreakStatement(BreakStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitWhileStatement(WhileStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitDoStatement(DoStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitForStatement(ForStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitForInStatement(ForInStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitSwitchStatement(SwitchStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitPatternSwitchStatement(PatternSwitchStatement node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitContinueSwitchStatement(ContinueSwitchStatement node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitIfStatement(IfStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitIfCaseStatement(IfCaseStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitReturnStatement(ReturnStatement node) => defaultStatement(node);
|
|
@override
|
|
R visitTryCatch(TryCatch node) => defaultStatement(node);
|
|
@override
|
|
R visitTryFinally(TryFinally node) => defaultStatement(node);
|
|
@override
|
|
R visitYieldStatement(YieldStatement node) => defaultStatement(node);
|
|
R visitVariableDeclaration(VariableDeclaration node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitPatternVariableDeclaration(PatternVariableDeclaration node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitFunctionDeclaration(FunctionDeclaration node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitVariableStatement(VariableStatement node) =>
|
|
visitVariableDeclaration(node);
|
|
@override
|
|
R visitPositionalParameter(PositionalParameter node) =>
|
|
defaultStatement(node);
|
|
@override
|
|
R visitNamedParameter(NamedParameter node) => defaultStatement(node);
|
|
}
|
|
|
|
abstract class MemberVisitor<R> {
|
|
const MemberVisitor();
|
|
|
|
R visitConstructor(Constructor node);
|
|
R visitProcedure(Procedure node);
|
|
R visitField(Field node);
|
|
}
|
|
|
|
/// Helper mixin for [MemberVisitor] that implements visit methods by
|
|
/// delegating to the [defaultMember] method.
|
|
mixin MemberVisitorDefaultMixin<R> implements MemberVisitor<R> {
|
|
R defaultMember(Member node);
|
|
|
|
@override
|
|
R visitConstructor(Constructor node) => defaultMember(node);
|
|
@override
|
|
R visitProcedure(Procedure node) => defaultMember(node);
|
|
@override
|
|
R visitField(Field node) => defaultMember(node);
|
|
}
|
|
|
|
abstract class MemberVisitor1<R, A> {
|
|
const MemberVisitor1();
|
|
|
|
R visitConstructor(Constructor node, A arg);
|
|
R visitProcedure(Procedure node, A arg);
|
|
R visitField(Field node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [MemberVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultMember] method.
|
|
mixin MemberVisitor1DefaultMixin<R, A> implements MemberVisitor1<R, A> {
|
|
R defaultMember(Member node, A arg);
|
|
|
|
@override
|
|
R visitConstructor(Constructor node, A arg) => defaultMember(node, arg);
|
|
@override
|
|
R visitProcedure(Procedure node, A arg) => defaultMember(node, arg);
|
|
@override
|
|
R visitField(Field node, A arg) => defaultMember(node, arg);
|
|
}
|
|
|
|
abstract class InitializerVisitor<R> {
|
|
const InitializerVisitor();
|
|
|
|
R visitAuxiliaryInitializer(AuxiliaryInitializer node);
|
|
R visitInvalidInitializer(InvalidInitializer node);
|
|
R visitFieldInitializer(FieldInitializer node);
|
|
R visitSuperInitializer(SuperInitializer node);
|
|
R visitRedirectingInitializer(RedirectingInitializer node);
|
|
R visitLocalInitializer(LocalInitializer node);
|
|
R visitAssertInitializer(AssertInitializer node);
|
|
}
|
|
|
|
/// Helper mixin for [InitializerVisitor] that implements visit methods by
|
|
/// delegating to the [defaultInitializer] method.
|
|
mixin InitializerVisitorDefaultMixin<R> implements InitializerVisitor<R> {
|
|
R defaultInitializer(Initializer node);
|
|
|
|
@override
|
|
R visitAuxiliaryInitializer(AuxiliaryInitializer node) =>
|
|
defaultInitializer(node);
|
|
@override
|
|
R visitInvalidInitializer(InvalidInitializer node) =>
|
|
defaultInitializer(node);
|
|
@override
|
|
R visitFieldInitializer(FieldInitializer node) => defaultInitializer(node);
|
|
@override
|
|
R visitSuperInitializer(SuperInitializer node) => defaultInitializer(node);
|
|
@override
|
|
R visitRedirectingInitializer(RedirectingInitializer node) =>
|
|
defaultInitializer(node);
|
|
@override
|
|
R visitLocalInitializer(LocalInitializer node) => defaultInitializer(node);
|
|
@override
|
|
R visitAssertInitializer(AssertInitializer node) => defaultInitializer(node);
|
|
}
|
|
|
|
abstract class InitializerVisitor1<R, A> {
|
|
const InitializerVisitor1();
|
|
|
|
R visitAuxiliaryInitializer(AuxiliaryInitializer node, A arg);
|
|
R visitInvalidInitializer(InvalidInitializer node, A arg);
|
|
R visitFieldInitializer(FieldInitializer node, A arg);
|
|
R visitSuperInitializer(SuperInitializer node, A arg);
|
|
R visitRedirectingInitializer(RedirectingInitializer node, A arg);
|
|
R visitLocalInitializer(LocalInitializer node, A arg);
|
|
R visitAssertInitializer(AssertInitializer node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [InitializerVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultInitializer] method.
|
|
mixin InitializerVisitor1DefaultMixin<R, A>
|
|
implements InitializerVisitor1<R, A> {
|
|
R defaultInitializer(Initializer node, A arg);
|
|
|
|
@override
|
|
R visitAuxiliaryInitializer(AuxiliaryInitializer node, A arg) =>
|
|
defaultInitializer(node, arg);
|
|
@override
|
|
R visitInvalidInitializer(InvalidInitializer node, A arg) =>
|
|
defaultInitializer(node, arg);
|
|
@override
|
|
R visitFieldInitializer(FieldInitializer node, A arg) =>
|
|
defaultInitializer(node, arg);
|
|
@override
|
|
R visitSuperInitializer(SuperInitializer node, A arg) =>
|
|
defaultInitializer(node, arg);
|
|
@override
|
|
R visitRedirectingInitializer(RedirectingInitializer node, A arg) =>
|
|
defaultInitializer(node, arg);
|
|
@override
|
|
R visitLocalInitializer(LocalInitializer node, A arg) =>
|
|
defaultInitializer(node, arg);
|
|
@override
|
|
R visitAssertInitializer(AssertInitializer node, A arg) =>
|
|
defaultInitializer(node, arg);
|
|
}
|
|
|
|
abstract class TreeVisitor<R>
|
|
implements
|
|
ExpressionVisitor<R>,
|
|
PatternVisitor<R>,
|
|
StatementVisitor<R>,
|
|
MemberVisitor<R>,
|
|
InitializerVisitor<R> {
|
|
const TreeVisitor();
|
|
|
|
// Classes
|
|
R visitClass(Class node);
|
|
R visitExtension(Extension node);
|
|
R visitExtensionTypeDeclaration(ExtensionTypeDeclaration node);
|
|
|
|
// Other tree nodes
|
|
R visitLibrary(Library node);
|
|
R visitLibraryDependency(LibraryDependency node);
|
|
R visitCombinator(Combinator node);
|
|
R visitLibraryPart(LibraryPart node);
|
|
R visitTypedef(Typedef node);
|
|
R visitFunctionNode(FunctionNode node);
|
|
R visitArguments(Arguments node);
|
|
R visitNamedExpression(NamedExpression node);
|
|
R visitSwitchCase(SwitchCase node);
|
|
R visitPatternSwitchCase(PatternSwitchCase node);
|
|
R visitSwitchExpressionCase(SwitchExpressionCase node);
|
|
R visitCatch(Catch node);
|
|
R visitMapLiteralEntry(MapLiteralEntry node);
|
|
R visitMapPatternEntry(MapPatternEntry node);
|
|
R visitMapPatternRestEntry(MapPatternRestEntry node);
|
|
R visitPatternGuard(PatternGuard node);
|
|
R visitComponent(Component node);
|
|
R visitTypeVariable(TypeVariable node);
|
|
R visitLocalVariable(LocalVariable node);
|
|
R visitCatchVariable(CatchVariable node);
|
|
R visitThisVariable(ThisVariable node);
|
|
R visitSyntheticVariable(SyntheticVariable node);
|
|
R visitVariableContext(VariableContext node);
|
|
R visitScope(Scope node);
|
|
R visitNominalParameter(NominalParameter node);
|
|
}
|
|
|
|
/// Helper mixin for [TreeVisitor] that implements visit methods by delegating
|
|
/// to the [defaultTreeNode] method.
|
|
mixin TreeVisitorDefaultMixin<R> implements TreeVisitor<R> {
|
|
R defaultTreeNode(TreeNode node);
|
|
|
|
// Classes
|
|
@override
|
|
R visitClass(Class node) => defaultTreeNode(node);
|
|
@override
|
|
R visitExtension(Extension node) => defaultTreeNode(node);
|
|
@override
|
|
R visitExtensionTypeDeclaration(ExtensionTypeDeclaration node) =>
|
|
defaultTreeNode(node);
|
|
|
|
// Other tree nodes
|
|
@override
|
|
R visitLibrary(Library node) => defaultTreeNode(node);
|
|
@override
|
|
R visitLibraryDependency(LibraryDependency node) => defaultTreeNode(node);
|
|
@override
|
|
R visitCombinator(Combinator node) => defaultTreeNode(node);
|
|
@override
|
|
R visitLibraryPart(LibraryPart node) => defaultTreeNode(node);
|
|
@override
|
|
R visitTypedef(Typedef node) => defaultTreeNode(node);
|
|
R visitTypeParameter(TypeParameter node) => defaultTreeNode(node);
|
|
@override
|
|
R visitFunctionNode(FunctionNode node) => defaultTreeNode(node);
|
|
@override
|
|
R visitArguments(Arguments node) => defaultTreeNode(node);
|
|
@override
|
|
R visitNamedExpression(NamedExpression node) => defaultTreeNode(node);
|
|
@override
|
|
R visitSwitchCase(SwitchCase node) => defaultTreeNode(node);
|
|
@override
|
|
R visitPatternSwitchCase(PatternSwitchCase node) => defaultTreeNode(node);
|
|
@override
|
|
R visitSwitchExpressionCase(SwitchExpressionCase node) =>
|
|
defaultTreeNode(node);
|
|
@override
|
|
R visitCatch(Catch node) => defaultTreeNode(node);
|
|
@override
|
|
R visitMapLiteralEntry(MapLiteralEntry node) => defaultTreeNode(node);
|
|
@override
|
|
R visitMapPatternEntry(MapPatternEntry node) => defaultTreeNode(node);
|
|
@override
|
|
R visitMapPatternRestEntry(MapPatternRestEntry node) => defaultTreeNode(node);
|
|
@override
|
|
R visitPatternGuard(PatternGuard node) => defaultTreeNode(node);
|
|
@override
|
|
R visitComponent(Component node) => defaultTreeNode(node);
|
|
@override
|
|
R visitTypeVariable(TypeVariable node) => defaultTreeNode(node);
|
|
@override
|
|
R visitLocalVariable(LocalVariable node) => defaultTreeNode(node);
|
|
@override
|
|
R visitCatchVariable(CatchVariable node) => defaultTreeNode(node);
|
|
@override
|
|
R visitThisVariable(ThisVariable node) => defaultTreeNode(node);
|
|
@override
|
|
R visitSyntheticVariable(SyntheticVariable node) => defaultTreeNode(node);
|
|
@override
|
|
R visitVariableContext(VariableContext node) => defaultTreeNode(node);
|
|
@override
|
|
R visitScope(Scope node) => defaultTreeNode(node);
|
|
@override
|
|
R visitNominalParameter(NominalParameter node) => visitTypeParameter(node);
|
|
}
|
|
|
|
/// Base class for implementing [TreeVisitor1] that implements visit methods
|
|
/// mixing in the various `DefaultMixin` mixins and delegating their `default`
|
|
/// methods to the [defaultTreeNode] method.
|
|
abstract class TreeVisitorDefault<R>
|
|
with
|
|
ExpressionVisitorDefaultMixin<R>,
|
|
StatementVisitorDefaultMixin<R>,
|
|
PatternVisitorDefaultMixin<R>,
|
|
InitializerVisitorDefaultMixin<R>,
|
|
MemberVisitorDefaultMixin<R>,
|
|
TreeVisitorDefaultMixin<R>
|
|
implements TreeVisitor<R> {
|
|
const TreeVisitorDefault();
|
|
|
|
@override
|
|
R defaultExpression(Expression node) => defaultTreeNode(node);
|
|
@override
|
|
R defaultPattern(Pattern node) => defaultTreeNode(node);
|
|
@override
|
|
R defaultStatement(Statement node) => defaultTreeNode(node);
|
|
@override
|
|
R defaultInitializer(Initializer node) => defaultTreeNode(node);
|
|
@override
|
|
R defaultMember(Member node) => defaultTreeNode(node);
|
|
}
|
|
|
|
abstract class TreeVisitor1<R, A>
|
|
implements
|
|
ExpressionVisitor1<R, A>,
|
|
PatternVisitor1<R, A>,
|
|
StatementVisitor1<R, A>,
|
|
MemberVisitor1<R, A>,
|
|
InitializerVisitor1<R, A> {
|
|
const TreeVisitor1();
|
|
|
|
// Classes
|
|
R visitClass(Class node, A arg);
|
|
R visitExtension(Extension node, A arg);
|
|
R visitExtensionTypeDeclaration(ExtensionTypeDeclaration node, A arg);
|
|
|
|
// Other tree nodes
|
|
R visitLibrary(Library node, A arg);
|
|
R visitLibraryDependency(LibraryDependency node, A arg);
|
|
R visitCombinator(Combinator node, A arg);
|
|
R visitLibraryPart(LibraryPart node, A arg);
|
|
R visitTypedef(Typedef node, A arg);
|
|
R visitFunctionNode(FunctionNode node, A arg);
|
|
R visitArguments(Arguments node, A arg);
|
|
R visitNamedExpression(NamedExpression node, A arg);
|
|
R visitSwitchCase(SwitchCase node, A arg);
|
|
R visitPatternSwitchCase(PatternSwitchCase node, A arg);
|
|
R visitSwitchExpressionCase(SwitchExpressionCase node, A arg);
|
|
R visitCatch(Catch node, A arg);
|
|
R visitMapLiteralEntry(MapLiteralEntry node, A arg);
|
|
R visitMapPatternEntry(MapPatternEntry node, A arg);
|
|
R visitMapPatternRestEntry(MapPatternRestEntry node, A arg);
|
|
R visitPatternGuard(PatternGuard node, A arg);
|
|
R visitComponent(Component node, A arg);
|
|
R visitTypeVariable(TypeVariable node, A arg);
|
|
R visitLocalVariable(LocalVariable node, A arg);
|
|
R visitCatchVariable(CatchVariable node, A arg);
|
|
R visitThisVariable(ThisVariable node, A arg);
|
|
R visitSyntheticVariable(SyntheticVariable node, A arg);
|
|
R visitVariableContext(VariableContext node, A arg);
|
|
R visitScope(Scope node, A arg);
|
|
R visitNominalParameter(NominalParameter node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [TreeVisitor1] that implements visit methods by delegating
|
|
/// to the [defaultTreeNode] method.
|
|
mixin TreeVisitor1DefaultMixin<R, A> implements TreeVisitor1<R, A> {
|
|
R defaultTreeNode(TreeNode node, A arg);
|
|
|
|
// Classes
|
|
@override
|
|
R visitClass(Class node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitExtension(Extension node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitExtensionTypeDeclaration(ExtensionTypeDeclaration node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
|
|
// Other tree nodes
|
|
@override
|
|
R visitLibrary(Library node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitLibraryDependency(LibraryDependency node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitCombinator(Combinator node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitLibraryPart(LibraryPart node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitTypedef(Typedef node, A arg) => defaultTreeNode(node, arg);
|
|
R visitTypeParameter(TypeParameter node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitFunctionNode(FunctionNode node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitArguments(Arguments node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitNamedExpression(NamedExpression node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitSwitchCase(SwitchCase node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitPatternSwitchCase(PatternSwitchCase node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitSwitchExpressionCase(SwitchExpressionCase node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitCatch(Catch node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitMapLiteralEntry(MapLiteralEntry node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitMapPatternEntry(MapPatternEntry node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitMapPatternRestEntry(MapPatternRestEntry node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitPatternGuard(PatternGuard node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitComponent(Component node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitTypeVariable(TypeVariable node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitLocalVariable(LocalVariable node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitCatchVariable(CatchVariable node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitThisVariable(ThisVariable node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitSyntheticVariable(SyntheticVariable node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitVariableContext(VariableContext node, A arg) =>
|
|
defaultTreeNode(node, arg);
|
|
@override
|
|
R visitScope(Scope node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R visitNominalParameter(NominalParameter node, A arg) =>
|
|
visitTypeParameter(node, arg);
|
|
}
|
|
|
|
/// Base class for implementing [TreeVisitor1] that implements visit methods
|
|
/// mixing in the various `DefaultMixin` mixins and delegating their `default`
|
|
/// methods to the [defaultTreeNode] method.
|
|
abstract class TreeVisitor1Default<R, A>
|
|
with
|
|
TreeVisitor1DefaultMixin<R, A>,
|
|
ExpressionVisitor1DefaultMixin<R, A>,
|
|
PatternVisitor1DefaultMixin<R, A>,
|
|
StatementVisitor1DefaultMixin<R, A>,
|
|
InitializerVisitor1DefaultMixin<R, A>,
|
|
MemberVisitor1DefaultMixin<R, A>
|
|
implements TreeVisitor1<R, A> {
|
|
const TreeVisitor1Default();
|
|
|
|
@override
|
|
R defaultExpression(Expression node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R defaultPattern(Pattern node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R defaultStatement(Statement node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R defaultInitializer(Initializer node, A arg) => defaultTreeNode(node, arg);
|
|
@override
|
|
R defaultMember(Member node, A arg) => defaultTreeNode(node, arg);
|
|
}
|
|
|
|
typedef DartTypeVisitorAuxiliaryFunction<R> =
|
|
R Function(AuxiliaryType node, R Function(AuxiliaryType node) recursor);
|
|
|
|
abstract class DartTypeVisitor<R> {
|
|
const DartTypeVisitor();
|
|
|
|
R visitAuxiliaryType(AuxiliaryType node);
|
|
R visitInvalidType(InvalidType node);
|
|
R visitDynamicType(DynamicType node);
|
|
R visitVoidType(VoidType node);
|
|
R visitInterfaceType(InterfaceType node);
|
|
R visitFutureOrType(FutureOrType node);
|
|
R visitFunctionType(FunctionType node);
|
|
R visitTypeParameterType(TypeParameterType node);
|
|
R visitStructuralParameterType(StructuralParameterType node);
|
|
R visitTypedefType(TypedefType node);
|
|
R visitNeverType(NeverType node);
|
|
R visitNullType(NullType node);
|
|
R visitExtensionType(ExtensionType node);
|
|
R visitIntersectionType(IntersectionType node);
|
|
R visitRecordType(RecordType node);
|
|
R visitFunctionTypeParameterType(FunctionTypeParameterType node);
|
|
R visitClassTypeParameterType(ClassTypeParameterType node);
|
|
}
|
|
|
|
/// Helper mixin for [DartTypeVisitor] that implements visit methods by
|
|
/// delegating to the [defaultDartType] method.
|
|
mixin DartTypeVisitorDefaultMixin<R> implements DartTypeVisitor<R> {
|
|
R defaultDartType(DartType node);
|
|
|
|
@override
|
|
R visitAuxiliaryType(AuxiliaryType node) => defaultDartType(node);
|
|
@override
|
|
R visitInvalidType(InvalidType node) => defaultDartType(node);
|
|
@override
|
|
R visitDynamicType(DynamicType node) => defaultDartType(node);
|
|
@override
|
|
R visitVoidType(VoidType node) => defaultDartType(node);
|
|
@override
|
|
R visitInterfaceType(InterfaceType node) => defaultDartType(node);
|
|
@override
|
|
R visitFutureOrType(FutureOrType node) => defaultDartType(node);
|
|
@override
|
|
R visitFunctionType(FunctionType node) => defaultDartType(node);
|
|
@override
|
|
R visitTypeParameterType(TypeParameterType node) => defaultDartType(node);
|
|
@override
|
|
R visitStructuralParameterType(StructuralParameterType node) =>
|
|
defaultDartType(node);
|
|
@override
|
|
R visitTypedefType(TypedefType node) => defaultDartType(node);
|
|
@override
|
|
R visitNeverType(NeverType node) => defaultDartType(node);
|
|
@override
|
|
R visitNullType(NullType node) => defaultDartType(node);
|
|
@override
|
|
R visitExtensionType(ExtensionType node) => defaultDartType(node);
|
|
@override
|
|
R visitIntersectionType(IntersectionType node) => defaultDartType(node);
|
|
@override
|
|
R visitRecordType(RecordType node) => defaultDartType(node);
|
|
@override
|
|
R visitFunctionTypeParameterType(FunctionTypeParameterType node) =>
|
|
defaultDartType(node);
|
|
@override
|
|
R visitClassTypeParameterType(ClassTypeParameterType node) =>
|
|
defaultDartType(node);
|
|
}
|
|
|
|
typedef DartTypeVisitor1AuxiliaryFunction<R, A> =
|
|
R Function(
|
|
AuxiliaryType node,
|
|
A arg,
|
|
R Function(AuxiliaryType node, A arg) recursor,
|
|
);
|
|
|
|
abstract class DartTypeVisitor1<R, A> {
|
|
const DartTypeVisitor1();
|
|
|
|
R visitAuxiliaryType(AuxiliaryType node, A arg);
|
|
R visitInvalidType(InvalidType node, A arg);
|
|
R visitDynamicType(DynamicType node, A arg);
|
|
R visitVoidType(VoidType node, A arg);
|
|
R visitInterfaceType(InterfaceType node, A arg);
|
|
R visitFutureOrType(FutureOrType node, A arg);
|
|
R visitFunctionType(FunctionType node, A arg);
|
|
R visitTypeParameterType(TypeParameterType node, A arg);
|
|
R visitStructuralParameterType(StructuralParameterType node, A arg);
|
|
R visitTypedefType(TypedefType node, A arg);
|
|
R visitNeverType(NeverType node, A arg);
|
|
R visitNullType(NullType node, A arg);
|
|
R visitExtensionType(ExtensionType node, A arg);
|
|
R visitIntersectionType(IntersectionType node, A arg);
|
|
R visitRecordType(RecordType node, A arg);
|
|
R visitFunctionTypeParameterType(FunctionTypeParameterType node, A arg);
|
|
R visitClassTypeParameterType(ClassTypeParameterType node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [DartTypeVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultDartType] method.
|
|
mixin DartTypeVisitor1DefaultMixin<R, A> implements DartTypeVisitor1<R, A> {
|
|
R defaultDartType(DartType node, A arg);
|
|
|
|
@override
|
|
R visitAuxiliaryType(AuxiliaryType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitInvalidType(InvalidType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitDynamicType(DynamicType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitVoidType(VoidType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitInterfaceType(InterfaceType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitFutureOrType(FutureOrType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitFunctionType(FunctionType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitTypeParameterType(TypeParameterType node, A arg) =>
|
|
defaultDartType(node, arg);
|
|
@override
|
|
R visitStructuralParameterType(StructuralParameterType node, A arg) =>
|
|
defaultDartType(node, arg);
|
|
@override
|
|
R visitTypedefType(TypedefType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitNeverType(NeverType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitNullType(NullType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitExtensionType(ExtensionType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitIntersectionType(IntersectionType node, A arg) =>
|
|
defaultDartType(node, arg);
|
|
@override
|
|
R visitRecordType(RecordType node, A arg) => defaultDartType(node, arg);
|
|
@override
|
|
R visitFunctionTypeParameterType(FunctionTypeParameterType node, A arg) =>
|
|
defaultDartType(node, arg);
|
|
@override
|
|
R visitClassTypeParameterType(ClassTypeParameterType node, A arg) =>
|
|
defaultDartType(node, arg);
|
|
}
|
|
|
|
/// Visitor for [Constant] nodes.
|
|
///
|
|
/// Note: Constant nodes are _not_ trees but directed acyclic graphs. This
|
|
/// means that visiting a constant node without tracking which subnodes that
|
|
/// have already been visited might lead to exponential running times.
|
|
///
|
|
/// Use [ComputeOnceConstantVisitor] or [VisitOnceConstantVisitor] to visit
|
|
/// a constant node while ensuring each subnode is only visited once.
|
|
abstract class ConstantVisitor<R> {
|
|
const ConstantVisitor();
|
|
|
|
R visitAuxiliaryConstant(AuxiliaryConstant node);
|
|
R visitNullConstant(NullConstant node);
|
|
R visitBoolConstant(BoolConstant node);
|
|
R visitIntConstant(IntConstant node);
|
|
R visitDoubleConstant(DoubleConstant node);
|
|
R visitStringConstant(StringConstant node);
|
|
R visitSymbolConstant(SymbolConstant node);
|
|
R visitMapConstant(MapConstant node);
|
|
R visitListConstant(ListConstant node);
|
|
R visitSetConstant(SetConstant node);
|
|
R visitRecordConstant(RecordConstant node);
|
|
R visitInstanceConstant(InstanceConstant node);
|
|
R visitInstantiationConstant(InstantiationConstant node);
|
|
R visitTypedefTearOffConstant(TypedefTearOffConstant node);
|
|
R visitStaticTearOffConstant(StaticTearOffConstant node);
|
|
R visitConstructorTearOffConstant(ConstructorTearOffConstant node);
|
|
R visitRedirectingFactoryTearOffConstant(
|
|
RedirectingFactoryTearOffConstant node,
|
|
);
|
|
R visitTypeLiteralConstant(TypeLiteralConstant node);
|
|
R visitUnevaluatedConstant(UnevaluatedConstant node);
|
|
}
|
|
|
|
/// Helper mixin for [ConstantVisitor] that implements visit methods by
|
|
/// delegating to the [defaultConstant] method.
|
|
mixin ConstantVisitorDefaultMixin<R> implements ConstantVisitor<R> {
|
|
R defaultConstant(Constant node);
|
|
|
|
@override
|
|
R visitAuxiliaryConstant(AuxiliaryConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitNullConstant(NullConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitBoolConstant(BoolConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitIntConstant(IntConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitDoubleConstant(DoubleConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitStringConstant(StringConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitMapConstant(MapConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitListConstant(ListConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitSetConstant(SetConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitRecordConstant(RecordConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitInstantiationConstant(InstantiationConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitTypedefTearOffConstant(TypedefTearOffConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitStaticTearOffConstant(StaticTearOffConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitRedirectingFactoryTearOffConstant(
|
|
RedirectingFactoryTearOffConstant node,
|
|
) => defaultConstant(node);
|
|
@override
|
|
R visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
|
|
}
|
|
|
|
abstract class ConstantVisitor1<R, A> {
|
|
const ConstantVisitor1();
|
|
|
|
R visitAuxiliaryConstant(AuxiliaryConstant node, A arg);
|
|
R visitNullConstant(NullConstant node, A arg);
|
|
R visitBoolConstant(BoolConstant node, A arg);
|
|
R visitIntConstant(IntConstant node, A arg);
|
|
R visitDoubleConstant(DoubleConstant node, A arg);
|
|
R visitStringConstant(StringConstant node, A arg);
|
|
R visitSymbolConstant(SymbolConstant node, A arg);
|
|
R visitMapConstant(MapConstant node, A arg);
|
|
R visitListConstant(ListConstant node, A arg);
|
|
R visitSetConstant(SetConstant node, A arg);
|
|
R visitRecordConstant(RecordConstant node, A arg);
|
|
R visitInstanceConstant(InstanceConstant node, A arg);
|
|
R visitInstantiationConstant(InstantiationConstant node, A arg);
|
|
R visitStaticTearOffConstant(StaticTearOffConstant node, A arg);
|
|
R visitTypedefTearOffConstant(TypedefTearOffConstant node, A arg);
|
|
R visitConstructorTearOffConstant(ConstructorTearOffConstant node, A arg);
|
|
R visitRedirectingFactoryTearOffConstant(
|
|
RedirectingFactoryTearOffConstant node,
|
|
A arg,
|
|
);
|
|
R visitTypeLiteralConstant(TypeLiteralConstant node, A arg);
|
|
R visitUnevaluatedConstant(UnevaluatedConstant node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [ConstantVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultConstant] method.
|
|
mixin ConstantVisitor1DefaultMixin<R, A> implements ConstantVisitor1<R, A> {
|
|
R defaultConstant(Constant node, A arg);
|
|
|
|
@override
|
|
R visitAuxiliaryConstant(AuxiliaryConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitNullConstant(NullConstant node, A arg) => defaultConstant(node, arg);
|
|
@override
|
|
R visitBoolConstant(BoolConstant node, A arg) => defaultConstant(node, arg);
|
|
@override
|
|
R visitIntConstant(IntConstant node, A arg) => defaultConstant(node, arg);
|
|
@override
|
|
R visitDoubleConstant(DoubleConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitStringConstant(StringConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitSymbolConstant(SymbolConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitMapConstant(MapConstant node, A arg) => defaultConstant(node, arg);
|
|
@override
|
|
R visitListConstant(ListConstant node, A arg) => defaultConstant(node, arg);
|
|
@override
|
|
R visitSetConstant(SetConstant node, A arg) => defaultConstant(node, arg);
|
|
@override
|
|
R visitRecordConstant(RecordConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitInstanceConstant(InstanceConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitInstantiationConstant(InstantiationConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitStaticTearOffConstant(StaticTearOffConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitTypedefTearOffConstant(TypedefTearOffConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitConstructorTearOffConstant(ConstructorTearOffConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitRedirectingFactoryTearOffConstant(
|
|
RedirectingFactoryTearOffConstant node,
|
|
A arg,
|
|
) => defaultConstant(node, arg);
|
|
@override
|
|
R visitTypeLiteralConstant(TypeLiteralConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
@override
|
|
R visitUnevaluatedConstant(UnevaluatedConstant node, A arg) =>
|
|
defaultConstant(node, arg);
|
|
}
|
|
|
|
abstract class ConstantReferenceVisitor<R> {
|
|
R visitAuxiliaryConstantReference(AuxiliaryConstant node);
|
|
R visitNullConstantReference(NullConstant node);
|
|
R visitBoolConstantReference(BoolConstant node);
|
|
R visitIntConstantReference(IntConstant node);
|
|
R visitDoubleConstantReference(DoubleConstant node);
|
|
R visitStringConstantReference(StringConstant node);
|
|
R visitSymbolConstantReference(SymbolConstant node);
|
|
R visitMapConstantReference(MapConstant node);
|
|
R visitListConstantReference(ListConstant node);
|
|
R visitSetConstantReference(SetConstant node);
|
|
R visitRecordConstantReference(RecordConstant node);
|
|
R visitInstanceConstantReference(InstanceConstant node);
|
|
R visitInstantiationConstantReference(InstantiationConstant node);
|
|
R visitStaticTearOffConstantReference(StaticTearOffConstant node);
|
|
R visitConstructorTearOffConstantReference(ConstructorTearOffConstant node);
|
|
R visitRedirectingFactoryTearOffConstantReference(
|
|
RedirectingFactoryTearOffConstant node,
|
|
);
|
|
R visitTypedefTearOffConstantReference(TypedefTearOffConstant node);
|
|
R visitTypeLiteralConstantReference(TypeLiteralConstant node);
|
|
R visitUnevaluatedConstantReference(UnevaluatedConstant node);
|
|
}
|
|
|
|
/// Helper mixin for [ConstantReferenceVisitor] that implements visit methods
|
|
/// by delegating to the [defaultConstantReference] method.
|
|
mixin ConstantReferenceVisitorDefaultMixin<R>
|
|
implements ConstantReferenceVisitor<R> {
|
|
R defaultConstantReference(Constant node);
|
|
|
|
@override
|
|
R visitAuxiliaryConstantReference(AuxiliaryConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitNullConstantReference(NullConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitBoolConstantReference(BoolConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitIntConstantReference(IntConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitDoubleConstantReference(DoubleConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitStringConstantReference(StringConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitSymbolConstantReference(SymbolConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitMapConstantReference(MapConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitListConstantReference(ListConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitSetConstantReference(SetConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitRecordConstantReference(RecordConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitInstanceConstantReference(InstanceConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitInstantiationConstantReference(InstantiationConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitStaticTearOffConstantReference(StaticTearOffConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitConstructorTearOffConstantReference(ConstructorTearOffConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitRedirectingFactoryTearOffConstantReference(
|
|
RedirectingFactoryTearOffConstant node,
|
|
) => defaultConstantReference(node);
|
|
@override
|
|
R visitTypedefTearOffConstantReference(TypedefTearOffConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitTypeLiteralConstantReference(TypeLiteralConstant node) =>
|
|
defaultConstantReference(node);
|
|
@override
|
|
R visitUnevaluatedConstantReference(UnevaluatedConstant node) =>
|
|
defaultConstantReference(node);
|
|
}
|
|
|
|
abstract class ConstantReferenceVisitor1<R, A> {
|
|
R visitAuxiliaryConstantReference(AuxiliaryConstant node, A arg);
|
|
R visitNullConstantReference(NullConstant node, A arg);
|
|
R visitBoolConstantReference(BoolConstant node, A arg);
|
|
R visitIntConstantReference(IntConstant node, A arg);
|
|
R visitDoubleConstantReference(DoubleConstant node, A arg);
|
|
R visitStringConstantReference(StringConstant node, A arg);
|
|
R visitSymbolConstantReference(SymbolConstant node, A arg);
|
|
R visitMapConstantReference(MapConstant node, A arg);
|
|
R visitListConstantReference(ListConstant node, A arg);
|
|
R visitSetConstantReference(SetConstant node, A arg);
|
|
R visitRecordConstantReference(RecordConstant node, A arg);
|
|
R visitInstanceConstantReference(InstanceConstant node, A arg);
|
|
R visitInstantiationConstantReference(InstantiationConstant node, A arg);
|
|
R visitConstructorTearOffConstantReference(
|
|
ConstructorTearOffConstant node,
|
|
A arg,
|
|
);
|
|
R visitRedirectingFactoryTearOffConstantReference(
|
|
RedirectingFactoryTearOffConstant node,
|
|
A arg,
|
|
);
|
|
R visitStaticTearOffConstantReference(StaticTearOffConstant node, A arg);
|
|
R visitTypedefTearOffConstantReference(TypedefTearOffConstant node, A arg);
|
|
R visitTypeLiteralConstantReference(TypeLiteralConstant node, A arg);
|
|
R visitUnevaluatedConstantReference(UnevaluatedConstant node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [ConstantReferenceVisitor1] that implements visit methods
|
|
/// by delegating to the [defaultConstantReference] method.
|
|
mixin ConstantReferenceVisitor1DefaultMixin<R, A>
|
|
implements ConstantReferenceVisitor1<R, A> {
|
|
R defaultConstantReference(Constant node, A arg);
|
|
|
|
@override
|
|
R visitAuxiliaryConstantReference(AuxiliaryConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitNullConstantReference(NullConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitBoolConstantReference(BoolConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitIntConstantReference(IntConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitDoubleConstantReference(DoubleConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitStringConstantReference(StringConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitSymbolConstantReference(SymbolConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitMapConstantReference(MapConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitListConstantReference(ListConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitSetConstantReference(SetConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitRecordConstantReference(RecordConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitInstanceConstantReference(InstanceConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitInstantiationConstantReference(InstantiationConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitConstructorTearOffConstantReference(
|
|
ConstructorTearOffConstant node,
|
|
A arg,
|
|
) => defaultConstantReference(node, arg);
|
|
@override
|
|
R visitRedirectingFactoryTearOffConstantReference(
|
|
RedirectingFactoryTearOffConstant node,
|
|
A arg,
|
|
) => defaultConstantReference(node, arg);
|
|
@override
|
|
R visitStaticTearOffConstantReference(StaticTearOffConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitTypedefTearOffConstantReference(TypedefTearOffConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitTypeLiteralConstantReference(TypeLiteralConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
@override
|
|
R visitUnevaluatedConstantReference(UnevaluatedConstant node, A arg) =>
|
|
defaultConstantReference(node, arg);
|
|
}
|
|
|
|
abstract class _ConstantCallback<R> {
|
|
R visitAuxiliaryConstant(AuxiliaryConstant node);
|
|
R visitNullConstant(NullConstant node);
|
|
R visitBoolConstant(BoolConstant node);
|
|
R visitIntConstant(IntConstant node);
|
|
R visitDoubleConstant(DoubleConstant node);
|
|
R visitStringConstant(StringConstant node);
|
|
R visitSymbolConstant(SymbolConstant node);
|
|
R visitMapConstant(MapConstant node);
|
|
R visitListConstant(ListConstant node);
|
|
R visitSetConstant(SetConstant node);
|
|
R visitRecordConstant(RecordConstant node);
|
|
R visitInstanceConstant(InstanceConstant node);
|
|
R visitInstantiationConstant(InstantiationConstant node);
|
|
R visitTypedefTearOffConstant(TypedefTearOffConstant node);
|
|
R visitStaticTearOffConstant(StaticTearOffConstant node);
|
|
R visitConstructorTearOffConstant(ConstructorTearOffConstant node);
|
|
R visitRedirectingFactoryTearOffConstant(
|
|
RedirectingFactoryTearOffConstant node,
|
|
);
|
|
R visitTypeLiteralConstant(TypeLiteralConstant node);
|
|
R visitUnevaluatedConstant(UnevaluatedConstant node);
|
|
}
|
|
|
|
class _ConstantCallbackVisitor<R> implements ConstantVisitor<R> {
|
|
final _ConstantCallback _callback;
|
|
|
|
_ConstantCallbackVisitor(this._callback);
|
|
|
|
@override
|
|
R visitUnevaluatedConstant(UnevaluatedConstant node) =>
|
|
_callback.visitUnevaluatedConstant(node);
|
|
|
|
@override
|
|
R visitTypeLiteralConstant(TypeLiteralConstant node) =>
|
|
_callback.visitTypeLiteralConstant(node);
|
|
|
|
@override
|
|
R visitStaticTearOffConstant(StaticTearOffConstant node) =>
|
|
_callback.visitStaticTearOffConstant(node);
|
|
|
|
@override
|
|
R visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
|
|
_callback.visitConstructorTearOffConstant(node);
|
|
|
|
@override
|
|
R visitRedirectingFactoryTearOffConstant(
|
|
RedirectingFactoryTearOffConstant node,
|
|
) => _callback.visitRedirectingFactoryTearOffConstant(node);
|
|
|
|
@override
|
|
R visitInstantiationConstant(InstantiationConstant node) =>
|
|
_callback.visitInstantiationConstant(node);
|
|
|
|
@override
|
|
R visitTypedefTearOffConstant(TypedefTearOffConstant node) =>
|
|
_callback.visitTypedefTearOffConstant(node);
|
|
|
|
@override
|
|
R visitInstanceConstant(InstanceConstant node) =>
|
|
_callback.visitInstanceConstant(node);
|
|
|
|
@override
|
|
R visitSetConstant(SetConstant node) => _callback.visitSetConstant(node);
|
|
|
|
@override
|
|
R visitListConstant(ListConstant node) => _callback.visitListConstant(node);
|
|
|
|
@override
|
|
R visitMapConstant(MapConstant node) => _callback.visitMapConstant(node);
|
|
|
|
@override
|
|
R visitRecordConstant(RecordConstant node) =>
|
|
_callback.visitRecordConstant(node);
|
|
|
|
@override
|
|
R visitSymbolConstant(SymbolConstant node) =>
|
|
_callback.visitSymbolConstant(node);
|
|
|
|
@override
|
|
R visitStringConstant(StringConstant node) =>
|
|
_callback.visitStringConstant(node);
|
|
|
|
@override
|
|
R visitDoubleConstant(DoubleConstant node) =>
|
|
_callback.visitDoubleConstant(node);
|
|
|
|
@override
|
|
R visitIntConstant(IntConstant node) => _callback.visitIntConstant(node);
|
|
|
|
@override
|
|
R visitBoolConstant(BoolConstant node) => _callback.visitBoolConstant(node);
|
|
|
|
@override
|
|
R visitNullConstant(NullConstant node) => _callback.visitNullConstant(node);
|
|
|
|
@override
|
|
R visitAuxiliaryConstant(AuxiliaryConstant node) =>
|
|
_callback.visitAuxiliaryConstant(node);
|
|
}
|
|
|
|
/// Helper mixin for [ComputeOnceConstantVisitor] and [VisitOnceConstantVisitor]
|
|
/// that implements the visit methods by delegating to the [defaultConstant]
|
|
/// method.
|
|
mixin OnceConstantVisitorDefaultMixin<R> implements _ConstantCallback<R> {
|
|
R defaultConstant(Constant node);
|
|
|
|
@override
|
|
R visitAuxiliaryConstant(AuxiliaryConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitNullConstant(NullConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitBoolConstant(BoolConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitIntConstant(IntConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitDoubleConstant(DoubleConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitStringConstant(StringConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitMapConstant(MapConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitListConstant(ListConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitSetConstant(SetConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitRecordConstant(RecordConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitInstantiationConstant(InstantiationConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitTypedefTearOffConstant(TypedefTearOffConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitStaticTearOffConstant(StaticTearOffConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitConstructorTearOffConstant(ConstructorTearOffConstant node) =>
|
|
defaultConstant(node);
|
|
@override
|
|
R visitRedirectingFactoryTearOffConstant(
|
|
RedirectingFactoryTearOffConstant node,
|
|
) => defaultConstant(node);
|
|
@override
|
|
R visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
|
|
@override
|
|
R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
|
|
}
|
|
|
|
/// Visitor-like class used for visiting a [Constant] node while computing a
|
|
/// value for each subnode. The visitor caches the computed values ensuring that
|
|
/// each subnode is only visited once.
|
|
abstract class ComputeOnceConstantVisitor<R> implements _ConstantCallback<R> {
|
|
late final _ConstantCallbackVisitor<R> _visitor;
|
|
Map<Constant, R> cache = new LinkedHashMap.identity();
|
|
|
|
ComputeOnceConstantVisitor() {
|
|
_visitor = new _ConstantCallbackVisitor<R>(this);
|
|
}
|
|
|
|
/// Visits [node] if not already visited to compute a value for [node].
|
|
///
|
|
/// If the value has already been computed the cached value is returned
|
|
/// immediately.
|
|
///
|
|
/// Call this method to compute values for subnodes recursively, while only
|
|
/// visiting each subnode once.
|
|
R visitConstant(Constant node) {
|
|
return cache[node] ??= processValue(node, node.accept(_visitor));
|
|
}
|
|
|
|
/// Returns the computed [value] for [node].
|
|
///
|
|
/// Override this method to process the computed value before caching.
|
|
R processValue(Constant node, R value) {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
/// Visitor-like class used for visiting each subnode of a [Constant] node once.
|
|
///
|
|
/// The visitor records the visited node to ensure that each subnode is only
|
|
/// visited once.
|
|
abstract class VisitOnceConstantVisitor implements _ConstantCallback<void> {
|
|
late final _ConstantCallbackVisitor<void> _visitor;
|
|
Set<Constant> cache = new LinkedHashSet.identity();
|
|
|
|
VisitOnceConstantVisitor() {
|
|
_visitor = new _ConstantCallbackVisitor<void>(this);
|
|
}
|
|
|
|
/// Visits [node] if not already visited.
|
|
///
|
|
/// Call this method to visit subnodes recursively, while only visiting each
|
|
/// subnode once.
|
|
void visitConstant(Constant node) {
|
|
if (cache.add(node)) {
|
|
node.accept(_visitor);
|
|
}
|
|
}
|
|
}
|
|
|
|
abstract class MemberReferenceVisitor<R> {
|
|
const MemberReferenceVisitor();
|
|
|
|
R visitFieldReference(Field node);
|
|
R visitConstructorReference(Constructor node);
|
|
R visitProcedureReference(Procedure node);
|
|
}
|
|
|
|
/// Helper mixin for [MemberReferenceVisitor] that implements visit methods by
|
|
/// delegating to the [defaultMemberReference] method.
|
|
mixin MemberReferenceVisitorDefaultMixin<R>
|
|
implements MemberReferenceVisitor<R> {
|
|
R defaultMemberReference(Member node);
|
|
|
|
@override
|
|
R visitFieldReference(Field node) => defaultMemberReference(node);
|
|
@override
|
|
R visitConstructorReference(Constructor node) => defaultMemberReference(node);
|
|
@override
|
|
R visitProcedureReference(Procedure node) => defaultMemberReference(node);
|
|
}
|
|
|
|
abstract class MemberReferenceVisitor1<R, A> {
|
|
const MemberReferenceVisitor1();
|
|
|
|
R visitFieldReference(Field node, A arg);
|
|
R visitConstructorReference(Constructor node, A arg);
|
|
R visitProcedureReference(Procedure node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [MemberReferenceVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultMemberReference] method.
|
|
mixin MemberReferenceVisitor1DefaultMixin<R, A>
|
|
implements MemberReferenceVisitor1<R, A> {
|
|
R defaultMemberReference(Member node, A arg);
|
|
|
|
@override
|
|
R visitFieldReference(Field node, A arg) => defaultMemberReference(node, arg);
|
|
@override
|
|
R visitConstructorReference(Constructor node, A arg) =>
|
|
defaultMemberReference(node, arg);
|
|
@override
|
|
R visitProcedureReference(Procedure node, A arg) =>
|
|
defaultMemberReference(node, arg);
|
|
}
|
|
|
|
abstract class Visitor<R>
|
|
implements
|
|
TreeVisitor<R>,
|
|
DartTypeVisitor<R>,
|
|
ConstantVisitor<R>,
|
|
MemberReferenceVisitor<R>,
|
|
ConstantReferenceVisitor<R> {
|
|
const Visitor();
|
|
|
|
// TODO(johnniwinther): Move these to [MemberReferenceVisitor].
|
|
R visitClassReference(Class node);
|
|
R visitTypedefReference(Typedef node);
|
|
R visitExtensionReference(Extension node);
|
|
R visitExtensionTypeDeclarationReference(ExtensionTypeDeclaration node);
|
|
|
|
R visitName(Name node);
|
|
R visitSupertype(Supertype node);
|
|
R visitNamedType(NamedType node);
|
|
R visitStructuralParameter(StructuralParameter node);
|
|
}
|
|
|
|
mixin VisitorDefaultMixin<R> implements Visitor<R> {
|
|
/// The catch-all case, except for references.
|
|
R defaultNode(Node node);
|
|
|
|
@override
|
|
R visitName(Name node) => defaultNode(node);
|
|
@override
|
|
R visitSupertype(Supertype node) => defaultNode(node);
|
|
@override
|
|
R visitNamedType(NamedType node) => defaultNode(node);
|
|
@override
|
|
R visitStructuralParameter(StructuralParameter node) => defaultNode(node);
|
|
}
|
|
|
|
/// Base class for implementing [Visitor] that implements visit methods mixing
|
|
/// in the various `DefaultMixin` mixins and delegating their `default` methods
|
|
/// to the [defaultNode] method.
|
|
abstract class VisitorDefault<R> extends TreeVisitorDefault<R>
|
|
with
|
|
VisitorDefaultMixin<R>,
|
|
DartTypeVisitorDefaultMixin<R>,
|
|
ConstantVisitorDefaultMixin<R>,
|
|
MemberReferenceVisitorDefaultMixin<R>,
|
|
ConstantReferenceVisitorDefaultMixin<R> {
|
|
const VisitorDefault();
|
|
|
|
@override
|
|
R defaultTreeNode(TreeNode node) => defaultNode(node);
|
|
|
|
@override
|
|
R defaultDartType(DartType node) => defaultNode(node);
|
|
|
|
@override
|
|
R defaultConstant(Constant node) => defaultNode(node);
|
|
}
|
|
|
|
abstract class Visitor1<R, A> extends TreeVisitor1<R, A>
|
|
implements
|
|
DartTypeVisitor1<R, A>,
|
|
ConstantVisitor1<R, A>,
|
|
MemberReferenceVisitor1<R, A>,
|
|
ConstantReferenceVisitor1<R, A> {
|
|
const Visitor1();
|
|
|
|
// TODO(johnniwinther): Move these to [MemberReferenceVisitor1].
|
|
R visitClassReference(Class node, A arg);
|
|
R visitTypedefReference(Typedef node, A arg);
|
|
R visitExtensionReference(Extension node, A arg);
|
|
R visitExtensionTypeDeclarationReference(
|
|
ExtensionTypeDeclaration node,
|
|
A arg,
|
|
);
|
|
|
|
R visitName(Name node, A arg);
|
|
R visitSupertype(Supertype node, A arg);
|
|
R visitNamedType(NamedType node, A arg);
|
|
R visitStructuralParameter(StructuralParameter node, A arg);
|
|
}
|
|
|
|
mixin Visitor1DefaultMixin<R, A> implements Visitor1<R, A> {
|
|
/// The catch-all case, except for references.
|
|
R defaultNode(Node node, A arg);
|
|
|
|
@override
|
|
R visitName(Name node, A arg) => defaultNode(node, arg);
|
|
|
|
@override
|
|
R visitSupertype(Supertype node, A arg) => defaultNode(node, arg);
|
|
|
|
@override
|
|
R visitNamedType(NamedType node, A arg) => defaultNode(node, arg);
|
|
|
|
@override
|
|
R visitStructuralParameter(StructuralParameter node, A arg) =>
|
|
defaultNode(node, arg);
|
|
}
|
|
|
|
/// Base class for implementing [Visitor1] that implements visit methods mixing
|
|
/// in the various `DefaultMixin` mixins and delegating their `default` methods
|
|
/// to the [defaultNode] method.
|
|
abstract class Visitor1Default<R, A> extends TreeVisitor1Default<R, A>
|
|
with
|
|
Visitor1DefaultMixin<R, A>,
|
|
DartTypeVisitor1DefaultMixin<R, A>,
|
|
ConstantVisitor1DefaultMixin<R, A>,
|
|
MemberReferenceVisitor1DefaultMixin<R, A>,
|
|
ConstantReferenceVisitor1DefaultMixin<R, A> {
|
|
const Visitor1Default();
|
|
|
|
@override
|
|
R defaultTreeNode(TreeNode node, A arg) => defaultNode(node, arg);
|
|
|
|
@override
|
|
R defaultDartType(DartType node, A arg) => defaultNode(node, arg);
|
|
|
|
@override
|
|
R defaultConstant(Constant node, A arg) => defaultNode(node, arg);
|
|
}
|
|
|
|
/// Visitor mixin that throws as its base case.
|
|
mixin VisitorThrowingMixin<R> implements VisitorDefault<R> {
|
|
@override
|
|
R defaultNode(Node node) {
|
|
throw new UnimplementedError(
|
|
'Unimplemented ${runtimeType}.defaultNode for '
|
|
'${node} (${node.runtimeType})',
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitClassReference(Class node) {
|
|
throw new UnimplementedError(
|
|
'Unimplemented ${runtimeType}.visitClassReference for '
|
|
'${node} (${node.runtimeType})',
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitTypedefReference(Typedef node) {
|
|
throw new UnimplementedError(
|
|
'Unimplemented ${runtimeType}.visitTypedefReference for '
|
|
'${node} (${node.runtimeType})',
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitExtensionReference(Extension node) {
|
|
throw new UnimplementedError(
|
|
'Unimplemented ${runtimeType}.visitExtensionReference for '
|
|
'${node} (${node.runtimeType})',
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitExtensionTypeDeclarationReference(ExtensionTypeDeclaration node) {
|
|
throw new UnimplementedError(
|
|
'Unimplemented ${runtimeType}.visitExtensionTypeDeclarationReference '
|
|
'for ${node} (${node.runtimeType})',
|
|
);
|
|
}
|
|
|
|
@override
|
|
R defaultConstantReference(Constant node) {
|
|
throw new UnimplementedError(
|
|
'Unimplemented ${runtimeType}.defaultConstantReference for '
|
|
'${node} (${node.runtimeType})',
|
|
);
|
|
}
|
|
|
|
@override
|
|
R defaultMemberReference(Member node) {
|
|
throw new UnimplementedError(
|
|
'Unimplemented ${runtimeType}.defaultMemberReference for '
|
|
'${node} (${node.runtimeType})',
|
|
);
|
|
}
|
|
}
|
|
|
|
/// Visitor mixin that returns a value of type [R] or `null` and uses `null` as
|
|
/// its base case.
|
|
mixin VisitorNullMixin<R> implements VisitorDefault<R?> {
|
|
@override
|
|
R? defaultNode(Node node) => null;
|
|
|
|
@override
|
|
R? visitClassReference(Class node) => null;
|
|
|
|
@override
|
|
R? visitTypedefReference(Typedef node) => null;
|
|
|
|
@override
|
|
R? visitExtensionReference(Extension node) => null;
|
|
|
|
@override
|
|
R? visitExtensionTypeDeclarationReference(ExtensionTypeDeclaration node) =>
|
|
null;
|
|
|
|
@override
|
|
R? defaultConstantReference(Constant node) => null;
|
|
|
|
@override
|
|
R? defaultMemberReference(Member node) => null;
|
|
}
|
|
|
|
/// Visitor mixin that returns void.
|
|
mixin VisitorVoidMixin implements VisitorDefault<void> {
|
|
@override
|
|
void defaultNode(Node node) {}
|
|
|
|
@override
|
|
void visitClassReference(Class node) {}
|
|
|
|
@override
|
|
void visitTypedefReference(Typedef node) {}
|
|
|
|
@override
|
|
void visitExtensionReference(Extension node) {}
|
|
|
|
@override
|
|
void visitExtensionTypeDeclarationReference(ExtensionTypeDeclaration node) {}
|
|
|
|
@override
|
|
void defaultConstantReference(Constant node) {}
|
|
|
|
@override
|
|
void defaultMemberReference(Member node) {}
|
|
}
|
|
|
|
/// Visitor mixin that returns a [defaultValue] of type [R] as its base case.
|
|
mixin VisitorDefaultValueMixin<R> implements VisitorDefault<R> {
|
|
R get defaultValue;
|
|
|
|
@override
|
|
R defaultNode(Node node) => defaultValue;
|
|
|
|
@override
|
|
R visitClassReference(Class node) => defaultValue;
|
|
|
|
@override
|
|
R visitTypedefReference(Typedef node) => defaultValue;
|
|
|
|
@override
|
|
R visitExtensionReference(Extension node) => defaultValue;
|
|
|
|
@override
|
|
R visitExtensionTypeDeclarationReference(ExtensionTypeDeclaration node) =>
|
|
defaultValue;
|
|
|
|
@override
|
|
R defaultConstantReference(Constant node) => defaultValue;
|
|
|
|
@override
|
|
R defaultMemberReference(Member node) => defaultValue;
|
|
}
|
|
|
|
/// Recursive visitor that doesn't return anything from its visit methods.
|
|
class RecursiveVisitor extends VisitorDefault<void> with VisitorVoidMixin {
|
|
const RecursiveVisitor();
|
|
|
|
@override
|
|
void defaultNode(Node node) {
|
|
node.visitChildren(this);
|
|
}
|
|
}
|
|
|
|
/// Recursive visitor that returns a result of type [R] or `null` from its
|
|
/// visit methods.
|
|
class RecursiveResultVisitor<R> extends VisitorDefault<R?>
|
|
with VisitorNullMixin<R> {
|
|
const RecursiveResultVisitor();
|
|
|
|
@override
|
|
R? defaultNode(Node node) {
|
|
node.visitChildren(this);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Visitor that recursively rewrites each node in tree.
|
|
///
|
|
/// Visit methods should return a new node, or the visited node (possibly
|
|
/// mutated), or any node from the visited node's subtree.
|
|
///
|
|
/// Each subclass is responsible for ensuring that the AST remains a tree.
|
|
///
|
|
/// For example, the following transformer replaces every occurrence of
|
|
/// `!(x && y)` with `(!x || !y)`:
|
|
///
|
|
/// class NegationSinker extends Transformer {
|
|
/// @override
|
|
/// Node visitNot(Not node) {
|
|
/// var operand = node.operand.accept(this); // Remember to visit.
|
|
/// if (operand is LogicalExpression &&
|
|
/// operand.operator == LogicalExpressionOperator.AND) {
|
|
/// return new LogicalExpression(
|
|
/// new Not(operand.left),
|
|
/// LogicalExpressionOperator.OR,
|
|
/// new Not(operand.right));
|
|
/// }
|
|
/// return node;
|
|
/// }
|
|
/// }
|
|
///
|
|
class Transformer extends TreeVisitorDefault<TreeNode> {
|
|
const Transformer();
|
|
|
|
T transform<T extends TreeNode>(T node) {
|
|
return node.accept<TreeNode>(this) as T;
|
|
}
|
|
|
|
void transformDartTypeList(List<DartType> nodes) {
|
|
for (int i = 0; i < nodes.length; ++i) {
|
|
nodes[i] = visitDartType(nodes[i]);
|
|
}
|
|
}
|
|
|
|
void transformSupertypeList(List<Supertype> nodes) {
|
|
for (int i = 0; i < nodes.length; ++i) {
|
|
nodes[i] = visitSupertype(nodes[i]);
|
|
}
|
|
}
|
|
|
|
void transformList<T extends TreeNode>(List<T> nodes, TreeNode parent) {
|
|
for (int i = 0; i < nodes.length; ++i) {
|
|
T result = transform(nodes[i]);
|
|
result.parent = parent;
|
|
nodes[i] = result;
|
|
}
|
|
}
|
|
|
|
/// Replaces a use of a type.
|
|
///
|
|
/// By default, recursion stops at this point.
|
|
DartType visitDartType(DartType node) => node;
|
|
|
|
Constant visitConstant(Constant node) => node;
|
|
|
|
Supertype visitSupertype(Supertype node) => node;
|
|
|
|
@override
|
|
TreeNode defaultTreeNode(TreeNode node) {
|
|
node.transformChildren(this);
|
|
return node;
|
|
}
|
|
}
|
|
|
|
/// Transformer that recursively rewrites each node in tree and supports removal
|
|
/// of nodes.
|
|
///
|
|
/// Visit methods should return a new node, the visited node (possibly
|
|
/// mutated), any node from the visited node's subtree, or the provided
|
|
/// removal sentinel, if non-null.
|
|
///
|
|
/// To support removal of nodes during traversal, while enforcing nullability
|
|
/// invariants, this visitor takes an argument, the removal sentinel. If a
|
|
/// node is visited in a context where it can be removed, for instance in a
|
|
/// list or as an optional child of its parent, a non-null sentinel value is
|
|
/// provided, and this value can be returned to signal to the caller that the
|
|
/// visited node should be removed. If the sentinel value is `null`, the node
|
|
/// cannot be removed from its context, in which case the node itself or a new
|
|
/// non-null node must be returned, possibly a sentinel value specific to the
|
|
/// particular visitor.
|
|
///
|
|
/// For instance
|
|
///
|
|
/// class AssertRemover extends RemovingTransformer {
|
|
/// @override
|
|
/// TreeNode visitAssertStatement(
|
|
/// AssertStatement node,
|
|
/// TreeNode? removalSentinel) {
|
|
/// return removalSentinel ?? new EmptyStatement();
|
|
/// }
|
|
///
|
|
/// @override
|
|
/// TreeNode visitIfStatement(
|
|
/// IfStatement node,
|
|
/// TreeNode? removalSentinel) {
|
|
/// node.transformOrRemoveChildren(this);
|
|
/// if (node.then is EmptyStatement) {
|
|
/// if (node.otherwise != null) {
|
|
/// return new IfStatement(
|
|
/// new Not(node.condition), node.otherwise);
|
|
/// } else {
|
|
/// return removalSentinel ?? new EmptyStatement();
|
|
/// }
|
|
/// }
|
|
/// return node;
|
|
/// }
|
|
/// }
|
|
///
|
|
/// Each subclass is responsible for ensuring that the AST remains a tree.
|
|
///
|
|
/// For example, the following transformer replaces every occurrence of
|
|
/// `!(x && y)` with `(!x || !y)`:
|
|
///
|
|
/// class NegationSinker extends RemovingTransformer {
|
|
/// @override
|
|
/// Node visitNot(Not node) {
|
|
/// var operand = node.operand.accept(this); // Remember to visit.
|
|
/// if (operand is LogicalExpression &&
|
|
/// operand.operator == LogicalExpressionOperator.AND) {
|
|
/// return new LogicalExpression(
|
|
/// new Not(operand.left),
|
|
/// LogicalExpressionOperator.OR,
|
|
/// new Not(operand.right));
|
|
/// }
|
|
/// return node;
|
|
/// }
|
|
/// }
|
|
///
|
|
class RemovingTransformer extends TreeVisitor1Default<TreeNode, TreeNode?> {
|
|
const RemovingTransformer();
|
|
|
|
/// Visits [node], returning the transformation result.
|
|
///
|
|
/// The transformation cannot result in `null`.
|
|
T transform<T extends TreeNode>(T node) {
|
|
return node.accept1<TreeNode, TreeNode?>(this, cannotRemoveSentinel) as T;
|
|
}
|
|
|
|
/// Visits [node], returning the transformation result. Removal of [node] is
|
|
/// supported with `null` as the result.
|
|
///
|
|
/// This is convenience method for calling [transformOrRemove] with removal
|
|
/// sentinel for [Expression] nodes.
|
|
Expression? transformOrRemoveExpression(Expression node) {
|
|
return transformOrRemove(node, dummyExpression);
|
|
}
|
|
|
|
/// Visits [node], returning the transformation result. Removal of [node] is
|
|
/// supported with `null` as the result.
|
|
///
|
|
/// This is convenience method for calling [transformOrRemove] with removal
|
|
/// sentinel for [Statement] nodes.
|
|
Statement? transformOrRemoveStatement(Statement node) {
|
|
return transformOrRemove(node, dummyStatement);
|
|
}
|
|
|
|
/// Visits [node], returning the transformation result. Removal of [node] is
|
|
/// supported with `null` as the result.
|
|
///
|
|
/// This is convenience method for calling [transformOrRemove] with removal
|
|
/// sentinel for [VariableDeclaration] nodes.
|
|
VariableDeclaration? transformOrRemoveVariableDeclaration(
|
|
VariableDeclaration node,
|
|
) {
|
|
return transformOrRemove(node, dummyVariableDeclaration);
|
|
}
|
|
|
|
/// Visits [node], returning the transformation result. Removal of [node] is
|
|
/// supported with `null` as the result.
|
|
///
|
|
/// This is convenience method for calling [transformOrRemove] with removal
|
|
/// sentinel for [VariableDeclaration] nodes.
|
|
CatchVariable? transformOrRemoveCatchVariable(CatchVariable node) {
|
|
if (node is VariableDeclaration) {
|
|
return transformOrRemoveVariableDeclaration(node);
|
|
} else {
|
|
return transformOrRemove(node, dummyCatchVariable);
|
|
}
|
|
}
|
|
|
|
/// Visits [node] using [removalSentinel] as the removal sentinel.
|
|
///
|
|
/// If [removalSentinel] is the result of visiting [node], `null` is returned.
|
|
/// Otherwise the result is returned.
|
|
T? transformOrRemove<T extends TreeNode>(T node, T? removalSentinel) {
|
|
T result = node.accept1<TreeNode, TreeNode?>(this, removalSentinel) as T;
|
|
if (identical(result, removalSentinel)) {
|
|
return null;
|
|
} else {
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// Transforms or removes [DartType] nodes in [nodes].
|
|
void transformDartTypeList(List<DartType> nodes) {
|
|
int storeIndex = 0;
|
|
for (int i = 0; i < nodes.length; ++i) {
|
|
DartType result = visitDartType(nodes[i], dummyDartType);
|
|
if (!identical(result, dummyDartType)) {
|
|
nodes[storeIndex] = result;
|
|
++storeIndex;
|
|
}
|
|
}
|
|
if (storeIndex < nodes.length) {
|
|
nodes.length = storeIndex;
|
|
}
|
|
}
|
|
|
|
/// Transforms or removes [Supertype] nodes in [nodes].
|
|
void transformSupertypeList(List<Supertype> nodes) {
|
|
int storeIndex = 0;
|
|
for (int i = 0; i < nodes.length; ++i) {
|
|
Supertype result = visitSupertype(nodes[i], dummySupertype);
|
|
if (!identical(result, dummySupertype)) {
|
|
nodes[storeIndex] = result;
|
|
++storeIndex;
|
|
}
|
|
}
|
|
if (storeIndex < nodes.length) {
|
|
nodes.length = storeIndex;
|
|
}
|
|
}
|
|
|
|
/// Transforms or removes [Library] nodes in [nodes] as children of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Library] nodes.
|
|
void transformLibraryList(List<Library> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyLibrary);
|
|
}
|
|
|
|
/// Transforms or removes [LibraryDependency] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [LibraryDependency] nodes.
|
|
void transformLibraryDependencyList(
|
|
List<LibraryDependency> nodes,
|
|
TreeNode parent,
|
|
) {
|
|
transformList(nodes, parent, dummyLibraryDependency);
|
|
}
|
|
|
|
/// Transforms or removes [Combinator] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Combinator] nodes.
|
|
void transformCombinatorList(List<Combinator> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyCombinator);
|
|
}
|
|
|
|
/// Transforms or removes [LibraryPart] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [LibraryPart] nodes.
|
|
void transformLibraryPartList(List<LibraryPart> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyLibraryPart);
|
|
}
|
|
|
|
/// Transforms or removes [Class] nodes in [nodes] as children of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Class] nodes.
|
|
void transformClassList(List<Class> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyClass);
|
|
}
|
|
|
|
/// Transforms or removes [Extension] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Extension] nodes.
|
|
void transformExtensionList(List<Extension> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyExtension);
|
|
}
|
|
|
|
/// Transforms or removes [ExtensionTypeDeclaration] nodes in [nodes] as
|
|
/// children of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [ExtensionTypeDeclaration] nodes.
|
|
void transformExtensionTypeDeclarationList(
|
|
List<ExtensionTypeDeclaration> nodes,
|
|
TreeNode parent,
|
|
) {
|
|
transformList(nodes, parent, dummyExtensionTypeDeclaration);
|
|
}
|
|
|
|
/// Transforms or removes [Constructor] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Constructor] nodes.
|
|
void transformConstructorList(List<Constructor> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyConstructor);
|
|
}
|
|
|
|
/// Transforms or removes [Procedure] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Procedure] nodes.
|
|
void transformProcedureList(List<Procedure> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyProcedure);
|
|
}
|
|
|
|
/// Transforms or removes [Field] nodes in [nodes] as children of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Field] nodes.
|
|
void transformFieldList(List<Field> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyField);
|
|
}
|
|
|
|
/// Transforms or removes [Typedef] nodes in [nodes] as children of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Typedef] nodes.
|
|
void transformTypedefList(List<Typedef> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyTypedef);
|
|
}
|
|
|
|
/// Transforms or removes [Initializer] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Initializer] nodes.
|
|
void transformInitializerList(List<Initializer> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyInitializer);
|
|
}
|
|
|
|
/// Transforms or removes [Expression] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Expression] nodes.
|
|
void transformExpressionList(List<Expression> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyExpression);
|
|
}
|
|
|
|
/// Transforms or removes [NamedExpression] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [NamedExpression] nodes.
|
|
void transformNamedExpressionList(
|
|
List<NamedExpression> nodes,
|
|
TreeNode parent,
|
|
) {
|
|
transformList(nodes, parent, dummyNamedExpression);
|
|
}
|
|
|
|
/// Transforms or removes [MapLiteralEntry] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [MapLiteralEntry] nodes.
|
|
void transformMapEntryList(List<MapLiteralEntry> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyMapLiteralEntry);
|
|
}
|
|
|
|
/// Transforms or removes [Statement] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Statement] nodes.
|
|
void transformStatementList(List<Statement> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyStatement);
|
|
}
|
|
|
|
/// Transforms or removes [SwitchCase] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [SwitchCase] nodes.
|
|
void transformSwitchCaseList(List<SwitchCase> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummySwitchCase);
|
|
}
|
|
|
|
/// Transforms or removes [Catch] nodes in [nodes] as children of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [Catch] nodes.
|
|
void transformCatchList(List<Catch> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyCatch);
|
|
}
|
|
|
|
/// Transforms or removes [TypeParameter] nodes in [nodes] as children of
|
|
/// [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [TypeParameter] nodes.
|
|
void transformTypeParameterList(List<TypeParameter> nodes, TreeNode parent) {
|
|
transformList(nodes, parent, dummyTypeParameter);
|
|
}
|
|
|
|
/// Transforms or removes [VariableDeclaration] nodes in [nodes] as children
|
|
/// of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [VariableDeclaration] nodes.
|
|
void transformVariableDeclarationList(
|
|
List<VariableDeclaration> nodes,
|
|
TreeNode parent,
|
|
) {
|
|
transformList(nodes, parent, dummyVariableDeclaration);
|
|
}
|
|
|
|
/// Transforms or removes [VariableInitialization] nodes in [nodes] as
|
|
/// children of [parent].
|
|
///
|
|
/// This is convenience method for calling [transformList] with removal
|
|
/// sentinel for [VariableInitialization] nodes.
|
|
void transformVariableInitializationList(
|
|
List<VariableInitialization> nodes,
|
|
TreeNode parent,
|
|
) {
|
|
transformList(nodes, parent, dummyVariableDeclaration);
|
|
}
|
|
|
|
/// Transforms or removes [T] nodes in [nodes] as children of [parent] by
|
|
/// calling [transformOrRemove] using [removalSentinel] as the removal
|
|
/// sentinel.
|
|
void transformList<T extends TreeNode>(
|
|
List<T> nodes,
|
|
TreeNode parent,
|
|
T removalSentinel,
|
|
) {
|
|
int storeIndex = 0;
|
|
for (int i = 0; i < nodes.length; ++i) {
|
|
T? result = transformOrRemove(nodes[i], removalSentinel);
|
|
if (result != null) {
|
|
nodes[storeIndex] = result;
|
|
result.parent = parent;
|
|
++storeIndex;
|
|
}
|
|
}
|
|
if (storeIndex < nodes.length) {
|
|
nodes.length = storeIndex;
|
|
}
|
|
}
|
|
|
|
/// Replaces a use of a type.
|
|
///
|
|
/// By default, recursion stops at this point.
|
|
DartType visitDartType(DartType node, DartType? removalSentinel) => node;
|
|
|
|
Constant visitConstant(Constant node, Constant? removalSentinel) => node;
|
|
|
|
Supertype visitSupertype(Supertype node, Supertype? removalSentinel) => node;
|
|
|
|
@override
|
|
TreeNode defaultTreeNode(TreeNode node, TreeNode? removalSentinel) {
|
|
node.transformOrRemoveChildren(this);
|
|
return node;
|
|
}
|
|
}
|
|
|
|
abstract class ExpressionVisitor1<R, A> {
|
|
const ExpressionVisitor1();
|
|
|
|
R visitAuxiliaryExpression(AuxiliaryExpression node, A arg);
|
|
R visitInvalidExpression(InvalidExpression node, A arg);
|
|
R visitVariableGet(VariableGet node, A arg);
|
|
R visitVariableSet(VariableSet node, A arg);
|
|
R visitDynamicGet(DynamicGet node, A arg);
|
|
R visitDynamicSet(DynamicSet node, A arg);
|
|
R visitFunctionTearOff(FunctionTearOff node, A arg);
|
|
R visitInstanceGet(InstanceGet node, A arg);
|
|
R visitInstanceSet(InstanceSet node, A arg);
|
|
R visitInstanceTearOff(InstanceTearOff node, A arg);
|
|
R visitAbstractSuperPropertyGet(AbstractSuperPropertyGet node, A arg);
|
|
R visitAbstractSuperPropertySet(AbstractSuperPropertySet node, A arg);
|
|
R visitSuperPropertyGet(SuperPropertyGet node, A arg);
|
|
R visitSuperPropertySet(SuperPropertySet node, A arg);
|
|
R visitStaticGet(StaticGet node, A arg);
|
|
R visitStaticSet(StaticSet node, A arg);
|
|
R visitStaticTearOff(StaticTearOff node, A arg);
|
|
R visitLocalFunctionInvocation(LocalFunctionInvocation node, A arg);
|
|
R visitDynamicInvocation(DynamicInvocation node, A arg);
|
|
R visitFunctionInvocation(FunctionInvocation node, A arg);
|
|
R visitInstanceInvocation(InstanceInvocation node, A arg);
|
|
R visitInstanceGetterInvocation(InstanceGetterInvocation node, A arg);
|
|
R visitEqualsNull(EqualsNull node, A arg);
|
|
R visitEqualsCall(EqualsCall node, A arg);
|
|
R visitAbstractSuperMethodInvocation(
|
|
AbstractSuperMethodInvocation node,
|
|
A arg,
|
|
);
|
|
R visitSuperMethodInvocation(SuperMethodInvocation node, A arg);
|
|
R visitStaticInvocation(StaticInvocation node, A arg);
|
|
R visitConstructorInvocation(ConstructorInvocation node, A arg);
|
|
R visitRedirectingFactoryInvocation(RedirectingFactoryInvocation node, A arg);
|
|
R visitNot(Not node, A arg);
|
|
R visitNullCheck(NullCheck node, A arg);
|
|
R visitLogicalExpression(LogicalExpression node, A arg);
|
|
R visitConditionalExpression(ConditionalExpression node, A arg);
|
|
R visitStringConcatenation(StringConcatenation node, A arg);
|
|
R visitListConcatenation(ListConcatenation node, A arg);
|
|
R visitSetConcatenation(SetConcatenation node, A arg);
|
|
R visitMapConcatenation(MapConcatenation node, A arg);
|
|
R visitInstanceCreation(InstanceCreation node, A arg);
|
|
R visitFileUriExpression(FileUriExpression node, A arg);
|
|
R visitIsExpression(IsExpression node, A arg);
|
|
R visitAsExpression(AsExpression node, A arg);
|
|
R visitSymbolLiteral(SymbolLiteral node, A arg);
|
|
R visitTypeLiteral(TypeLiteral node, A arg);
|
|
R visitThisExpression(ThisExpression node, A arg);
|
|
R visitConstantExpression(ConstantExpression node, A arg);
|
|
R visitRethrow(Rethrow node, A arg);
|
|
R visitThrow(Throw node, A arg);
|
|
R visitListLiteral(ListLiteral node, A arg);
|
|
R visitSetLiteral(SetLiteral node, A arg);
|
|
R visitMapLiteral(MapLiteral node, A arg);
|
|
R visitAwaitExpression(AwaitExpression node, A arg);
|
|
R visitFunctionExpression(FunctionExpression node, A arg);
|
|
R visitIntLiteral(IntLiteral node, A arg);
|
|
R visitStringLiteral(StringLiteral node, A arg);
|
|
R visitDoubleLiteral(DoubleLiteral node, A arg);
|
|
R visitBoolLiteral(BoolLiteral node, A arg);
|
|
R visitNullLiteral(NullLiteral node, A arg);
|
|
R visitLet(Let node, A arg);
|
|
R visitBlockExpression(BlockExpression node, A arg);
|
|
R visitInstantiation(Instantiation node, A arg);
|
|
R visitLoadLibrary(LoadLibrary node, A arg);
|
|
R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, A arg);
|
|
R visitConstructorTearOff(ConstructorTearOff node, A arg);
|
|
R visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node, A arg);
|
|
R visitTypedefTearOff(TypedefTearOff node, A arg);
|
|
R visitRecordIndexGet(RecordIndexGet node, A arg);
|
|
R visitRecordNameGet(RecordNameGet node, A arg);
|
|
R visitRecordLiteral(RecordLiteral node, A arg);
|
|
R visitSwitchExpression(SwitchExpression node, A arg);
|
|
R visitPatternAssignment(PatternAssignment node, A arg);
|
|
R visitVariableRead(VariableRead node, A arg);
|
|
R visitVariableWrite(VariableWrite node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [ExpressionVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultBasicLiteral] and [defaultExpression] methods.
|
|
mixin ExpressionVisitor1DefaultMixin<R, A> implements ExpressionVisitor1<R, A> {
|
|
R defaultExpression(Expression node, A arg);
|
|
R defaultBasicLiteral(BasicLiteral node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
|
|
@override
|
|
R visitAuxiliaryExpression(AuxiliaryExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitInvalidExpression(InvalidExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitVariableGet(VariableGet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitVariableSet(VariableSet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitDynamicGet(DynamicGet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitDynamicSet(DynamicSet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitFunctionTearOff(FunctionTearOff node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitInstanceGet(InstanceGet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitInstanceSet(InstanceSet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitInstanceTearOff(InstanceTearOff node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitAbstractSuperPropertyGet(AbstractSuperPropertyGet node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitAbstractSuperPropertySet(AbstractSuperPropertySet node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitSuperPropertyGet(SuperPropertyGet node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitSuperPropertySet(SuperPropertySet node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitStaticGet(StaticGet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitStaticSet(StaticSet node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitStaticTearOff(StaticTearOff node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitLocalFunctionInvocation(LocalFunctionInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitDynamicInvocation(DynamicInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitFunctionInvocation(FunctionInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitInstanceInvocation(InstanceInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitInstanceGetterInvocation(InstanceGetterInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitEqualsNull(EqualsNull node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitEqualsCall(EqualsCall node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitAbstractSuperMethodInvocation(
|
|
AbstractSuperMethodInvocation node,
|
|
A arg,
|
|
) => defaultExpression(node, arg);
|
|
@override
|
|
R visitSuperMethodInvocation(SuperMethodInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitStaticInvocation(StaticInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitConstructorInvocation(ConstructorInvocation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitRedirectingFactoryInvocation(
|
|
RedirectingFactoryInvocation node,
|
|
A arg,
|
|
) => defaultExpression(node, arg);
|
|
@override
|
|
R visitNot(Not node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitNullCheck(NullCheck node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitLogicalExpression(LogicalExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitConditionalExpression(ConditionalExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitStringConcatenation(StringConcatenation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitListConcatenation(ListConcatenation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitSetConcatenation(SetConcatenation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitMapConcatenation(MapConcatenation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitInstanceCreation(InstanceCreation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitFileUriExpression(FileUriExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitIsExpression(IsExpression node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitAsExpression(AsExpression node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitSymbolLiteral(SymbolLiteral node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitTypeLiteral(TypeLiteral node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitThisExpression(ThisExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitConstantExpression(ConstantExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitRethrow(Rethrow node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitThrow(Throw node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
@override
|
|
R visitListLiteral(ListLiteral node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitSetLiteral(SetLiteral node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitMapLiteral(MapLiteral node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitAwaitExpression(AwaitExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitFunctionExpression(FunctionExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitIntLiteral(IntLiteral node, A arg) => defaultBasicLiteral(node, arg);
|
|
@override
|
|
R visitStringLiteral(StringLiteral node, A arg) =>
|
|
defaultBasicLiteral(node, arg);
|
|
@override
|
|
R visitDoubleLiteral(DoubleLiteral node, A arg) =>
|
|
defaultBasicLiteral(node, arg);
|
|
@override
|
|
R visitBoolLiteral(BoolLiteral node, A arg) => defaultBasicLiteral(node, arg);
|
|
@override
|
|
R visitNullLiteral(NullLiteral node, A arg) => defaultBasicLiteral(node, arg);
|
|
@override
|
|
R visitLet(Let node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitBlockExpression(BlockExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitInstantiation(Instantiation node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitLoadLibrary(LoadLibrary node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitConstructorTearOff(ConstructorTearOff node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitTypedefTearOff(TypedefTearOff node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitRecordIndexGet(RecordIndexGet node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitRecordNameGet(RecordNameGet node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitRecordLiteral(RecordLiteral node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitSwitchExpression(SwitchExpression node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitPatternAssignment(PatternAssignment node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
@override
|
|
R visitVariableRead(VariableRead node, A arg) => defaultExpression(node, arg);
|
|
@override
|
|
R visitVariableWrite(VariableWrite node, A arg) =>
|
|
defaultExpression(node, arg);
|
|
}
|
|
|
|
abstract class PatternVisitor1<R, A> {
|
|
R visitAndPattern(AndPattern node, A arg);
|
|
R visitAssignedVariablePattern(AssignedVariablePattern node, A arg);
|
|
R visitCastPattern(CastPattern node, A arg);
|
|
R visitConstantPattern(ConstantPattern node, A arg);
|
|
R visitInvalidPattern(InvalidPattern node, A arg);
|
|
R visitListPattern(ListPattern node, A arg);
|
|
R visitMapPattern(MapPattern node, A arg);
|
|
R visitNamedPattern(NamedPattern node, A arg);
|
|
R visitNullAssertPattern(NullAssertPattern node, A arg);
|
|
R visitNullCheckPattern(NullCheckPattern node, A arg);
|
|
R visitObjectPattern(ObjectPattern node, A arg);
|
|
R visitOrPattern(OrPattern node, A arg);
|
|
R visitRecordPattern(RecordPattern node, A arg);
|
|
R visitRelationalPattern(RelationalPattern node, A arg);
|
|
R visitRestPattern(RestPattern node, A arg);
|
|
R visitVariablePattern(VariablePattern node, A arg);
|
|
R visitWildcardPattern(WildcardPattern node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [PatternVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultPattern] method.
|
|
mixin PatternVisitor1DefaultMixin<R, A> implements PatternVisitor1<R, A> {
|
|
R defaultPattern(Pattern node, A arg);
|
|
@override
|
|
R visitAndPattern(AndPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitAssignedVariablePattern(AssignedVariablePattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
@override
|
|
R visitCastPattern(CastPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitConstantPattern(ConstantPattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
@override
|
|
R visitInvalidPattern(InvalidPattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
@override
|
|
R visitListPattern(ListPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitMapPattern(MapPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitNamedPattern(NamedPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitNullAssertPattern(NullAssertPattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
@override
|
|
R visitNullCheckPattern(NullCheckPattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
@override
|
|
R visitObjectPattern(ObjectPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitOrPattern(OrPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitRecordPattern(RecordPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitRelationalPattern(RelationalPattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
@override
|
|
R visitRestPattern(RestPattern node, A arg) => defaultPattern(node, arg);
|
|
@override
|
|
R visitVariablePattern(VariablePattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
@override
|
|
R visitWildcardPattern(WildcardPattern node, A arg) =>
|
|
defaultPattern(node, arg);
|
|
}
|
|
|
|
abstract class StatementVisitor1<R, A> {
|
|
const StatementVisitor1();
|
|
|
|
R visitAuxiliaryStatement(AuxiliaryStatement node, A arg);
|
|
R visitExpressionStatement(ExpressionStatement node, A arg);
|
|
R visitBlock(Block node, A arg);
|
|
R visitAssertBlock(AssertBlock node, A arg);
|
|
R visitEmptyStatement(EmptyStatement node, A arg);
|
|
R visitAssertStatement(AssertStatement node, A arg);
|
|
R visitLabeledStatement(LabeledStatement node, A arg);
|
|
R visitVariableInitialization(VariableInitialization node, A arg);
|
|
R visitBreakStatement(BreakStatement node, A arg);
|
|
R visitWhileStatement(WhileStatement node, A arg);
|
|
R visitDoStatement(DoStatement node, A arg);
|
|
R visitForStatement(ForStatement node, A arg);
|
|
R visitForInStatement(ForInStatement node, A arg);
|
|
R visitSwitchStatement(SwitchStatement node, A arg);
|
|
R visitPatternSwitchStatement(PatternSwitchStatement node, A arg);
|
|
R visitContinueSwitchStatement(ContinueSwitchStatement node, A arg);
|
|
R visitIfStatement(IfStatement node, A arg);
|
|
R visitIfCaseStatement(IfCaseStatement node, A arg);
|
|
R visitReturnStatement(ReturnStatement node, A arg);
|
|
R visitTryCatch(TryCatch node, A arg);
|
|
R visitTryFinally(TryFinally node, A arg);
|
|
R visitYieldStatement(YieldStatement node, A arg);
|
|
R visitPatternVariableDeclaration(PatternVariableDeclaration node, A arg);
|
|
R visitFunctionDeclaration(FunctionDeclaration node, A arg);
|
|
R visitVariableStatement(VariableStatement node, A arg);
|
|
R visitPositionalParameter(PositionalParameter node, A arg);
|
|
R visitNamedParameter(NamedParameter node, A arg);
|
|
}
|
|
|
|
/// Helper mixin for [StatementVisitor1] that implements visit methods by
|
|
/// delegating to the [defaultStatement] method.
|
|
mixin StatementVisitor1DefaultMixin<R, A> implements StatementVisitor1<R, A> {
|
|
R defaultStatement(Statement node, A arg);
|
|
|
|
@override
|
|
R visitAuxiliaryStatement(AuxiliaryStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitExpressionStatement(ExpressionStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitBlock(Block node, A arg) => defaultStatement(node, arg);
|
|
@override
|
|
R visitAssertBlock(AssertBlock node, A arg) => defaultStatement(node, arg);
|
|
@override
|
|
R visitEmptyStatement(EmptyStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitAssertStatement(AssertStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitLabeledStatement(LabeledStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitVariableInitialization(VariableInitialization node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitBreakStatement(BreakStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitWhileStatement(WhileStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitDoStatement(DoStatement node, A arg) => defaultStatement(node, arg);
|
|
@override
|
|
R visitForStatement(ForStatement node, A arg) => defaultStatement(node, arg);
|
|
@override
|
|
R visitForInStatement(ForInStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitSwitchStatement(SwitchStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitPatternSwitchStatement(PatternSwitchStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitContinueSwitchStatement(ContinueSwitchStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitIfStatement(IfStatement node, A arg) => defaultStatement(node, arg);
|
|
@override
|
|
R visitIfCaseStatement(IfCaseStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitReturnStatement(ReturnStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitTryCatch(TryCatch node, A arg) => defaultStatement(node, arg);
|
|
@override
|
|
R visitTryFinally(TryFinally node, A arg) => defaultStatement(node, arg);
|
|
@override
|
|
R visitYieldStatement(YieldStatement node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
R visitVariableDeclaration(VariableDeclaration node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitPatternVariableDeclaration(PatternVariableDeclaration node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitFunctionDeclaration(FunctionDeclaration node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitVariableStatement(VariableStatement node, A arg) =>
|
|
visitVariableDeclaration(node, arg);
|
|
@override
|
|
R visitPositionalParameter(PositionalParameter node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
@override
|
|
R visitNamedParameter(NamedParameter node, A arg) =>
|
|
defaultStatement(node, arg);
|
|
}
|
|
|
|
/// [DartTypeVisitorExperimentExclusionMixin] is intended to reduce the effects
|
|
/// of CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin DartTypeVisitorExperimentExclusionMixin<R> implements DartTypeVisitor<R> {
|
|
@override
|
|
R visitFunctionTypeParameterType(FunctionTypeParameterType node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitFunctionTypeParameterType isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitClassTypeParameterType(ClassTypeParameterType node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitClassTypeParameterType isn't supported.",
|
|
);
|
|
}
|
|
}
|
|
|
|
/// [DartTypeVisitor1ExperimentExclusionMixin] is intended to reduce the effects
|
|
/// of CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin DartTypeVisitor1ExperimentExclusionMixin<R, A>
|
|
implements DartTypeVisitor1<R, A> {
|
|
@override
|
|
R visitFunctionTypeParameterType(FunctionTypeParameterType node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitFunctionTypeParameterType isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitClassTypeParameterType(ClassTypeParameterType node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitClassTypeParameterType isn't supported.",
|
|
);
|
|
}
|
|
}
|
|
|
|
/// [ExpressionVisitorInternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin ExpressionVisitorInternalNodeMixin<R> implements ExpressionVisitor<R> {
|
|
@override
|
|
R visitListConcatenation(ListConcatenation node) {
|
|
throw StateError("${runtimeType}.visitListConcatenation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitSetConcatenation(SetConcatenation node) {
|
|
throw StateError("${runtimeType}.visitSetConcatenation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitMapConcatenation(MapConcatenation node) {
|
|
throw StateError("${runtimeType}.visitMapConcatenation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitInstanceCreation(InstanceCreation node) {
|
|
throw StateError("${runtimeType}.visitInstanceCreation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitPatternAssignment(PatternAssignment node) {
|
|
throw StateError("${runtimeType}.visitPatternAssignment isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitSwitchExpression(SwitchExpression node) {
|
|
throw StateError("${runtimeType}.visitSwitchExpression isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitFileUriExpression(FileUriExpression node) {
|
|
throw StateError("${runtimeType}.visitFileUriExpression isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRedirectingFactoryInvocation(RedirectingFactoryInvocation node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitRedirectingFactoryInvocation isn't supported.",
|
|
);
|
|
}
|
|
}
|
|
|
|
/// [ExpressionVisitor1InternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin ExpressionVisitor1InternalNodeMixin<R, A>
|
|
implements ExpressionVisitor1<R, A> {
|
|
@override
|
|
R visitListConcatenation(ListConcatenation node, A arg) {
|
|
throw StateError("${runtimeType}.visitListConcatenation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitSetConcatenation(SetConcatenation node, A arg) {
|
|
throw StateError("${runtimeType}.visitSetConcatenation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitMapConcatenation(MapConcatenation node, A arg) {
|
|
throw StateError("${runtimeType}.visitMapConcatenation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitInstanceCreation(InstanceCreation node, A arg) {
|
|
throw StateError("${runtimeType}.visitInstanceCreation isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitPatternAssignment(PatternAssignment node, A arg) {
|
|
throw StateError("${runtimeType}.visitPatternAssignment isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitSwitchExpression(SwitchExpression node, A arg) {
|
|
throw StateError("${runtimeType}.visitSwitchExpression isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitFileUriExpression(FileUriExpression node, A arg) {
|
|
throw StateError("${runtimeType}.visitFileUriExpression isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitRedirectingFactoryInvocation(
|
|
RedirectingFactoryInvocation node,
|
|
A arg,
|
|
) {
|
|
throw StateError(
|
|
"${runtimeType}.visitRedirectingFactoryInvocation isn't supported.",
|
|
);
|
|
}
|
|
}
|
|
|
|
/// [ExpressionVisitorExperimentExclusionMixin] is intended to reduce the
|
|
/// effects of CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin ExpressionVisitorExperimentExclusionMixin<R>
|
|
implements ExpressionVisitor<R> {
|
|
@override
|
|
R visitVariableRead(VariableRead node) {
|
|
throw StateError("${runtimeType}.visitVariableRead isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitVariableWrite(VariableWrite node) {
|
|
throw StateError("${runtimeType}.visitVariableWrite isn't supported.");
|
|
}
|
|
}
|
|
|
|
/// [ExpressionVisitor1ExperimentExclusionMixin] is intended to reduce the
|
|
/// effects of CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin ExpressionVisitor1ExperimentExclusionMixin<R, A>
|
|
implements ExpressionVisitor1<R, A> {
|
|
@override
|
|
R visitVariableRead(VariableRead node, A arg) {
|
|
throw StateError("${runtimeType}.visitVariableRead isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitVariableWrite(VariableWrite node, A arg) {
|
|
throw StateError("${runtimeType}.visitVariableWrite isn't supported.");
|
|
}
|
|
}
|
|
|
|
/// [StatementVisitorInternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin StatementVisitorInternalNodeMixin<R> implements StatementVisitor<R> {
|
|
@override
|
|
R visitPatternVariableDeclaration(PatternVariableDeclaration node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitPatternVariableDeclaration isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitIfCaseStatement(IfCaseStatement node) {
|
|
throw StateError("${runtimeType}.visitIfCaseStatement isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitPatternSwitchStatement(PatternSwitchStatement node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitPatternSwitchStatement isn't supported.",
|
|
);
|
|
}
|
|
}
|
|
|
|
/// [StatementVisitor1InternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin StatementVisitor1InternalNodeMixin<R, A>
|
|
implements StatementVisitor1<R, A> {
|
|
@override
|
|
R visitPatternVariableDeclaration(PatternVariableDeclaration node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitPatternVariableDeclaration isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitIfCaseStatement(IfCaseStatement node, A arg) {
|
|
throw StateError("${runtimeType}.visitIfCaseStatement isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitPatternSwitchStatement(PatternSwitchStatement node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitPatternSwitchStatement isn't supported.",
|
|
);
|
|
}
|
|
}
|
|
|
|
/// [StatementVisitorExperimentExclusionMixin] is intended to reduce the effects
|
|
/// of CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin StatementVisitorExperimentExclusionMixin<R>
|
|
implements StatementVisitor<R> {
|
|
@override
|
|
R visitVariableInitialization(VariableInitialization node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitVariableInitialization isn't supported.",
|
|
);
|
|
}
|
|
|
|
/// Since [VariableDeclaration] is abstract due to an experiment, it doesn't
|
|
/// have its own visit method in [StatementVisitor]. However, for the
|
|
/// transitional period the backends would rely on having
|
|
/// [visitVariableDeclaration] and on needing to override it. Since the
|
|
/// statement visitors in the backends should mix in
|
|
/// [StatementVisitorExperimentExclusionMixin], we can deliver the abstract
|
|
/// declaration of [visitVariableDeclaration] to them via the mixin. At the
|
|
/// same time, it allows us to redirect [visitVariableStatement] to the
|
|
/// overrides of [visitVariableDeclarations] the backends already have.
|
|
R visitVariableDeclaration(VariableDeclaration node);
|
|
|
|
@override
|
|
R visitVariableStatement(VariableStatement node) {
|
|
return visitVariableDeclaration(node);
|
|
}
|
|
|
|
@override
|
|
R visitPositionalParameter(PositionalParameter node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitPositionalParameter isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitNamedParameter(NamedParameter node) {
|
|
throw StateError("${runtimeType}.visitNamedParameter isn't supported.");
|
|
}
|
|
}
|
|
|
|
/// [StatementVisitor1ExperimentExclusionMixin] is intended to reduce the
|
|
/// effects of CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin StatementVisitor1ExperimentExclusionMixin<R, A>
|
|
implements StatementVisitor1<R, A> {
|
|
@override
|
|
R visitVariableInitialization(VariableInitialization node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitVariableInitialization isn't supported.",
|
|
);
|
|
}
|
|
|
|
/// Since [VariableDeclaration] is abstract due to an experiment, it doesn't
|
|
/// have its own visit method in [StatementVisitor1]. However, for the
|
|
/// transitional period the backends would rely on having
|
|
/// [visitVariableDeclaration] and on needing to override it. Since the
|
|
/// statement visitors in the backends should mix in
|
|
/// [StatementVisitor1ExperimentExclusionMixin], we can deliver the abstract
|
|
/// declaration of [visitVariableDeclaration] to them via the mixin. At the
|
|
/// same time, it allows us to redirect [visitVariableStatement] to the
|
|
/// overrides of [visitVariableDeclarations] the backends already have.
|
|
R visitVariableDeclaration(VariableDeclaration node, A arg);
|
|
|
|
@override
|
|
R visitVariableStatement(VariableStatement node, A arg) {
|
|
return visitVariableDeclaration(node, arg);
|
|
}
|
|
|
|
@override
|
|
R visitPositionalParameter(PositionalParameter node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitPositionalParameter isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitNamedParameter(NamedParameter node, A arg) {
|
|
throw StateError("${runtimeType}.visitNamedParameter isn't supported.");
|
|
}
|
|
}
|
|
|
|
/// [TreeVisitorInternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin TreeVisitorInternalNodeMixin<R> implements TreeVisitor<R> {
|
|
@override
|
|
R visitSwitchExpressionCase(SwitchExpressionCase node) {
|
|
throw StateError(
|
|
"${runtimeType}.visitSwitchExpressionCase isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitPatternGuard(PatternGuard node) {
|
|
throw StateError("${runtimeType}.visitPatternGuard isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitPatternSwitchCase(PatternSwitchCase node) {
|
|
throw StateError("${runtimeType}.visitPatternSwitchCase isn't supported.");
|
|
}
|
|
}
|
|
|
|
/// [TreeVisitor1InternalNodeMixin] is intended to reduce the effects of
|
|
/// CFE internal nodes on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the internal
|
|
/// nodes that are not expected to be part of AST delivered to backends. The
|
|
/// methods throw an exception signaling that the internal nodes aren't
|
|
/// supported.
|
|
mixin TreeVisitor1InternalNodeMixin<R, A> implements TreeVisitor1<R, A> {
|
|
@override
|
|
R visitSwitchExpressionCase(SwitchExpressionCase node, A arg) {
|
|
throw StateError(
|
|
"${runtimeType}.visitSwitchExpressionCase isn't supported.",
|
|
);
|
|
}
|
|
|
|
@override
|
|
R visitPatternGuard(PatternGuard node, A arg) {
|
|
throw StateError("${runtimeType}.visitPatternGuard isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitPatternSwitchCase(PatternSwitchCase node, A arg) {
|
|
throw StateError("${runtimeType}.visitPatternSwitchCase isn't supported.");
|
|
}
|
|
}
|
|
|
|
/// [TreeVisitorExperimentExclusionMixin] is intended to reduce the effects of
|
|
/// CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin TreeVisitorExperimentExclusionMixin<R> implements TreeVisitor<R> {
|
|
@override
|
|
R visitTypeVariable(TypeVariable node) {
|
|
throw StateError("${runtimeType}.visitTypeVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitLocalVariable(LocalVariable node) {
|
|
throw StateError("${runtimeType}.visitLocalVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitCatchVariable(CatchVariable node) {
|
|
throw StateError("${runtimeType}.visitCatchVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitThisVariable(ThisVariable node) {
|
|
throw StateError("${runtimeType}.visitThisVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitSyntheticVariable(SyntheticVariable node) {
|
|
throw StateError("${runtimeType}.visitSyntheticVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitVariableContext(VariableContext node) {
|
|
throw StateError("${runtimeType}.visitVariableContext isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitScope(Scope node) {
|
|
throw StateError("${runtimeType}.visitScope isn't supported.");
|
|
}
|
|
|
|
/// Since [TypeParameter] is abstract due to an experiment, it doesn't have
|
|
/// its own visit method in [TreeVisitor]. However, for the transitional
|
|
/// period the backends would rely on having [visitTypeParameter] and on
|
|
/// needing to override it. Since the statement visitors in the backends
|
|
/// should mix in [TreeVisitorExperimentExclusionMixin], we can deliver the
|
|
/// abstract declaration of [visitTypeParameter] to them via the mixin. At the
|
|
/// same time, it allows us to redirect [visitNominalParameter] to the
|
|
/// overrides of [visitTypeParameter] the backends already have.
|
|
R visitTypeParameter(TypeParameter node);
|
|
|
|
@override
|
|
R visitNominalParameter(NominalParameter node) {
|
|
return visitTypeParameter(node);
|
|
}
|
|
}
|
|
|
|
/// [TreeVisitor1ExperimentExclusionMixin] is intended to reduce the effects of
|
|
/// CFE experiments on the backends.
|
|
///
|
|
/// The mixin provides implementations of the visit methods for the experimental
|
|
/// nodes. The methods throw an exception signaling that the experimental nodes
|
|
/// aren't supported.
|
|
mixin TreeVisitor1ExperimentExclusionMixin<R, A> implements TreeVisitor1<R, A> {
|
|
@override
|
|
R visitTypeVariable(TypeVariable node, A arg) {
|
|
throw StateError("${runtimeType}.visitTypeVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitLocalVariable(LocalVariable node, A arg) {
|
|
throw StateError("${runtimeType}.visitLocalVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitCatchVariable(CatchVariable node, A arg) {
|
|
throw StateError("${runtimeType}.visitCatchVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitThisVariable(ThisVariable node, A arg) {
|
|
throw StateError("${runtimeType}.visitThisVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitSyntheticVariable(SyntheticVariable node, A arg) {
|
|
throw StateError("${runtimeType}.visitSyntheticVariable isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitVariableContext(VariableContext node, A arg) {
|
|
throw StateError("${runtimeType}.visitVariableContext isn't supported.");
|
|
}
|
|
|
|
@override
|
|
R visitScope(Scope node, A arg) {
|
|
throw StateError("${runtimeType}.visitScope isn't supported.");
|
|
}
|
|
|
|
/// Since [TypeParameter] is abstract due to an experiment, it doesn't have
|
|
/// its own visit method in [TreeVisitor1]. However, for the transitional
|
|
/// period the backends would rely on having [visitTypeParameter] and on
|
|
/// needing to override it. Since the statement visitors in the backends
|
|
/// should mix in [TreeVisitor1ExperimentExclusionMixin], we can deliver the
|
|
/// abstract declaration of [visitTypeParameter] to them via the mixin. At the
|
|
/// same time, it allows us to redirect [visitNominalParameter] to the
|
|
/// overrides of [visitTypeParameter] the backends already have.
|
|
R visitTypeParameter(TypeParameter node, A arg);
|
|
|
|
@override
|
|
R visitNominalParameter(NominalParameter node, A arg) {
|
|
return visitTypeParameter(node, arg);
|
|
}
|
|
}
|