diff --git a/moor_generator/lib/src/backends/plugin/services/folding.dart b/moor_generator/lib/src/backends/plugin/services/folding.dart index 48961655..b10b3248 100644 --- a/moor_generator/lib/src/backends/plugin/services/folding.dart +++ b/moor_generator/lib/src/backends/plugin/services/folding.dart @@ -34,7 +34,7 @@ class _FoldingVisitor extends RecursiveVisitor { collector.addRegion(first, last - first, FoldingKind.DIRECTIVES); } - super.visitChildren(e, arg); + visitChildren(e, arg); } @override diff --git a/moor_generator/lib/src/backends/plugin/services/outline.dart b/moor_generator/lib/src/backends/plugin/services/outline.dart index 817d906c..9b92fe63 100644 --- a/moor_generator/lib/src/backends/plugin/services/outline.dart +++ b/moor_generator/lib/src/backends/plugin/services/outline.dart @@ -42,7 +42,7 @@ class _OutlineVisitor extends RecursiveVisitor { @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 { // 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 { element.parameters = parameterBuilder.toString(); } - super.visitChildren(e, arg); + visitChildren(e, arg); collector.endElement(); } } diff --git a/sqlparser/CHANGELOG.md b/sqlparser/CHANGELOG.md index 0f834dd8..50c7d1e4 100644 --- a/sqlparser/CHANGELOG.md +++ b/sqlparser/CHANGELOG.md @@ -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 diff --git a/sqlparser/lib/src/analysis/steps/prepare_ast.dart b/sqlparser/lib/src/analysis/steps/prepare_ast.dart index ec8fc83c..c1d1a4aa 100644 --- a/sqlparser/lib/src/analysis/steps/prepare_ast.dart +++ b/sqlparser/lib/src/analysis/steps/prepare_ast.dart @@ -190,13 +190,13 @@ class AstPreparingVisitor extends RecursiveVisitor { } @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 diff --git a/sqlparser/lib/src/analysis/steps/type_resolver.dart b/sqlparser/lib/src/analysis/steps/type_resolver.dart index ffd5f36a..da735905 100644 --- a/sqlparser/lib/src/analysis/steps/type_resolver.dart +++ b/sqlparser/lib/src/analysis/steps/type_resolver.dart @@ -10,7 +10,7 @@ class TypeResolvingVisitor extends RecursiveVisitor { 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 { e.resolvedColumns.forEach(types.resolveColumn); } - super.visitChildren(e, arg); + visitChildren(e, arg); } @override diff --git a/sqlparser/lib/src/ast/visitor.dart b/sqlparser/lib/src/ast/visitor.dart index b2b138e5..b7db74bd 100644 --- a/sqlparser/lib/src/ast/visitor.dart +++ b/sqlparser/lib/src/ast/visitor.dart @@ -155,29 +155,29 @@ class RecursiveVisitor implements AstVisitor { } 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 implements AstVisitor { } 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 implements AstVisitor { @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 implements AstVisitor { } R visitFunctionParameters(FunctionParameters e, A arg) { - return visitChildren(e, arg); + return defaultNode(e, arg); } @override @@ -418,7 +418,7 @@ class RecursiveVisitor implements AstVisitor { @override R visitWhen(WhenComponent e, A arg) { - return visitChildren(e, arg); + return defaultNode(e, arg); } @override @@ -455,21 +455,31 @@ class RecursiveVisitor implements AstVisitor { } 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 on AstVisitor { + /// 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 nodes, A arg) { for (final node in nodes) { node.accept(this, arg); @@ -477,6 +487,7 @@ class RecursiveVisitor implements AstVisitor { 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) { diff --git a/sqlparser/lib/utils/find_referenced_tables.dart b/sqlparser/lib/utils/find_referenced_tables.dart index 88a66a91..0e97557a 100644 --- a/sqlparser/lib/utils/find_referenced_tables.dart +++ b/sqlparser/lib/utils/find_referenced_tables.dart @@ -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.