mirror of https://github.com/AMT-Cheif/drift.git
Refactor custom table information in sqlparser
This commit is contained in:
parent
246add0c73
commit
e1d633526b
|
@ -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(
|
||||
|
|
|
@ -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) {}
|
||||
}
|
||||
|
|
|
@ -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!];
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
|
|
|
@ -56,7 +56,7 @@ void main() {
|
|||
],
|
||||
),
|
||||
],
|
||||
overriddenDataClassName: 'RowName',
|
||||
moorTableName: MoorTableName('RowName', false),
|
||||
),
|
||||
DeclaredStatement(
|
||||
SimpleName('all'),
|
||||
|
|
Loading…
Reference in New Issue