Copy list in transformChildren

This commit is contained in:
Simon Binder 2021-05-05 19:46:13 +02:00
parent 1de5479d60
commit b6a2fcd603
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
22 changed files with 65 additions and 63 deletions

View File

@ -36,7 +36,7 @@ class ExplicitAliasTransformer extends Transformer<bool> {
// select statements.
e.withClause = transformNullableChild(e.withClause, e, arg);
e.base = transformChild(e.base, e, arg);
transformChildren(e.additional, e, false);
e.additional = transformChildren(e.additional, e, false);
return e;
}

View File

@ -10,7 +10,7 @@ abstract class OrderByBase extends AstNode {}
abstract class OrderingTermBase extends AstNode {}
class OrderBy extends AstNode implements OrderByBase {
final List<OrderingTermBase> terms;
List<OrderingTermBase> terms;
OrderBy({this.terms = const []});
@ -21,7 +21,7 @@ class OrderBy extends AstNode implements OrderByBase {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(terms, this, arg);
terms = transformer.transformChildren(terms, this, arg);
}
@override

View File

@ -8,7 +8,7 @@ import '../visitor.dart';
class Returning extends AstNode {
/// The `RETURNING` token as found in the source.
Token? returning;
final List<ResultColumn> columns;
List<ResultColumn> columns;
Returning(this.columns);
@ -22,6 +22,6 @@ class Returning extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(columns, this, arg);
columns = transformer.transformChildren(columns, this, arg);
}
}

View File

@ -3,7 +3,7 @@ import '../node.dart';
import '../statements/create_index.dart' show IndexedColumn;
class UpsertClause extends AstNode {
final List<UpsertClauseEntry> entries;
List<UpsertClauseEntry> entries;
UpsertClause(this.entries);
@ -17,12 +17,12 @@ class UpsertClause extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(entries, this, arg);
entries = transformer.transformChildren(entries, this, arg);
}
}
class UpsertClauseEntry extends AstNode implements HasWhereClause {
final List<IndexedColumn>? onColumns;
List<IndexedColumn>? onColumns;
@override
Expression? where;
@ -37,7 +37,9 @@ class UpsertClauseEntry extends AstNode implements HasWhereClause {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(onColumns!, this, arg);
if (onColumns != null) {
onColumns = transformer.transformChildren(onColumns!, this, arg);
}
where = transformer.transformNullableChild(where, this, arg);
action = transformer.transformChild(action, this, arg);
}
@ -68,7 +70,7 @@ class DoNothing extends UpsertAction {
}
class DoUpdate extends UpsertAction implements HasWhereClause {
final List<SetComponent> set;
List<SetComponent> set;
@override
Expression? where;
@ -81,7 +83,7 @@ class DoUpdate extends UpsertAction implements HasWhereClause {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(set, this, arg);
set = transformer.transformChildren(set, this, arg);
where = transformer.transformNullableChild(where, this, arg);
}

View File

@ -6,7 +6,7 @@ class WithClause extends AstNode {
final bool recursive;
Token? recursiveToken;
final List<CommonTableExpression> ctes;
List<CommonTableExpression> ctes;
WithClause({required this.recursive, required this.ctes});
@ -17,7 +17,7 @@ class WithClause extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(ctes, this, arg);
ctes = transformer.transformChildren(ctes, this, arg);
}
@override

View File

@ -93,7 +93,7 @@ class SelectStatementAsSource extends TableOrSubquery implements Renamable {
/// https://www.sqlite.org/syntax/join-clause.html
class JoinClause extends Queryable {
TableOrSubquery primary;
final List<Join> joins;
List<Join> joins;
JoinClause({required this.primary, required this.joins});
@ -105,7 +105,7 @@ class JoinClause extends Queryable {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
primary = transformer.transformChild(primary, this, arg);
transformer.transformChildren(joins, this, arg);
joins = transformer.transformChildren(joins, this, arg);
}
@override

View File

@ -5,7 +5,7 @@ part of '../ast.dart';
/// In sqlite, this is also called a "row value".
class Tuple extends Expression {
/// The expressions appearing in this tuple.
final List<Expression> expressions;
List<Expression> expressions;
/// Whether this tuple is used as an expression, e.g. a [row value][r v].
///
@ -23,7 +23,7 @@ class Tuple extends Expression {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(expressions, this, arg);
expressions = transformer.transformChildren(expressions, this, arg);
}
@override

View File

@ -77,7 +77,7 @@ class NamedWindowDeclaration with Referencable {
class WindowDefinition extends AstNode {
final String? baseWindowName;
final List<Expression> partitionBy;
List<Expression> partitionBy;
OrderByBase? orderBy;
FrameSpec frameSpec;
@ -94,7 +94,7 @@ class WindowDefinition extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(partitionBy, this, arg);
partitionBy = transformer.transformChildren(partitionBy, this, arg);
orderBy = transformer.transformNullableChild(orderBy, this, arg);
frameSpec = transformer.transformChild(frameSpec, this, arg);
}

View File

@ -2,7 +2,7 @@ part of '../ast.dart';
class CaseExpression extends Expression {
Expression? base;
final List<WhenComponent> whens;
List<WhenComponent> whens;
Expression? elseExpr;
CaseExpression({this.base, required this.whens, this.elseExpr});
@ -15,7 +15,7 @@ class CaseExpression extends Expression {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
base = transformer.transformNullableChild(base, this, arg);
transformer.transformChildren(whens, this, arg);
whens = transformer.transformChildren(whens, this, arg);
elseExpr = transformer.transformNullableChild(elseExpr, this, arg);
}

View File

@ -66,7 +66,7 @@ class StarFunctionParameter extends FunctionParameters {
class ExprFunctionParameters extends FunctionParameters {
final bool distinct;
final List<Expression> parameters;
List<Expression> parameters;
ExprFunctionParameters({this.parameters = const [], this.distinct = false});
@ -77,7 +77,7 @@ class ExprFunctionParameters extends FunctionParameters {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(parameters, this, arg);
parameters = transformer.transformChildren(parameters, this, arg);
}
@override

View File

@ -11,7 +11,7 @@ import 'moor_file.dart';
class DeclaredStatement extends Statement implements PartOfMoorFile {
final DeclaredStatementIdentifier identifier;
CrudStatement statement;
final List<StatementParameter> parameters;
List<StatementParameter> parameters;
/// The desired result class name, if set.
final String? as;
@ -34,7 +34,7 @@ class DeclaredStatement extends Statement implements PartOfMoorFile {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
statement = transformer.transformChild(statement, this, arg);
transformer.transformChildren(parameters, this, arg);
parameters = transformer.transformChildren(parameters, this, arg);
}
@override

View File

@ -12,7 +12,7 @@ abstract class PartOfMoorFile implements Statement {}
/// A moor file consists of [ImportStatement], followed by ddl statements,
/// followed by [DeclaredStatement]s.
class MoorFile extends AstNode {
final List<PartOfMoorFile> statements;
List<PartOfMoorFile> statements;
MoorFile(this.statements);
@ -23,7 +23,7 @@ class MoorFile extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(statements, this, arg);
statements = transformer.transformChildren(statements, this, arg);
}
@override

View File

@ -4,7 +4,7 @@ part of '../ast.dart';
class ColumnDefinition extends AstNode {
final String columnName;
final String? typeName;
final List<ColumnConstraint> constraints;
List<ColumnConstraint> constraints;
/// The tokens there were involved in defining the type of this column.
List<Token>? typeNames;
@ -22,7 +22,7 @@ class ColumnDefinition extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(constraints, this, arg);
constraints = transformer.transformChildren(constraints, this, arg);
}
@override

View File

@ -4,7 +4,7 @@ enum ReferenceAction { setNull, setDefault, cascade, restrict, noAction }
class ForeignKeyClause extends AstNode {
TableReference foreignTable;
final List<Reference> columnNames;
List<Reference> columnNames;
final ReferenceAction? onDelete;
final ReferenceAction? onUpdate;
DeferrableClause? deferrable;
@ -25,7 +25,7 @@ class ForeignKeyClause extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
foreignTable = transformer.transformChild(foreignTable, this, arg);
transformer.transformChildren(columnNames, this, arg);
columnNames = transformer.transformChildren(columnNames, this, arg);
deferrable = transformer.transformChild(deferrable!, this, arg);
}
@ -84,7 +84,7 @@ abstract class TableConstraint extends AstNode {
class KeyClause extends TableConstraint {
final bool isPrimaryKey;
final List<IndexedColumn> columns;
List<IndexedColumn> columns;
final ConflictClause? onConflict;
bool get isUnique => !isPrimaryKey;
@ -108,7 +108,7 @@ class KeyClause extends TableConstraint {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(columns, this, arg);
columns = transformer.transformChildren(columns, this, arg);
}
@override
@ -133,7 +133,7 @@ class CheckTable extends TableConstraint {
}
class ForeignKeyTableConstraint extends TableConstraint {
final List<Reference> columns;
List<Reference> columns;
ForeignKeyClause clause;
ForeignKeyTableConstraint(String? name,
@ -145,7 +145,7 @@ class ForeignKeyTableConstraint extends TableConstraint {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(columns, this, arg);
columns = transformer.transformChildren(columns, this, arg);
clause = transformer.transformChild(clause, this, arg);
}

View File

@ -7,7 +7,7 @@ import 'statement.dart';
class Block extends AstNode {
Token? begin;
Token? end;
final List<CrudStatement> statements;
List<CrudStatement> statements;
Block(this.statements);
@ -18,7 +18,7 @@ class Block extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(statements, this, arg);
statements = transformer.transformChildren(statements, this, arg);
}
@override

View File

@ -12,7 +12,7 @@ class CreateIndexStatement extends Statement
IdentifierToken? nameToken;
TableReference on;
final List<IndexedColumn> columns;
List<IndexedColumn> columns;
@override
Expression? where;
@ -35,7 +35,7 @@ class CreateIndexStatement extends Statement
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
on = transformer.transformChild(on, this, arg);
transformer.transformChildren(columns, this, arg);
columns = transformer.transformChildren(columns, this, arg);
where = transformer.transformNullableChild(where, this, arg);
}

View File

@ -26,8 +26,8 @@ abstract class TableInducingStatement extends Statement
/// A "CREATE TABLE" statement, see https://www.sqlite.org/lang_createtable.html
/// for the individual components.
class CreateTableStatement extends TableInducingStatement {
final List<ColumnDefinition> columns;
final List<TableConstraint> tableConstraints;
List<ColumnDefinition> columns;
List<TableConstraint> tableConstraints;
final bool withoutRowId;
Token? openingBracket;
@ -49,8 +49,9 @@ class CreateTableStatement extends TableInducingStatement {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(columns, this, arg);
transformer.transformChildren(tableConstraints, this, arg);
columns = transformer.transformChildren(columns, this, arg);
tableConstraints =
transformer.transformChildren(tableConstraints, this, arg);
}
@override

View File

@ -109,7 +109,7 @@ class InsertTarget extends TriggerTarget {
class UpdateTarget extends TriggerTarget {
Token? updateToken;
final List<Reference> columnNames;
List<Reference> columnNames;
UpdateTarget(this.columnNames);
@ -128,6 +128,6 @@ class UpdateTarget extends TriggerTarget {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(columnNames, this, arg);
columnNames = transformer.transformChildren(columnNames, this, arg);
}
}

View File

@ -22,7 +22,7 @@ class InsertStatement extends CrudStatement
final InsertMode mode;
@override
TableReference table;
final List<Reference> targetColumns;
List<Reference> targetColumns;
InsertSource source;
UpsertClause? upsert;
@ -59,7 +59,7 @@ class InsertStatement extends CrudStatement
void transformChildren<A>(Transformer<A> transformer, A arg) {
withClause = transformer.transformNullableChild(withClause, this, arg);
table = transformer.transformChild(table, this, arg);
transformer.transformChildren(targetColumns, this, arg);
targetColumns = transformer.transformChildren(targetColumns, this, arg);
returning = transformer.transformNullableChild(returning, this, arg);
}
@ -93,7 +93,7 @@ abstract class InsertSource extends AstNode {
/// Uses a list of values for an insert statement (`VALUES (a, b, c)`).
class ValuesSource extends InsertSource {
final List<Tuple> values;
List<Tuple> values;
ValuesSource(this.values);
@ -107,7 +107,7 @@ class ValuesSource extends InsertSource {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(values, this, arg);
values = transformer.transformChildren(values, this, arg);
}
}

View File

@ -25,7 +25,7 @@ class SelectStatement extends BaseSelectStatement
HasPrimarySource,
HasFrom {
final bool distinct;
final List<ResultColumn> columns;
List<ResultColumn> columns;
@override
Queryable? from;
@ -60,7 +60,7 @@ class SelectStatement extends BaseSelectStatement
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
withClause = transformer.transformNullableChild(withClause, this, arg);
transformer.transformChildren(columns, this, arg);
columns = transformer.transformChildren(columns, this, arg);
from = transformer.transformNullableChild(from, this, arg);
where = transformer.transformNullableChild(where, this, arg);
groupBy = transformer.transformNullableChild(groupBy, this, arg);
@ -86,7 +86,7 @@ class SelectStatement extends BaseSelectStatement
class CompoundSelectStatement extends BaseSelectStatement {
SelectStatementNoCompound base;
final List<CompoundSelectPart> additional;
List<CompoundSelectPart> additional;
// the grammar under https://www.sqlite.org/syntax/compound-select-stmt.html
// defines an order by and limit clause on this node, but we parse them as
@ -112,14 +112,14 @@ class CompoundSelectStatement extends BaseSelectStatement {
void transformChildren<A>(Transformer<A> transformer, A arg) {
withClause = transformer.transformNullableChild(withClause, this, arg);
base = transformer.transformChild(base, this, arg);
transformer.transformChildren(additional, this, arg);
additional = transformer.transformChildren(additional, this, arg);
}
}
/// A select statement of the form `VALUES (expr-list), ..., (expr-list-N)`.
class ValuesSelectStatement extends BaseSelectStatement
implements SelectStatementNoCompound {
final List<Tuple> values;
List<Tuple> values;
ValuesSelectStatement(this.values, {WithClause? withClause})
: super._(withClause);
@ -131,7 +131,7 @@ class ValuesSelectStatement extends BaseSelectStatement
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(values, this, arg);
values = transformer.transformChildren(values, this, arg);
}
@override
@ -186,7 +186,7 @@ class ExpressionResultColumn extends ResultColumn
class GroupBy extends AstNode {
/// The list of expressions that form the partition
final List<Expression> by;
List<Expression> by;
Expression? having;
GroupBy({required this.by, this.having});
@ -198,7 +198,7 @@ class GroupBy extends AstNode {
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {
transformer.transformChildren(by, this, arg);
by = transformer.transformChildren(by, this, arg);
having = transformer.transformNullableChild(having, this, arg);
}

View File

@ -31,7 +31,7 @@ class UpdateStatement extends CrudStatement
final FailureMode? or;
@override
TableReference table;
final List<SetComponent> set;
List<SetComponent> set;
@override
Queryable? from;
@override
@ -61,7 +61,7 @@ class UpdateStatement extends CrudStatement
void transformChildren<A>(Transformer<A> transformer, A arg) {
withClause = transformer.transformNullableChild(withClause, this, arg);
table = transformer.transformChild(table, this, arg);
transformer.transformChildren(set, this, arg);
set = transformer.transformChildren(set, this, arg);
from = transformer.transformNullableChild(from, this, arg);
where = transformer.transformChild(where!, this, arg);
returning = transformer.transformNullableChild(returning, this, arg);

View File

@ -641,19 +641,18 @@ extension TransformerUtils<A> on Transformer<A> {
return transformed as T;
}
void transformChildren<T extends AstNode?>(
List<T> transformChildren<T extends AstNode>(
List<T> children, AstNode parent, A arg) {
final newChildren = <T>[];
for (final child in children) {
// ignore: unnecessary_cast, it's a frontend bug in Dart 2.12
final transformed = transform(child as AstNode, arg) as T?;
if (transformed != null) {
newChildren.add(transformed..parent = parent);
}
}
children
..clear()
..addAll(newChildren);
return newChildren;
}
}