From e1d633526be2919db7ee95058522bbd4c860c6f4 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Mon, 24 May 2021 15:11:18 +0200 Subject: [PATCH] Refactor custom table information in sqlparser --- .../analyzer/moor/create_table_reader.dart | 8 +-- sqlparser/lib/src/ast/moor/moor_file.dart | 18 +++++++ .../lib/src/ast/statements/create_table.dart | 54 ++++++++++--------- sqlparser/lib/src/ast/visitor.dart | 6 +++ sqlparser/lib/src/reader/parser.dart | 26 ++++----- sqlparser/lib/src/utils/ast_equality.dart | 13 +++-- sqlparser/lib/utils/node_to_text.dart | 6 +++ sqlparser/test/parser/create_table_test.dart | 5 +- sqlparser/test/parser/moor_file_test.dart | 2 +- 9 files changed, 86 insertions(+), 52 deletions(-) diff --git a/moor_generator/lib/src/analyzer/moor/create_table_reader.dart b/moor_generator/lib/src/analyzer/moor/create_table_reader.dart index 68f89ccc..3d428d17 100644 --- a/moor_generator/lib/src/analyzer/moor/create_table_reader.dart +++ b/moor_generator/lib/src/analyzer/moor/create_table_reader.dart @@ -168,9 +168,11 @@ class CreateTableReader { String dartTableName, dataClassName; ExistingRowClass existingRowClass; - final overriddenNames = stmt.overriddenDataClassName; - if (overriddenNames != null) { - if (stmt.useExistingDataClass) { + final moorTableInfo = stmt.moorTableName; + if (moorTableInfo != null) { + final overriddenNames = moorTableInfo.overriddenDataClassName; + + if (moorTableInfo.useExistingDartClass) { final clazz = await _findDartClass(overriddenNames); if (clazz == null) { step.reportError(ErrorInMoorFile( diff --git a/sqlparser/lib/src/ast/moor/moor_file.dart b/sqlparser/lib/src/ast/moor/moor_file.dart index 6316a797..2b6a7075 100644 --- a/sqlparser/lib/src/ast/moor/moor_file.dart +++ b/sqlparser/lib/src/ast/moor/moor_file.dart @@ -33,3 +33,21 @@ class MoorFile extends AstNode { Iterable get imports => childNodes.whereType(); } + +class MoorTableName extends AstNode { + final String overriddenDataClassName; + final bool useExistingDartClass; + + MoorTableName(this.overriddenDataClassName, this.useExistingDartClass); + + @override + R accept(AstVisitor visitor, A arg) { + return visitor.visitMoorTableName(this, arg); + } + + @override + Iterable get childNodes => const Iterable.empty(); + + @override + void transformChildren(Transformer transformer, A arg) {} +} diff --git a/sqlparser/lib/src/ast/statements/create_table.dart b/sqlparser/lib/src/ast/statements/create_table.dart index 74203ef3..57df93b3 100644 --- a/sqlparser/lib/src/ast/statements/create_table.dart +++ b/sqlparser/lib/src/ast/statements/create_table.dart @@ -9,17 +9,15 @@ abstract class TableInducingStatement extends Statement final bool ifNotExists; final String tableName; - /// Specific to moor. Overrides the name of the data class used to hold a - /// result for of this table. Will be null when the moor extensions are not - /// enabled or if no name has been set. - final String? overriddenDataClassName; - final bool useExistingDataClass; - + /// Moor-specific information about the desired name of a Dart class for this + /// table. + /// + /// This will always be `null` when moor extensions are not enabled. + MoorTableName? moorTableName; Token? tableNameToken; TableInducingStatement._(this.ifNotExists, this.tableName, - [this.overriddenDataClassName, bool? useExistingDataClass]) - : useExistingDataClass = useExistingDataClass ?? false; + [this.moorTableName]); @override String get createdName => tableName; @@ -35,16 +33,14 @@ class CreateTableStatement extends TableInducingStatement { Token? openingBracket; Token? closingBracket; - CreateTableStatement( - {bool ifNotExists = false, - required String tableName, - this.columns = const [], - this.tableConstraints = const [], - this.withoutRowId = false, - String? overriddenDataClassName, - bool? useExistingDartClass}) - : super._(ifNotExists, tableName, overriddenDataClassName, - useExistingDartClass); + CreateTableStatement({ + bool ifNotExists = false, + required String tableName, + this.columns = const [], + this.tableConstraints = const [], + this.withoutRowId = false, + MoorTableName? moorTableName, + }) : super._(ifNotExists, tableName, moorTableName); @override R accept(AstVisitor visitor, A arg) { @@ -56,10 +52,16 @@ class CreateTableStatement extends TableInducingStatement { columns = transformer.transformChildren(columns, this, arg); tableConstraints = transformer.transformChildren(tableConstraints, this, arg); + moorTableName = + transformer.transformNullableChild(moorTableName, this, arg); } @override - Iterable get childNodes => [...columns, ...tableConstraints]; + Iterable get childNodes => [ + ...columns, + ...tableConstraints, + if (moorTableName != null) moorTableName!, + ]; } class CreateVirtualTableStatement extends TableInducingStatement { @@ -82,10 +84,8 @@ class CreateVirtualTableStatement extends TableInducingStatement { required String tableName, required this.moduleName, this.arguments = const [], - String? overriddenDataClassName, - bool? useExistingDartClass, - }) : super._(ifNotExists, tableName, overriddenDataClassName, - useExistingDartClass); + MoorTableName? moorTableName, + }) : super._(ifNotExists, tableName, moorTableName); @override R accept(AstVisitor visitor, A arg) { @@ -93,8 +93,12 @@ class CreateVirtualTableStatement extends TableInducingStatement { } @override - void transformChildren(Transformer transformer, A arg) {} + void transformChildren(Transformer transformer, A arg) { + moorTableName = + transformer.transformNullableChild(moorTableName, this, arg); + } @override - Iterable get childNodes => const []; + Iterable get childNodes => + [if (moorTableName != null) moorTableName!]; } diff --git a/sqlparser/lib/src/ast/visitor.dart b/sqlparser/lib/src/ast/visitor.dart index c78a995e..00849476 100644 --- a/sqlparser/lib/src/ast/visitor.dart +++ b/sqlparser/lib/src/ast/visitor.dart @@ -98,6 +98,7 @@ abstract class AstVisitor { R visitMoorDeclaredStatement(DeclaredStatement e, A arg); R visitMoorStatementParameter(StatementParameter e, A arg); R visitMoorNestedStarResultColumn(NestedStarResultColumn e, A arg); + R visitMoorTableName(MoorTableName e, A arg); R visitDartPlaceholder(DartPlaceholder e, A arg); } @@ -211,6 +212,11 @@ class RecursiveVisitor implements AstVisitor { return visitResultColumn(e, arg); } + @override + R? visitMoorTableName(MoorTableName e, A arg) { + return defaultNode(e, arg); + } + @override R? visitReturning(Returning e, A arg) { return defaultNode(e, arg); diff --git a/sqlparser/lib/src/reader/parser.dart b/sqlparser/lib/src/reader/parser.dart index eb7c09a4..d76e61ae 100644 --- a/sqlparser/lib/src/reader/parser.dart +++ b/sqlparser/lib/src/reader/parser.dart @@ -1879,7 +1879,7 @@ class Parser { withoutRowId = true; } - final overriddenName = _overriddenDataClassName(); + final overriddenName = _moorTableName(); return CreateTableStatement( ifNotExists: ifNotExists, @@ -1887,13 +1887,12 @@ class Parser { withoutRowId: withoutRowId, columns: columns, tableConstraints: tableConstraints, - overriddenDataClassName: overriddenName?.name, - useExistingDartClass: overriddenName?.useExisting, + moorTableName: overriddenName, ) ..setSpan(first, _previous) ..openingBracket = leftParen - ..closingBracket = rightParen - ..tableNameToken = tableIdentifier; + ..tableNameToken = tableIdentifier + ..closingBracket = rightParen; } /// Parses a `CREATE VIRTUAL TABLE` statement, after the `CREATE VIRTUAL TABLE @@ -1953,28 +1952,28 @@ class Parser { } } - final moorDataClassName = _overriddenDataClassName(); + final moorDataClassName = _moorTableName(); return CreateVirtualTableStatement( ifNotExists: ifNotExists, tableName: nameToken.identifier, moduleName: moduleName.identifier, arguments: args, - overriddenDataClassName: moorDataClassName?.name, - useExistingDartClass: moorDataClassName?.useExisting, + moorTableName: moorDataClassName, ) ..setSpan(first, _previous) ..tableNameToken = nameToken ..moduleNameToken = moduleName; } - _OverriddenDataClassName? _overriddenDataClassName() { + MoorTableName? _moorTableName() { if (enableMoorExtensions && (_match(const [TokenType.as, TokenType.$with]))) { + final first = _previous; final useExisting = _previous.type == TokenType.$with; final name = _consumeIdentifier('Expected the name for the data class').identifier; - return _OverriddenDataClassName(name, useExisting); + return MoorTableName(name, useExisting)..setSpan(first, _previous); } return null; } @@ -2513,13 +2512,6 @@ class Parser { } } -class _OverriddenDataClassName { - final String name; - final bool useExisting; - - _OverriddenDataClassName(this.name, this.useExisting); -} - extension on List { String get lexeme => first.span.expand(last.span).text; } diff --git a/sqlparser/lib/src/utils/ast_equality.dart b/sqlparser/lib/src/utils/ast_equality.dart index 75ca6105..6179da12 100644 --- a/sqlparser/lib/src/utils/ast_equality.dart +++ b/sqlparser/lib/src/utils/ast_equality.dart @@ -206,9 +206,7 @@ class EqualityEnforcingVisitor implements AstVisitor { _assert( current.ifNotExists == e.ifNotExists && current.tableName == e.tableName && - current.withoutRowId == e.withoutRowId && - current.overriddenDataClassName == e.overriddenDataClassName && - current.useExistingDataClass == e.useExistingDataClass, + current.withoutRowId == e.withoutRowId, e); _checkChildren(e); } @@ -489,6 +487,15 @@ class EqualityEnforcingVisitor implements AstVisitor { _checkChildren(e); } + @override + void visitMoorTableName(MoorTableName e, void arg) { + final current = _currentAs(e); + _assert( + current.overriddenDataClassName == e.overriddenDataClassName && + current.useExistingDartClass == e.useExistingDartClass, + e); + } + @override void visitNamedVariable(ColonNamedVariable e, void arg) { final current = _currentAs(e); diff --git a/sqlparser/lib/utils/node_to_text.dart b/sqlparser/lib/utils/node_to_text.dart index 40a36156..d5d0baa8 100644 --- a/sqlparser/lib/utils/node_to_text.dart +++ b/sqlparser/lib/utils/node_to_text.dart @@ -894,6 +894,12 @@ class NodeSqlBuilder extends AstVisitor { } } + @override + void visitMoorTableName(MoorTableName e, void arg) { + _keyword(e.useExistingDartClass ? TokenType.$with : TokenType.as); + _identifier(e.overriddenDataClassName); + } + @override void visitNamedVariable(ColonNamedVariable e, void arg) { // Note: The name already starts with the colon diff --git a/sqlparser/test/parser/create_table_test.dart b/sqlparser/test/parser/create_table_test.dart index 406098a0..8ff6370c 100644 --- a/sqlparser/test/parser/create_table_test.dart +++ b/sqlparser/test/parser/create_table_test.dart @@ -198,8 +198,7 @@ void main() { typeName: 'INTEGER', ), ], - overriddenDataClassName: 'MyExistingClass', - useExistingDartClass: true, + moorTableName: MoorTableName('MyExistingClass', true), ), moorMode: true, ); @@ -217,7 +216,7 @@ void main() { fakeSpan('b()'), fakeSpan('c'), ], - overriddenDataClassName: 'moor', + moorTableName: MoorTableName('moor', false), ), moorMode: true, ); diff --git a/sqlparser/test/parser/moor_file_test.dart b/sqlparser/test/parser/moor_file_test.dart index d6e76830..ad016523 100644 --- a/sqlparser/test/parser/moor_file_test.dart +++ b/sqlparser/test/parser/moor_file_test.dart @@ -56,7 +56,7 @@ void main() { ], ), ], - overriddenDataClassName: 'RowName', + moorTableName: MoorTableName('RowName', false), ), DeclaredStatement( SimpleName('all'),