Make utility visitor methods an extension

This commit is contained in:
Simon Binder 2020-05-24 19:53:36 +02:00
parent e772ca0225
commit 01e5a47189
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
7 changed files with 57 additions and 44 deletions

View File

@ -34,7 +34,7 @@ class _FoldingVisitor extends RecursiveVisitor<void, void> {
collector.addRegion(first, last - first, FoldingKind.DIRECTIVES);
}
super.visitChildren(e, arg);
visitChildren(e, arg);
}
@override

View File

@ -42,7 +42,7 @@ class _OutlineVisitor extends RecursiveVisitor<void, void> {
@override
void visitCreateTableStatement(CreateTableStatement e, void arg) {
_startElement(ElementKind.CLASS, e.tableName, e);
super.visitChildren(e, arg);
visitChildren(e, arg);
collector.endElement();
}
@ -71,21 +71,21 @@ class _OutlineVisitor extends RecursiveVisitor<void, void> {
// the return type but we'd really like it to be shown
_startElement(ElementKind.FIELD, e.columnName, e).parameters = e.typeName;
super.visitChildren(e, arg);
visitChildren(e, arg);
collector.endElement();
}
@override
void visitMoorFile(MoorFile e, void arg) {
_startElement(ElementKind.LIBRARY, request.file.shortName, e);
super.visitChildren(e, arg);
visitChildren(e, arg);
collector.endElement();
}
@override
void visitMoorDeclaredStatement(DeclaredStatement e, void arg) {
if (!e.isRegularQuery) {
super.visitChildren(e, arg);
visitChildren(e, arg);
return;
}
@ -105,7 +105,7 @@ class _OutlineVisitor extends RecursiveVisitor<void, void> {
element.parameters = parameterBuilder.toString();
}
super.visitChildren(e, arg);
visitChildren(e, arg);
collector.endElement();
}
}

View File

@ -1,5 +1,6 @@
## 0.10.0
- Breaking: Made `RecursiveVisitor.visit`, `visitList` and `visitExcept` an extension on `AstVisitor`.
- Support parsing and analyzing `CREATE VIEW` statements (see `SchemaFromCreateTable.readView`).
Thanks to [@mqus](https://github.com/mqus) for their contribution!
@ -11,7 +12,8 @@ in a query.
## 0.8.1
- Support collate expressions in the new type inference ([#533](https://github.com/simolus3/moor/issues/533))
- Support collate expressions in the new type inference ([#533](htt
ps://github.com/simolus3/moor/issues/533))
- Added `visitCollateExpression` to the visitor classes
## 0.8.0

View File

@ -190,13 +190,13 @@ class AstPreparingVisitor extends RecursiveVisitor<void, void> {
}
@override
void visitChildren(AstNode e, void arg) {
void defaultNode(AstNode e, void arg) {
// hack to fork scopes on statements (selects are handled above)
if (e is Statement && e is! SelectStatement) {
_forkScope(e);
}
super.visitChildren(e, arg);
visitChildren(e, arg);
}
@override

View File

@ -10,7 +10,7 @@ class TypeResolvingVisitor extends RecursiveVisitor<void, void> {
TypeResolvingVisitor(this.context);
@override
void visitChildren(AstNode e, void arg) {
void defaultNode(AstNode e, void arg) {
// called for every ast node, so we implement this here
if (e is Expression && !types.needsToBeInferred(e)) {
types.resolveExpression(e);
@ -18,7 +18,7 @@ class TypeResolvingVisitor extends RecursiveVisitor<void, void> {
e.resolvedColumns.forEach(types.resolveColumn);
}
super.visitChildren(e, arg);
visitChildren(e, arg);
}
@override

View File

@ -155,29 +155,29 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R> {
}
R visitStatement(Statement statement, A arg) {
return visitChildren(statement, arg);
return defaultNode(statement, arg);
}
@override
R visitCompoundSelectPart(CompoundSelectPart e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
// General clauses
@override
R visitResultColumn(ResultColumn e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitWithClause(WithClause e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitUpsertClause(UpsertClause e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
@ -191,93 +191,93 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R> {
}
R defaultUpsertAction(UpsertAction e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitCommonTableExpression(CommonTableExpression e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitOrderBy(OrderBy e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitOrderingTerm(OrderingTerm e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitLimit(Limit e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitQueryable(Queryable e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitJoin(Join e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitGroupBy(GroupBy e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitSetComponent(SetComponent e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitColumnDefinition(ColumnDefinition e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitColumnConstraint(ColumnConstraint e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitTableConstraint(TableConstraint e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitForeignKeyClause(ForeignKeyClause e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitWindowDefinition(WindowDefinition e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitFrameSpec(FrameSpec e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitIndexedColumn(IndexedColumn e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitBlock(Block e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
// Moor-specific additions
@override
R visitMoorFile(MoorFile e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
@ -292,12 +292,12 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R> {
@override
R visitDartPlaceholder(DartPlaceholder e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
R visitMoorStatementParameter(StatementParameter e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
// Expressions
@ -383,7 +383,7 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R> {
}
R visitFunctionParameters(FunctionParameters e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
@ -418,7 +418,7 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R> {
@override
R visitWhen(WhenComponent e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
@override
@ -455,21 +455,31 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R> {
}
R visitInvocation(SqlInvocation e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
R visitExpression(Expression e, A arg) {
return visitChildren(e, arg);
return defaultNode(e, arg);
}
R defaultNode(AstNode e, A arg) {
return visitChildren(e, arg);
}
}
extension VisitChildrenExtension<A, R> on AstVisitor<A, R> {
/// Visits the node [e] by calling [AstNode.accept].
R visit(AstNode e, A arg) => e.accept(this, arg);
/// Visits the node [e] if it's not null. Otherwise, do nothing.
R visitNullable(AstNode e, A arg) => e?.accept(this, arg);
@protected
R visitChildren(AstNode e, A arg) => visitList(e.childNodes, arg);
/// Visits all children of the node [e], in the order of [AstNode.childNodes].
R visitChildren(AstNode e, A arg) {
return visitList(e.childNodes, arg);
}
@protected
/// Visits all [nodes] in sequence.
R visitList(Iterable<AstNode> nodes, A arg) {
for (final node in nodes) {
node.accept(this, arg);
@ -477,6 +487,7 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R> {
return null;
}
/// Visits all children of [node], except for [skip].
void visitExcept(AstNode node, AstNode skip, A arg) {
for (final child in node.childNodes) {
if (child != skip) {

View File

@ -120,7 +120,7 @@ class UpdatedTablesVisitor extends ReferencedTablesVisitor {
/// If you want to find all referenced tables, use [findReferencedTables]. If
/// you want to find writes (including their [UpdateKind]) and referenced
/// tables, constrct a [UpdatedTablesVisitor] manually.
/// Then, let it [RecursiveVisitor.visit] the [root] node. You can now use
/// Then, let it visit the [root] node. You can now use
/// [UpdatedTablesVisitor.writtenTables] and
/// [ReferencedTablesVisitor.foundTables]. This will only walk the ast once,
/// whereas calling this and [findReferencedTables] will require two walks.