Refactor custom table information in sqlparser

This commit is contained in:
Simon Binder 2021-05-24 15:11:18 +02:00
parent 246add0c73
commit e1d633526b
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
9 changed files with 86 additions and 52 deletions

View File

@ -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(

View File

@ -33,3 +33,21 @@ class MoorFile extends AstNode {
Iterable<ImportStatement> get imports =>
childNodes.whereType<ImportStatement>();
}
class MoorTableName extends AstNode {
final String overriddenDataClassName;
final bool useExistingDartClass;
MoorTableName(this.overriddenDataClassName, this.useExistingDartClass);
@override
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
return visitor.visitMoorTableName(this, arg);
}
@override
Iterable<AstNode> get childNodes => const Iterable.empty();
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {}
}

View File

@ -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<A, R>(AstVisitor<A, R> 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<AstNode> get childNodes => [...columns, ...tableConstraints];
Iterable<AstNode> 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<A, R>(AstVisitor<A, R> visitor, A arg) {
@ -93,8 +93,12 @@ class CreateVirtualTableStatement extends TableInducingStatement {
}
@override
void transformChildren<A>(Transformer<A> transformer, A arg) {}
void transformChildren<A>(Transformer<A> transformer, A arg) {
moorTableName =
transformer.transformNullableChild(moorTableName, this, arg);
}
@override
Iterable<AstNode> get childNodes => const [];
Iterable<AstNode> get childNodes =>
[if (moorTableName != null) moorTableName!];
}

View File

@ -98,6 +98,7 @@ abstract class AstVisitor<A, R> {
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<A, R> implements AstVisitor<A, R?> {
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);

View File

@ -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<Token> {
String get lexeme => first.span.expand(last.span).text;
}

View File

@ -206,9 +206,7 @@ class EqualityEnforcingVisitor implements AstVisitor<void, void> {
_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<void, void> {
_checkChildren(e);
}
@override
void visitMoorTableName(MoorTableName e, void arg) {
final current = _currentAs<MoorTableName>(e);
_assert(
current.overriddenDataClassName == e.overriddenDataClassName &&
current.useExistingDartClass == e.useExistingDartClass,
e);
}
@override
void visitNamedVariable(ColonNamedVariable e, void arg) {
final current = _currentAs<ColonNamedVariable>(e);

View File

@ -894,6 +894,12 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
}
}
@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

View File

@ -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,
);

View File

@ -56,7 +56,7 @@ void main() {
],
),
],
overriddenDataClassName: 'RowName',
moorTableName: MoorTableName('RowName', false),
),
DeclaredStatement(
SimpleName('all'),