mirror of https://github.com/AMT-Cheif/drift.git
Rename `moor` to `drift` in `sqlparser`
This commit is contained in:
parent
ce31515c07
commit
93d328f056
|
@ -21,7 +21,7 @@ class CreateTableReader {
|
|||
final Step step;
|
||||
final List<ImportStatement> imports;
|
||||
|
||||
static const _schemaReader = SchemaFromCreateTable(moorExtensions: true);
|
||||
static const _schemaReader = SchemaFromCreateTable(driftExtensions: true);
|
||||
static final RegExp _enumRegex =
|
||||
RegExp(r'^enum\((\w+)\)$', caseSensitive: false);
|
||||
|
||||
|
@ -125,7 +125,7 @@ class CreateTableReader {
|
|||
// those are moor-specific as well, don't write them
|
||||
continue;
|
||||
}
|
||||
if (constraint is MoorDartName) {
|
||||
if (constraint is DriftDartName) {
|
||||
overriddenDartName = constraint.dartName;
|
||||
// ditto
|
||||
continue;
|
||||
|
@ -167,7 +167,7 @@ class CreateTableReader {
|
|||
String? dartTableName, dataClassName;
|
||||
ExistingRowClass? existingRowClass;
|
||||
|
||||
final moorTableInfo = stmt.moorTableName;
|
||||
final moorTableInfo = stmt.driftTableName;
|
||||
if (moorTableInfo != null) {
|
||||
final overriddenNames = moorTableInfo.overriddenDataClassName;
|
||||
|
||||
|
|
|
@ -12,8 +12,8 @@ class MoorParser {
|
|||
|
||||
Future<ParsedMoorFile> parseAndAnalyze() async {
|
||||
final engine = step.task.session.spawnEngine();
|
||||
final result = engine.parseMoorFile(step.content);
|
||||
final parsedFile = result.rootNode as MoorFile;
|
||||
final result = engine.parseDriftFile(step.content);
|
||||
final parsedFile = result.rootNode as DriftFile;
|
||||
|
||||
final createdReaders = <CreateTableReader>[];
|
||||
final queryDeclarations = <DeclaredMoorQuery>[];
|
||||
|
|
|
@ -33,14 +33,14 @@ class ParsedDartFile extends FileResult {
|
|||
|
||||
class ParsedMoorFile extends FileResult {
|
||||
final ParseResult parseResult;
|
||||
MoorFile get parsedFile => parseResult.rootNode as MoorFile;
|
||||
DriftFile get parsedFile => parseResult.rootNode as DriftFile;
|
||||
|
||||
final List<ImportStatement> imports;
|
||||
final List<DeclaredQuery> queries;
|
||||
|
||||
/// Schema component that are neither tables nor queries. This can include
|
||||
/// triggers or indexes.
|
||||
final List<PartOfMoorFile> otherComponents;
|
||||
final List<PartOfDriftFile> otherComponents;
|
||||
|
||||
List<SqlQuery>? resolvedQueries;
|
||||
Map<ImportStatement, FoundFile>? resolvedImports;
|
||||
|
|
|
@ -39,7 +39,7 @@ class MoorSession {
|
|||
/// Creates a properly configured [SqlEngine].
|
||||
SqlEngine spawnEngine() {
|
||||
final sqlOptions = EngineOptions(
|
||||
useMoorExtensions: true,
|
||||
useDriftExtensions: true,
|
||||
enabledExtensions: [
|
||||
if (options.hasModule(SqlModule.fts5)) const Fts5Extension(),
|
||||
if (options.hasModule(SqlModule.json1)) const Json1Extension(),
|
||||
|
|
|
@ -78,7 +78,7 @@ class _LintingVisitor extends RecursiveVisitor<void, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is DartPlaceholder) {
|
||||
return visitDartPlaceholder(e, arg);
|
||||
} else if (e is NestedStarResultColumn) {
|
||||
|
|
|
@ -58,7 +58,7 @@ class NestedQueryAnalyzer extends RecursiveVisitor<_AnalyzerState, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, _AnalyzerState arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, _AnalyzerState arg) {
|
||||
if (e is NestedQueryColumn) {
|
||||
final expectedParent = arg.container.select;
|
||||
if (e.parent != expectedParent || !expectedParent.columns.contains(e)) {
|
||||
|
@ -75,12 +75,12 @@ class NestedQueryAnalyzer extends RecursiveVisitor<_AnalyzerState, void> {
|
|||
arg.container.nestedQueries[e] = nested;
|
||||
|
||||
final childState = _AnalyzerState(nested);
|
||||
super.visitMoorSpecificNode(e, childState);
|
||||
super.visitDriftSpecificNode(e, childState);
|
||||
childState._process();
|
||||
return;
|
||||
}
|
||||
|
||||
super.visitMoorSpecificNode(e, arg);
|
||||
super.visitDriftSpecificNode(e, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -154,8 +154,8 @@ class _NestedQueryTransformer extends Transformer<NestedQueriesContainer> {
|
|||
}
|
||||
|
||||
@override
|
||||
AstNode? visitMoorSpecificNode(
|
||||
MoorSpecificNode e, NestedQueriesContainer arg) {
|
||||
AstNode? visitDriftSpecificNode(
|
||||
DriftSpecificNode e, NestedQueriesContainer arg) {
|
||||
if (e is NestedQueryColumn) {
|
||||
final child = arg.nestedQueries[e];
|
||||
if (child != null) {
|
||||
|
@ -165,7 +165,7 @@ class _NestedQueryTransformer extends Transformer<NestedQueriesContainer> {
|
|||
// Remove nested query colums from the parent query
|
||||
return null;
|
||||
}
|
||||
return super.visitMoorSpecificNode(e, arg);
|
||||
return super.visitDriftSpecificNode(e, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -383,7 +383,8 @@ class _FindElements extends RecursiveVisitor<NestedQueriesContainer?, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, NestedQueriesContainer? arg) {
|
||||
void visitDriftSpecificNode(
|
||||
DriftSpecificNode e, NestedQueriesContainer? arg) {
|
||||
if (e is NestedQueryColumn) {
|
||||
// If the node ist a nested query, return to avoid collecting elements
|
||||
// inside of it
|
||||
|
@ -394,7 +395,7 @@ class _FindElements extends RecursiveVisitor<NestedQueriesContainer?, void> {
|
|||
dartPlaceholders.add(e);
|
||||
}
|
||||
|
||||
super.visitMoorSpecificNode(e, arg);
|
||||
super.visitDriftSpecificNode(e, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -28,7 +28,7 @@ class ViewAnalyzer extends BaseAnalyzer {
|
|||
final declaration = viewDeclaration.creatingStatement;
|
||||
|
||||
final parserView = view.parserView =
|
||||
const SchemaFromCreateTable(moorExtensions: true)
|
||||
const SchemaFromCreateTable(driftExtensions: true)
|
||||
.readView(ctx, declaration);
|
||||
|
||||
final columns = <MoorColumn>[];
|
||||
|
@ -51,7 +51,7 @@ class ViewAnalyzer extends BaseAnalyzer {
|
|||
|
||||
view.columns = columns;
|
||||
|
||||
final desiredNames = declaration.moorTableName;
|
||||
final desiredNames = declaration.driftTableName;
|
||||
if (desiredNames != null) {
|
||||
final dataClassName = desiredNames.overriddenDataClassName;
|
||||
if (desiredNames.useExistingDartClass) {
|
||||
|
|
|
@ -40,13 +40,13 @@ class PreprocessBuilder extends Builder {
|
|||
FutureOr<void> build(BuildStep buildStep) async {
|
||||
final input = buildStep.inputId;
|
||||
final moorFileContent = await buildStep.readAsString(input);
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
|
||||
ParseResult parsedInput;
|
||||
try {
|
||||
parsedInput = engine.parseMoorFile(moorFileContent);
|
||||
parsedInput = engine.parseDriftFile(moorFileContent);
|
||||
} on Exception {
|
||||
// Moor file couldn't be parsed, ignore... If it's imported, the main
|
||||
// Drift file couldn't be parsed, ignore... If it's imported, the main
|
||||
// builder will provide a better error message.
|
||||
return;
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ class PreprocessBuilder extends Builder {
|
|||
if (asset.extension == '.moor' || asset.extension == '.drift') {
|
||||
final parsed = asset == input
|
||||
? parsedInput
|
||||
: engine.parseMoorFile(await buildStep.readAsString(asset));
|
||||
: engine.parseDriftFile(await buildStep.readAsString(asset));
|
||||
|
||||
parsed.rootNode.allDescendants
|
||||
.whereType<ImportStatement>()
|
||||
|
|
|
@ -25,15 +25,15 @@ class _FoldingVisitor extends RecursiveVisitor<void, void> {
|
|||
_FoldingVisitor(this.collector);
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
if (e is MoorFile) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is DriftFile) {
|
||||
visitMoorFile(e, arg);
|
||||
} else {
|
||||
visitChildren(e, arg);
|
||||
}
|
||||
}
|
||||
|
||||
void visitMoorFile(MoorFile e, void arg) {
|
||||
void visitMoorFile(DriftFile e, void arg) {
|
||||
// construct a folding region for import statements
|
||||
final imports = e.imports.toList();
|
||||
if (imports.length > 1) {
|
||||
|
|
|
@ -42,7 +42,7 @@ class _NavigationVisitor extends RecursiveVisitor<void, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is ImportStatement) {
|
||||
return visitMoorImportStatement(e, arg);
|
||||
}
|
||||
|
|
|
@ -77,15 +77,15 @@ class _OutlineVisitor extends RecursiveVisitor<void, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
if (e is MoorFile) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is DriftFile) {
|
||||
visitMoorFile(e, arg);
|
||||
} else if (e is DeclaredStatement) {
|
||||
visitMoorDeclaredStatement(e, arg);
|
||||
}
|
||||
}
|
||||
|
||||
void visitMoorFile(MoorFile e, void arg) {
|
||||
void visitMoorFile(DriftFile e, void arg) {
|
||||
_startElement(ElementKind.LIBRARY, request.file.shortName, e);
|
||||
visitChildren(e, arg);
|
||||
collector.endElement();
|
||||
|
|
|
@ -100,11 +100,11 @@ class MigrateCommand extends MoorCommand {
|
|||
}
|
||||
|
||||
Future<String> _transformMoorFile(File file) async {
|
||||
final engine = SqlEngine(
|
||||
EngineOptions(useMoorExtensions: true, version: SqliteVersion.current));
|
||||
final engine = SqlEngine(EngineOptions(
|
||||
useDriftExtensions: true, version: SqliteVersion.current));
|
||||
final originalContent = await file.readAsString();
|
||||
var output = originalContent;
|
||||
final result = engine.parseMoorFile(originalContent);
|
||||
final result = engine.parseDriftFile(originalContent);
|
||||
|
||||
if (result.errors.isNotEmpty) {
|
||||
cli.logger.warning('Could not parse ${file.path}, skipping...');
|
||||
|
@ -112,7 +112,7 @@ class MigrateCommand extends MoorCommand {
|
|||
}
|
||||
|
||||
// Change imports to point from .moor to .drift files
|
||||
final root = result.rootNode as MoorFile;
|
||||
final root = result.rootNode as DriftFile;
|
||||
for (final import in root.imports) {
|
||||
final importedFile = import.importedFile;
|
||||
if (p.url.extension(importedFile) == '.moor') {
|
||||
|
|
|
@ -147,7 +147,7 @@ class _HighlightingVisitor extends RecursiveVisitor<void, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is DeclaredStatement) {
|
||||
final identifier = e.identifier;
|
||||
if (identifier is SimpleName && identifier.identifier != null) {
|
||||
|
|
|
@ -118,11 +118,11 @@ class SqlWriter extends NodeSqlBuilder {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is NestedStarResultColumn) {
|
||||
final result = _starColumnToResolved[e];
|
||||
if (result == null) {
|
||||
return super.visitMoorSpecificNode(e, arg);
|
||||
return super.visitDriftSpecificNode(e, arg);
|
||||
}
|
||||
|
||||
final select = query as SqlSelectQuery;
|
||||
|
@ -155,7 +155,7 @@ class SqlWriter extends NodeSqlBuilder {
|
|||
'variables (or just removed if no variables are required)',
|
||||
);
|
||||
} else {
|
||||
return super.visitMoorSpecificNode(e, arg);
|
||||
return super.visitDriftSpecificNode(e, arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import 'package:sqlparser/utils/node_to_text.dart';
|
|||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
final result = engine.parse('CREATE TABLE a (id INTEGER);');
|
||||
engine.registerTable(const SchemaFromCreateTable()
|
||||
.read(result.rootNode as CreateTableStatement));
|
||||
|
|
|
@ -10,7 +10,7 @@ import '../utils.dart';
|
|||
|
||||
void main() {
|
||||
final engine = SqlEngine(EngineOptions(
|
||||
useMoorExtensions: true, enabledExtensions: const [Json1Extension()]));
|
||||
useDriftExtensions: true, enabledExtensions: const [Json1Extension()]));
|
||||
final mapper = TypeMapper();
|
||||
|
||||
final fakeQuery = DeclaredDartQuery('query', 'sql');
|
||||
|
|
|
@ -28,7 +28,7 @@ CREATE TABLE bar (
|
|||
|
||||
Future<void> main() async {
|
||||
final mapper = TypeMapper();
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
final step = ParseMoorStep(Task(null, null, null),
|
||||
FoundFile(Uri.parse('file://foo'), FileType.moor), '');
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ final Table table =
|
|||
Table(name: 'todos', resolvedColumns: [_idColumn, _titleColumn]);
|
||||
|
||||
void main() {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
final mapper = TypeMapper();
|
||||
|
||||
test('extracts variables and sorts them by index', () {
|
||||
|
|
|
@ -5,7 +5,7 @@ import 'package:intl/intl.dart';
|
|||
|
||||
import 'src/moor/key_value_insert.dart';
|
||||
import 'src/sqlite/bind_string.dart';
|
||||
import 'src/sqlparser/parse_moor_file.dart';
|
||||
import 'src/sqlparser/parse_drift_file.dart';
|
||||
import 'src/sqlparser/tokenizer.dart';
|
||||
|
||||
export 'package:benchmark_harness/benchmark_harness.dart' show ScoreEmitter;
|
||||
|
@ -20,7 +20,7 @@ List<Reportable> allBenchmarks(ScoreEmitter emitter) {
|
|||
KeyValueInsertBatch(emitter),
|
||||
KeyValueInsertSerial(emitter),
|
||||
// sql parser
|
||||
ParseMoorFile(emitter),
|
||||
ParseDriftFile(emitter),
|
||||
TokenizerBenchmark(emitter),
|
||||
];
|
||||
}
|
||||
|
|
|
@ -30,20 +30,21 @@ manyColumns:
|
|||
SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM test;
|
||||
''';
|
||||
|
||||
class ParseMoorFile extends BenchmarkBase {
|
||||
ParseMoorFile(ScoreEmitter emitter) : super('Moor file: Parse only', emitter);
|
||||
class ParseDriftFile extends BenchmarkBase {
|
||||
ParseDriftFile(ScoreEmitter emitter)
|
||||
: super('Moor file: Parse only', emitter);
|
||||
|
||||
final _engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final _engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
|
||||
@override
|
||||
void exercise() {
|
||||
for (var i = 0; i < 10; i++) {
|
||||
assert(_engine.parseMoorFile(file).errors.isEmpty);
|
||||
assert(_engine.parseDriftFile(file).errors.isEmpty);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void run() {
|
||||
_engine.parseMoorFile(file);
|
||||
_engine.parseDriftFile(file);
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
## 0.21.0
|
||||
|
||||
- Analysis support for new features in sqlite version 3.38.
|
||||
- Replace internal `moor` references with `drift` references.
|
||||
|
||||
## 0.20.1
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ resolvedColumns.map((c) => context.typeOf(c).type.type); // int, text, int, text
|
|||
```
|
||||
|
||||
## But why?
|
||||
[Moor](https://pub.dev/packages/moor), a persistence library for Dart apps, uses this
|
||||
[Drift](https://pub.dev/packages/drift), a persistence library for Dart apps, uses this
|
||||
package to generate type-safe methods from sql.
|
||||
|
||||
## Thanks
|
||||
|
|
|
@ -12,4 +12,5 @@ export 'src/engine/options.dart';
|
|||
export 'src/engine/sql_engine.dart';
|
||||
export 'src/reader/parser.dart' show ParsingError;
|
||||
export 'src/reader/syntactic_entity.dart';
|
||||
export 'src/reader/tokenizer/token.dart' hide keywords, moorKeywords, isKeyword;
|
||||
export 'src/reader/tokenizer/token.dart'
|
||||
hide keywords, driftKeywords, isKeyword;
|
||||
|
|
|
@ -6,7 +6,7 @@ class AnalyzeStatementOptions {
|
|||
final Map<int, ResolvedType> indexedVariableTypes;
|
||||
final Map<String, ResolvedType> namedVariableTypes;
|
||||
|
||||
/// Moor specific. Maps from a Dart placeholder in a query to its default
|
||||
/// Drift specific. Maps from a Dart placeholder in a query to its default
|
||||
/// expression, if set.
|
||||
final Map<String, Expression> defaultValuesForPlaceholder;
|
||||
|
||||
|
|
|
@ -4,9 +4,9 @@ part of '../analysis.dart';
|
|||
class SchemaFromCreateTable {
|
||||
/// Whether we should provide additional type hints for nonstandard `BOOL`
|
||||
/// and `DATETIME` columns.
|
||||
final bool moorExtensions;
|
||||
final bool driftExtensions;
|
||||
|
||||
const SchemaFromCreateTable({this.moorExtensions = false});
|
||||
const SchemaFromCreateTable({this.driftExtensions = false});
|
||||
|
||||
/// Reads a [Table] schema from the [stmt] inducing a table (either a
|
||||
/// [CreateTableStatement] or a [CreateVirtualTableStatement]).
|
||||
|
@ -126,7 +126,7 @@ class SchemaFromCreateTable {
|
|||
}
|
||||
|
||||
/// Resolves a column type via its typename, see the linked rules below.
|
||||
/// Additionally, if [moorExtensions] are enabled, we support [IsBoolean] and
|
||||
/// Additionally, if [driftExtensions] are enabled, we support [IsBoolean] and
|
||||
/// [IsDateTime] hints if the type name contains `BOOL` or `DATE`,
|
||||
/// respectively.
|
||||
/// https://www.sqlite.org/datatype3.html#determination_of_column_affinity
|
||||
|
@ -149,7 +149,7 @@ class SchemaFromCreateTable {
|
|||
return const ResolvedType(type: BasicType.blob);
|
||||
}
|
||||
|
||||
if (moorExtensions) {
|
||||
if (driftExtensions) {
|
||||
if (upper.contains('BOOL')) {
|
||||
return const ResolvedType.bool();
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ class SchemaFromCreateTable {
|
|||
}
|
||||
|
||||
bool isValidTypeNameForStrictTable(String typeName) {
|
||||
if (moorExtensions) {
|
||||
if (driftExtensions) {
|
||||
// Drift_dev will use resolveColumnType to analyze the actual type of the
|
||||
// column, and the generated code will always use a valid type name for
|
||||
// that type. So, anything goes!
|
||||
|
|
|
@ -43,7 +43,7 @@ class LintingVisitor extends RecursiveVisitor<void, void> {
|
|||
@override
|
||||
void visitCreateTableStatement(CreateTableStatement e, void arg) {
|
||||
final schemaReader =
|
||||
SchemaFromCreateTable(moorExtensions: options.useMoorExtensions);
|
||||
SchemaFromCreateTable(driftExtensions: options.useDriftExtensions);
|
||||
var hasNonGeneratedColumn = false;
|
||||
var hasPrimaryKeyDeclaration = false;
|
||||
var isStrict = false;
|
||||
|
|
|
@ -252,7 +252,7 @@ class AstPreparingVisitor extends RecursiveVisitor<void, void> {
|
|||
|
||||
/// If a nested query was found. Collect everything separately.
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is NestedQueryColumn) {
|
||||
// create a new scope for the nested query to differentiate between
|
||||
// references that can be resolved in the nested query and references
|
||||
|
@ -260,7 +260,7 @@ class AstPreparingVisitor extends RecursiveVisitor<void, void> {
|
|||
e.select.scope = e.scope.createChild();
|
||||
AstPreparingVisitor(context: context).start(e.select);
|
||||
} else {
|
||||
super.visitMoorSpecificNode(e, arg);
|
||||
super.visitDriftSpecificNode(e, arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -174,11 +174,11 @@ class TypeResolver extends RecursiveVisitor<TypeExpectation, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, TypeExpectation arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, TypeExpectation arg) {
|
||||
if (e is DartExpressionPlaceholder) {
|
||||
_inferAsVariable(e, arg);
|
||||
} else {
|
||||
super.visitMoorSpecificNode(e, arg);
|
||||
super.visitDriftSpecificNode(e, arg);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,9 +2,8 @@ import 'package:meta/meta.dart';
|
|||
import 'package:sqlparser/src/analysis/analysis.dart';
|
||||
import 'package:sqlparser/src/reader/tokenizer/token.dart';
|
||||
|
||||
// todo: Remove these imports after splitting up this library
|
||||
import 'drift/inline_dart.dart';
|
||||
import 'expressions/expressions.dart';
|
||||
import 'moor/inline_dart.dart';
|
||||
import 'node.dart';
|
||||
import 'statements/create_index.dart';
|
||||
import 'statements/select.dart';
|
||||
|
@ -12,14 +11,14 @@ import 'visitor.dart';
|
|||
|
||||
export 'clauses/returning.dart';
|
||||
export 'clauses/upsert.dart';
|
||||
export 'drift/declared_statement.dart';
|
||||
export 'drift/drift_file.dart';
|
||||
export 'drift/import_statement.dart';
|
||||
export 'drift/inline_dart.dart';
|
||||
export 'drift/nested_query_column.dart';
|
||||
export 'drift/nested_star_result_column.dart';
|
||||
export 'expressions/expressions.dart';
|
||||
export 'expressions/raise.dart';
|
||||
export 'moor/declared_statement.dart';
|
||||
export 'moor/import_statement.dart';
|
||||
export 'moor/inline_dart.dart';
|
||||
export 'moor/moor_file.dart';
|
||||
export 'moor/nested_query_column.dart';
|
||||
export 'moor/nested_star_result_column.dart';
|
||||
export 'node.dart';
|
||||
export 'statements/block.dart';
|
||||
export 'statements/create_index.dart';
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
part of '../ast.dart';
|
||||
|
||||
/// Base for limit statements. Without moor extensions, only [Limit] will be
|
||||
/// parsed. With moor extensions, a [DartLimitPlaceholder] can be emitted as
|
||||
/// Base for `LIMIT` clauses. Without drift extensions, only [Limit] will be
|
||||
/// parsed. With drift extensions, a [DartLimitPlaceholder] can be emitted as
|
||||
/// well.
|
||||
abstract class LimitBase implements AstNode {}
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
part of '../ast.dart';
|
||||
|
||||
/// Base for `ORDER BY` clauses. Without moor extensions, ony [OrderBy] will be
|
||||
/// Base for `ORDER BY` clauses. Without drift extensions, ony [OrderBy] will be
|
||||
/// parsed. Otherwise, [DartOrderByPlaceholder] can be parsed as well.
|
||||
abstract class OrderByBase extends AstNode {}
|
||||
|
||||
/// Base for a single ordering term that is a part of a [OrderBy]. Without moor
|
||||
/// extensions, only [OrderingTerm] will be parsed. With moor extensions, a
|
||||
/// Base for a single ordering term that is a part of a [OrderBy]. Without drift
|
||||
/// extensions, only [OrderingTerm] will be parsed. With drift extensions, a
|
||||
/// [DartOrderingTermPlaceholder] can be parsed as well.
|
||||
abstract class OrderingTermBase extends AstNode {}
|
||||
|
||||
|
|
|
@ -5,11 +5,11 @@ import '../node.dart';
|
|||
import '../statements/statement.dart';
|
||||
import '../statements/transaction.dart';
|
||||
import '../visitor.dart';
|
||||
import 'moor_file.dart';
|
||||
import 'drift_file.dart';
|
||||
|
||||
/// A declared statement inside a `.moor` file. It consists of an identifier,
|
||||
/// followed by a colon and the query to run.
|
||||
class DeclaredStatement extends Statement implements PartOfMoorFile {
|
||||
class DeclaredStatement extends Statement implements PartOfDriftFile {
|
||||
final DeclaredStatementIdentifier identifier;
|
||||
AstNode statement;
|
||||
List<StatementParameter> parameters;
|
||||
|
@ -29,7 +29,7 @@ class DeclaredStatement extends Statement implements PartOfMoorFile {
|
|||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -96,10 +96,10 @@ class SpecialStatementIdentifier extends DeclaredStatementIdentifier {
|
|||
/// identifier.
|
||||
/// In `selectString(:name AS TEXT): SELECT :name`, `:name AS TEXT` is a
|
||||
/// statement parameter.
|
||||
abstract class StatementParameter extends AstNode implements MoorSpecificNode {
|
||||
abstract class StatementParameter extends AstNode implements DriftSpecificNode {
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -154,7 +154,7 @@ class DartPlaceholderDefaultValue extends StatementParameter {
|
|||
}
|
||||
}
|
||||
|
||||
class TransactionBlock extends AstNode implements MoorSpecificNode {
|
||||
class TransactionBlock extends AstNode implements DriftSpecificNode {
|
||||
BeginTransactionStatement begin;
|
||||
List<CrudStatement> innerStatements;
|
||||
CommitStatement commit;
|
||||
|
@ -167,7 +167,7 @@ class TransactionBlock extends AstNode implements MoorSpecificNode {
|
|||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
|
||||
@override
|
|
@ -5,23 +5,23 @@ import 'declared_statement.dart';
|
|||
import 'import_statement.dart';
|
||||
|
||||
/// Marker interface for AST nodes that are moor-specific.
|
||||
abstract class MoorSpecificNode implements AstNode {}
|
||||
abstract class DriftSpecificNode implements AstNode {}
|
||||
|
||||
/// Something that can appear as a top-level declaration inside a `.moor` file.
|
||||
abstract class PartOfMoorFile implements Statement, MoorSpecificNode {}
|
||||
abstract class PartOfDriftFile implements Statement, DriftSpecificNode {}
|
||||
|
||||
/// A moor file.
|
||||
/// A parsed `.drift` file.
|
||||
///
|
||||
/// A moor file consists of [ImportStatement], followed by ddl statements,
|
||||
/// A drift file consists of [ImportStatement]s, followed by ddl statements,
|
||||
/// followed by [DeclaredStatement]s.
|
||||
class MoorFile extends AstNode implements MoorSpecificNode {
|
||||
List<PartOfMoorFile> statements;
|
||||
class DriftFile extends AstNode implements DriftSpecificNode {
|
||||
List<PartOfDriftFile> statements;
|
||||
|
||||
MoorFile(this.statements);
|
||||
DriftFile(this.statements);
|
||||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -37,15 +37,15 @@ class MoorFile extends AstNode implements MoorSpecificNode {
|
|||
childNodes.whereType<ImportStatement>();
|
||||
}
|
||||
|
||||
class MoorTableName extends AstNode implements MoorSpecificNode {
|
||||
class DriftTableName extends AstNode implements DriftSpecificNode {
|
||||
final String overriddenDataClassName;
|
||||
final bool useExistingDartClass;
|
||||
|
||||
MoorTableName(this.overriddenDataClassName, this.useExistingDartClass);
|
||||
DriftTableName(this.overriddenDataClassName, this.useExistingDartClass);
|
||||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
|
||||
@override
|
|
@ -2,10 +2,10 @@ import '../../reader/tokenizer/token.dart';
|
|||
import '../node.dart';
|
||||
import '../statements/statement.dart';
|
||||
import '../visitor.dart';
|
||||
import 'moor_file.dart';
|
||||
import 'drift_file.dart';
|
||||
|
||||
/// An `import "file.dart";` statement that can appear inside a moor file.
|
||||
class ImportStatement extends Statement implements PartOfMoorFile {
|
||||
class ImportStatement extends Statement implements PartOfDriftFile {
|
||||
Token? importToken;
|
||||
StringLiteralToken? importString;
|
||||
final String importedFile;
|
||||
|
@ -14,7 +14,7 @@ class ImportStatement extends Statement implements PartOfMoorFile {
|
|||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
|
||||
@override
|
|
@ -14,7 +14,7 @@ import '../ast.dart';
|
|||
/// moor.
|
||||
/// 4. A list of order-by clauses, which will be exposed as a `OrderBy` from
|
||||
/// moor.
|
||||
abstract class DartPlaceholder extends AstNode implements MoorSpecificNode {
|
||||
abstract class DartPlaceholder extends AstNode implements DriftSpecificNode {
|
||||
final String name;
|
||||
|
||||
DollarSignVariableToken? token;
|
||||
|
@ -29,7 +29,7 @@ abstract class DartPlaceholder extends AstNode implements MoorSpecificNode {
|
|||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
|
||||
T? when<T>({
|
|
@ -1,7 +1,7 @@
|
|||
import '../ast.dart' show ResultColumn, Renamable, SelectStatement;
|
||||
import '../node.dart';
|
||||
import '../visitor.dart';
|
||||
import 'moor_file.dart';
|
||||
import 'drift_file.dart';
|
||||
|
||||
/// To wrap the query name into its own type, to avoid conflicts when using
|
||||
/// the [AstNode] metadata.
|
||||
|
@ -18,7 +18,7 @@ class _NestedColumnNameMetadata {
|
|||
/// top level select query, because the result of them can only be computed
|
||||
/// in dart.
|
||||
class NestedQueryColumn extends ResultColumn
|
||||
implements MoorSpecificNode, Renamable {
|
||||
implements DriftSpecificNode, Renamable {
|
||||
@override
|
||||
final String? as;
|
||||
|
||||
|
@ -36,7 +36,7 @@ class NestedQueryColumn extends ResultColumn
|
|||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
|
||||
/// The unique name for this query. Used to identify it and it's variables in
|
|
@ -2,7 +2,7 @@ import '../../analysis/analysis.dart';
|
|||
import '../ast.dart' show StarResultColumn, ResultColumn, Renamable;
|
||||
import '../node.dart';
|
||||
import '../visitor.dart';
|
||||
import 'moor_file.dart';
|
||||
import 'drift_file.dart';
|
||||
|
||||
/// A nested star result column, denoted by `**` in user queries.
|
||||
///
|
||||
|
@ -10,7 +10,7 @@ import 'moor_file.dart';
|
|||
/// when the query is actually run. However, they will affect generated code
|
||||
/// when using moor.
|
||||
class NestedStarResultColumn extends ResultColumn
|
||||
implements MoorSpecificNode, Renamable {
|
||||
implements DriftSpecificNode, Renamable {
|
||||
final String tableName;
|
||||
ResultSet? resultSet;
|
||||
|
||||
|
@ -27,6 +27,6 @@ class NestedStarResultColumn extends ResultColumn
|
|||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
return visitor.visitMoorSpecificNode(this, arg);
|
||||
return visitor.visitDriftSpecificNode(this, arg);
|
||||
}
|
||||
}
|
|
@ -217,7 +217,7 @@ class GeneratedAs extends ColumnConstraint {
|
|||
}
|
||||
}
|
||||
|
||||
/// A `MAPPED BY` constraint, which is only parsed for moor files. It can be
|
||||
/// A `MAPPED BY` constraint, which is only parsed for drift files. It can be
|
||||
/// used to declare a type converter for this column.
|
||||
class MappedBy extends ColumnConstraint {
|
||||
/// The Dart expression creating the type converter we use to map this token.
|
||||
|
@ -232,7 +232,7 @@ class MappedBy extends ColumnConstraint {
|
|||
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
||||
}
|
||||
|
||||
/// A `JSON KEY xyz` constraint, which is only parsed for moor files.
|
||||
/// A `JSON KEY xyz` constraint, which is only parsed for drift files.
|
||||
class JsonKey extends ColumnConstraint {
|
||||
Token? json;
|
||||
Token? key;
|
||||
|
@ -249,8 +249,8 @@ class JsonKey extends ColumnConstraint {
|
|||
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
||||
}
|
||||
|
||||
/// A `AS xyz` constraint, which is only parsed for moor files.
|
||||
class MoorDartName extends ColumnConstraint {
|
||||
/// A `AS xyz` constraint, which is only parsed for drift files.
|
||||
class DriftDartName extends ColumnConstraint {
|
||||
Token? as;
|
||||
IdentifierToken identifier;
|
||||
|
||||
|
@ -259,7 +259,7 @@ class MoorDartName extends ColumnConstraint {
|
|||
|
||||
String get dartName => identifier.identifier;
|
||||
|
||||
MoorDartName(String? name, this.identifier) : super(name);
|
||||
DriftDartName(String? name, this.identifier) : super(name);
|
||||
|
||||
@override
|
||||
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
||||
|
|
|
@ -8,15 +8,15 @@ abstract class TableInducingStatement extends Statement
|
|||
final bool ifNotExists;
|
||||
final String tableName;
|
||||
|
||||
/// Moor-specific information about the desired name of a Dart class for this
|
||||
/// Drift-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;
|
||||
/// This will always be `null` when drift extensions are not enabled.
|
||||
DriftTableName? driftTableName;
|
||||
Token? tableNameToken;
|
||||
|
||||
TableInducingStatement._(this.ifNotExists, this.tableName,
|
||||
[this.moorTableName]);
|
||||
[this.driftTableName]);
|
||||
|
||||
@override
|
||||
String get createdName => tableName;
|
||||
|
@ -48,8 +48,8 @@ class CreateTableStatement extends TableInducingStatement {
|
|||
this.tableConstraints = const [],
|
||||
this.withoutRowId = false,
|
||||
this.isStrict = false,
|
||||
MoorTableName? moorTableName,
|
||||
}) : super._(ifNotExists, tableName, moorTableName);
|
||||
DriftTableName? driftTableName,
|
||||
}) : super._(ifNotExists, tableName, driftTableName);
|
||||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
|
@ -61,15 +61,15 @@ class CreateTableStatement extends TableInducingStatement {
|
|||
columns = transformer.transformChildren(columns, this, arg);
|
||||
tableConstraints =
|
||||
transformer.transformChildren(tableConstraints, this, arg);
|
||||
moorTableName =
|
||||
transformer.transformNullableChild(moorTableName, this, arg);
|
||||
driftTableName =
|
||||
transformer.transformNullableChild(driftTableName, this, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
Iterable<AstNode> get childNodes => [
|
||||
...columns,
|
||||
...tableConstraints,
|
||||
if (moorTableName != null) moorTableName!,
|
||||
if (driftTableName != null) driftTableName!,
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -93,8 +93,8 @@ class CreateVirtualTableStatement extends TableInducingStatement {
|
|||
required String tableName,
|
||||
required this.moduleName,
|
||||
this.arguments = const [],
|
||||
MoorTableName? moorTableName,
|
||||
}) : super._(ifNotExists, tableName, moorTableName);
|
||||
DriftTableName? driftTableName,
|
||||
}) : super._(ifNotExists, tableName, driftTableName);
|
||||
|
||||
@override
|
||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||
|
@ -103,11 +103,11 @@ class CreateVirtualTableStatement extends TableInducingStatement {
|
|||
|
||||
@override
|
||||
void transformChildren<A>(Transformer<A> transformer, A arg) {
|
||||
moorTableName =
|
||||
transformer.transformNullableChild(moorTableName, this, arg);
|
||||
driftTableName =
|
||||
transformer.transformNullableChild(driftTableName, this, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
Iterable<AstNode> get childNodes =>
|
||||
[if (moorTableName != null) moorTableName!];
|
||||
[if (driftTableName != null) driftTableName!];
|
||||
}
|
||||
|
|
|
@ -12,18 +12,18 @@ class CreateViewStatement extends Statement implements CreatingStatement {
|
|||
|
||||
final List<String>? columns;
|
||||
|
||||
/// Moor-specific information about the desired name of a Dart class for this
|
||||
/// Drift-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;
|
||||
/// This will always be `null` when drift extensions are not enabled.
|
||||
DriftTableName? driftTableName;
|
||||
|
||||
CreateViewStatement({
|
||||
this.ifNotExists = false,
|
||||
required this.viewName,
|
||||
this.columns,
|
||||
required this.query,
|
||||
this.moorTableName,
|
||||
this.driftTableName,
|
||||
});
|
||||
|
||||
@override
|
||||
|
@ -37,11 +37,11 @@ class CreateViewStatement extends Statement implements CreatingStatement {
|
|||
@override
|
||||
void transformChildren<A>(Transformer<A> transformer, A arg) {
|
||||
query = transformer.transformChild(query, this, arg);
|
||||
moorTableName =
|
||||
transformer.transformNullableChild(moorTableName, this, arg);
|
||||
driftTableName =
|
||||
transformer.transformNullableChild(driftTableName, this, arg);
|
||||
}
|
||||
|
||||
@override
|
||||
Iterable<AstNode> get childNodes =>
|
||||
[query, if (moorTableName != null) moorTableName!];
|
||||
[query, if (driftTableName != null) driftTableName!];
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ abstract class StatementReturningColumns extends Statement {
|
|||
}
|
||||
|
||||
/// Marker interface for statements that change the table structure.
|
||||
abstract class SchemaStatement extends Statement implements PartOfMoorFile {}
|
||||
abstract class SchemaStatement extends Statement implements PartOfDriftFile {}
|
||||
|
||||
/// Marker interface for schema statements that create a schematic entity.
|
||||
abstract class CreatingStatement extends SchemaStatement {
|
||||
|
|
|
@ -93,7 +93,7 @@ abstract class AstVisitor<A, R> {
|
|||
R visitBeginTransaction(BeginTransactionStatement e, A arg);
|
||||
R visitCommitStatement(CommitStatement e, A arg);
|
||||
|
||||
R visitMoorSpecificNode(MoorSpecificNode e, A arg);
|
||||
R visitDriftSpecificNode(DriftSpecificNode e, A arg);
|
||||
}
|
||||
|
||||
/// Visitor that walks down the entire tree, visiting all children in order.
|
||||
|
@ -388,7 +388,7 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R?> {
|
|||
}
|
||||
|
||||
@override
|
||||
R? visitMoorSpecificNode(MoorSpecificNode e, A arg) {
|
||||
R? visitDriftSpecificNode(DriftSpecificNode e, A arg) {
|
||||
return defaultNode(e, arg);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,10 +2,10 @@ import 'package:meta/meta.dart';
|
|||
import 'package:sqlparser/sqlparser.dart';
|
||||
|
||||
class EngineOptions {
|
||||
/// Moor extends the sql grammar a bit to support type converters and other
|
||||
/// Drift extends the sql grammar a bit to support type converters and other
|
||||
/// features. Enabling this flag will make this engine parse sql with these
|
||||
/// extensions enabled.
|
||||
final bool useMoorExtensions;
|
||||
final bool useDriftExtensions;
|
||||
|
||||
/// The target sqlite version.
|
||||
///
|
||||
|
@ -27,7 +27,7 @@ class EngineOptions {
|
|||
final Map<String, TableValuedFunctionHandler> addedTableFunctions = {};
|
||||
|
||||
EngineOptions({
|
||||
this.useMoorExtensions = false,
|
||||
this.useDriftExtensions = false,
|
||||
List<Extension> enabledExtensions = const [],
|
||||
this.version = SqliteVersion.minimum,
|
||||
}) : enabledExtensions = _allExtensions(enabledExtensions, version) {
|
||||
|
|
|
@ -35,7 +35,7 @@ class SqlEngine {
|
|||
/// [TableInducingStatement] by using [SchemaFromCreateTable.read].
|
||||
SchemaFromCreateTable get schemaReader {
|
||||
return _schemaReader ??=
|
||||
SchemaFromCreateTable(moorExtensions: options.useMoorExtensions);
|
||||
SchemaFromCreateTable(driftExtensions: options.useDriftExtensions);
|
||||
}
|
||||
|
||||
/// Registers the [table], which means that it can later be used in sql
|
||||
|
@ -96,7 +96,8 @@ class SqlEngine {
|
|||
/// you need to filter them. When using the methods in this class, this will
|
||||
/// be taken care of automatically.
|
||||
List<Token> tokenize(String source) {
|
||||
final scanner = Scanner(source, scanMoorTokens: options.useMoorExtensions);
|
||||
final scanner =
|
||||
Scanner(source, scanDriftTokens: options.useDriftExtensions);
|
||||
final tokens = scanner.scanTokens();
|
||||
|
||||
return tokens;
|
||||
|
@ -106,29 +107,30 @@ class SqlEngine {
|
|||
ParseResult parse(String sql) {
|
||||
final tokens = tokenize(sql);
|
||||
final tokensForParser = tokens.where((t) => !t.invisibleToParser).toList();
|
||||
final parser = Parser(tokensForParser, useMoor: options.useMoorExtensions);
|
||||
final parser =
|
||||
Parser(tokensForParser, useDrift: options.useDriftExtensions);
|
||||
|
||||
final stmt = parser.safeStatement();
|
||||
return ParseResult._(stmt, tokens, parser.errors, sql, null);
|
||||
}
|
||||
|
||||
/// Parses a `.moor` file, which can consist of multiple statements and
|
||||
/// Parses a `.drift` file, which can consist of multiple statements and
|
||||
/// additional components like import statements.
|
||||
ParseResult parseMoorFile(String content) {
|
||||
assert(options.useMoorExtensions);
|
||||
ParseResult parseDriftFile(String content) {
|
||||
assert(options.useDriftExtensions);
|
||||
|
||||
final tokens = tokenize(content);
|
||||
final autoComplete = AutoCompleteEngine(tokens, this);
|
||||
|
||||
final tokensForParser = tokens.where((t) => !t.invisibleToParser).toList();
|
||||
final parser =
|
||||
Parser(tokensForParser, useMoor: true, autoComplete: autoComplete);
|
||||
Parser(tokensForParser, useDrift: true, autoComplete: autoComplete);
|
||||
|
||||
final moorFile = parser.moorFile();
|
||||
_attachRootScope(moorFile);
|
||||
final driftFile = parser.driftFile();
|
||||
_attachRootScope(driftFile);
|
||||
|
||||
return ParseResult._(
|
||||
moorFile, tokens, parser.errors, content, autoComplete);
|
||||
driftFile, tokens, parser.errors, content, autoComplete);
|
||||
}
|
||||
|
||||
/// Parses and analyzes the [sql] statement. The [AnalysisContext] returned
|
||||
|
|
|
@ -33,16 +33,16 @@ class Parser {
|
|||
final List<ParsingError> errors = [];
|
||||
final AutoCompleteEngine? autoComplete;
|
||||
|
||||
// todo remove this and don't be that lazy in moorFile()
|
||||
// todo remove this and don't be that lazy in driftFile()
|
||||
var _lastStmtHadParsingError = false;
|
||||
|
||||
/// Whether to enable the extensions moor makes to the sql grammar.
|
||||
final bool enableMoorExtensions;
|
||||
/// Whether to enable the extensions drift makes to the sql grammar.
|
||||
final bool enableDriftExtensions;
|
||||
|
||||
int _current = 0;
|
||||
|
||||
Parser(this.tokens, {bool useMoor = false, this.autoComplete})
|
||||
: enableMoorExtensions = useMoor;
|
||||
Parser(this.tokens, {bool useDrift = false, this.autoComplete})
|
||||
: enableDriftExtensions = useDrift;
|
||||
|
||||
bool get _reportAutoComplete => autoComplete != null;
|
||||
|
||||
|
@ -206,7 +206,7 @@ class Parser {
|
|||
return _commit();
|
||||
}
|
||||
|
||||
if (enableMoorExtensions) {
|
||||
if (enableDriftExtensions) {
|
||||
if (_check(TokenType.import)) {
|
||||
return _import()!;
|
||||
}
|
||||
|
@ -232,9 +232,9 @@ class Parser {
|
|||
return stmt..setSpan(first, _previous);
|
||||
}
|
||||
|
||||
MoorFile moorFile() {
|
||||
DriftFile driftFile() {
|
||||
final first = _peek;
|
||||
final foundComponents = <PartOfMoorFile?>[];
|
||||
final foundComponents = <PartOfDriftFile?>[];
|
||||
|
||||
// (we try again if the last statement had a parsing error)
|
||||
|
||||
|
@ -265,7 +265,7 @@ class Parser {
|
|||
|
||||
foundComponents.removeWhere((c) => c == null);
|
||||
|
||||
final file = MoorFile(foundComponents.cast());
|
||||
final file = DriftFile(foundComponents.cast());
|
||||
if (foundComponents.isNotEmpty) {
|
||||
file.setSpan(first, _previous);
|
||||
} else {
|
||||
|
@ -798,7 +798,7 @@ class Parser {
|
|||
..setSpan(left, _previous);
|
||||
}
|
||||
} else if (_matchOne(TokenType.dollarSignVariable)) {
|
||||
if (enableMoorExtensions) {
|
||||
if (enableDriftExtensions) {
|
||||
final typedToken = _previous as DollarSignVariableToken;
|
||||
return DartExpressionPlaceholder(name: typedToken.name)
|
||||
..token = typedToken
|
||||
|
@ -1708,7 +1708,7 @@ class Parser {
|
|||
final first = _previous;
|
||||
_consume(TokenType.$values, 'Expected DEFAULT VALUES');
|
||||
return DefaultValues()..setSpan(first, _previous);
|
||||
} else if (enableMoorExtensions &&
|
||||
} else if (enableDriftExtensions &&
|
||||
_matchOne(TokenType.dollarSignVariable)) {
|
||||
final token = _previous as DollarSignVariableToken;
|
||||
return DartInsertablePlaceholder(name: token.name)
|
||||
|
@ -1921,7 +1921,7 @@ class Parser {
|
|||
if (_matchOne(TokenType.star)) {
|
||||
return StarResultColumn(identifier.identifier)
|
||||
..setSpan(identifier, _previous);
|
||||
} else if (enableMoorExtensions && _matchOne(TokenType.doubleStar)) {
|
||||
} else if (enableDriftExtensions && _matchOne(TokenType.doubleStar)) {
|
||||
final as = _as();
|
||||
|
||||
return NestedStarResultColumn(
|
||||
|
@ -1938,7 +1938,7 @@ class Parser {
|
|||
}
|
||||
|
||||
// parsing for the nested query column
|
||||
if (enableMoorExtensions && _matchOne(TokenType.list)) {
|
||||
if (enableDriftExtensions && _matchOne(TokenType.list)) {
|
||||
final list = _previous;
|
||||
|
||||
_consume(
|
||||
|
@ -2080,7 +2080,7 @@ class Parser {
|
|||
}
|
||||
}
|
||||
|
||||
final overriddenName = _moorTableName();
|
||||
final overriddenName = _driftTableName();
|
||||
|
||||
return CreateTableStatement(
|
||||
ifNotExists: ifNotExists,
|
||||
|
@ -2089,7 +2089,7 @@ class Parser {
|
|||
columns: columns,
|
||||
tableConstraints: tableConstraints,
|
||||
isStrict: isStrict,
|
||||
moorTableName: overriddenName,
|
||||
driftTableName: overriddenName,
|
||||
)
|
||||
..setSpan(first, _previous)
|
||||
..openingBracket = leftParen
|
||||
|
@ -2155,30 +2155,30 @@ class Parser {
|
|||
}
|
||||
}
|
||||
|
||||
final moorDataClassName = _moorTableName();
|
||||
final driftTableName = _driftTableName();
|
||||
return CreateVirtualTableStatement(
|
||||
ifNotExists: ifNotExists,
|
||||
tableName: nameToken.identifier,
|
||||
moduleName: moduleName.identifier,
|
||||
arguments: args,
|
||||
moorTableName: moorDataClassName,
|
||||
driftTableName: driftTableName,
|
||||
)
|
||||
..setSpan(first, _previous)
|
||||
..tableNameToken = nameToken
|
||||
..moduleNameToken = moduleName;
|
||||
}
|
||||
|
||||
MoorTableName? _moorTableName([bool supportAs = true]) {
|
||||
DriftTableName? _driftTableName({bool supportAs = true}) {
|
||||
final types =
|
||||
supportAs ? const [TokenType.as, TokenType.$with] : [TokenType.$with];
|
||||
|
||||
if (enableMoorExtensions && (_match(types))) {
|
||||
if (enableDriftExtensions && (_match(types))) {
|
||||
final first = _previous;
|
||||
final useExisting = _previous.type == TokenType.$with;
|
||||
final name =
|
||||
_consumeIdentifier('Expected the name for the data class').identifier;
|
||||
|
||||
return MoorTableName(name, useExisting)..setSpan(first, _previous);
|
||||
return DriftTableName(name, useExisting)..setSpan(first, _previous);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -2279,7 +2279,7 @@ class Parser {
|
|||
|
||||
// Don't allow the "AS ClassName" syntax for views since it causes an
|
||||
// ambiguity with the regular view syntax.
|
||||
final moorTableName = _moorTableName(false);
|
||||
final driftTableName = _driftTableName(supportAs: false);
|
||||
|
||||
List<String>? columnNames;
|
||||
if (_matchOne(TokenType.leftParen)) {
|
||||
|
@ -2299,7 +2299,7 @@ class Parser {
|
|||
viewName: name.identifier,
|
||||
columns: columnNames,
|
||||
query: query,
|
||||
moorTableName: moorTableName,
|
||||
driftTableName: driftTableName,
|
||||
)
|
||||
..viewNameToken = name
|
||||
..setSpan(create, _previous);
|
||||
|
@ -2525,7 +2525,7 @@ class Parser {
|
|||
..setSpan(first, _previous);
|
||||
}
|
||||
|
||||
if (enableMoorExtensions && _matchOne(TokenType.mapped)) {
|
||||
if (enableDriftExtensions && _matchOne(TokenType.mapped)) {
|
||||
_consume(TokenType.by, 'Expected a MAPPED BY constraint');
|
||||
|
||||
final dartExpr = _consume(
|
||||
|
@ -2534,7 +2534,7 @@ class Parser {
|
|||
return MappedBy(resolvedName, dartExpr as InlineDartToken)
|
||||
..setSpan(first, _previous);
|
||||
}
|
||||
if (enableMoorExtensions && _matchOne(TokenType.json)) {
|
||||
if (enableDriftExtensions && _matchOne(TokenType.json)) {
|
||||
final jsonToken = _previous;
|
||||
final keyToken =
|
||||
_consume(TokenType.key, 'Expected a JSON KEY constraint');
|
||||
|
@ -2545,11 +2545,11 @@ class Parser {
|
|||
..json = jsonToken
|
||||
..key = keyToken;
|
||||
}
|
||||
if (enableMoorExtensions && _matchOne(TokenType.as)) {
|
||||
if (enableDriftExtensions && _matchOne(TokenType.as)) {
|
||||
final asToken = _previous;
|
||||
final nameToken = _consumeIdentifier('Expected Dart getter name');
|
||||
|
||||
return MoorDartName(resolvedName, nameToken)
|
||||
return DriftDartName(resolvedName, nameToken)
|
||||
..setSpan(first, _previous)
|
||||
..as = asToken;
|
||||
}
|
||||
|
|
|
@ -10,8 +10,8 @@ class Scanner {
|
|||
final String source;
|
||||
final Uint16List _charCodes;
|
||||
|
||||
/// Whether to scan tokens that are only relevant for moor.
|
||||
final bool scanMoorTokens;
|
||||
/// Whether to scan tokens that are only relevant for drift files.
|
||||
final bool scanDriftTokens;
|
||||
final SourceFile _file;
|
||||
|
||||
final List<Token> tokens = [];
|
||||
|
@ -29,7 +29,7 @@ class Scanner {
|
|||
return _file.location(_currentOffset);
|
||||
}
|
||||
|
||||
Scanner(this.source, {this.scanMoorTokens = false})
|
||||
Scanner(this.source, {this.scanDriftTokens = false})
|
||||
: _file = SourceFile.fromString(source),
|
||||
_charCodes = Uint16List.fromList(source.codeUnits);
|
||||
|
||||
|
@ -87,7 +87,7 @@ class Scanner {
|
|||
}
|
||||
break;
|
||||
case $asterisk:
|
||||
if (scanMoorTokens && _match($asterisk)) {
|
||||
if (scanDriftTokens && _match($asterisk)) {
|
||||
_addToken(TokenType.doubleStar);
|
||||
} else {
|
||||
_addToken(TokenType.star);
|
||||
|
@ -190,7 +190,7 @@ class Scanner {
|
|||
_identifier(escapeChar: $double_quote);
|
||||
break;
|
||||
case $backquote:
|
||||
if (scanMoorTokens) {
|
||||
if (scanDriftTokens) {
|
||||
_inlineDart();
|
||||
} else {
|
||||
_identifier(escapeChar: $backquote);
|
||||
|
@ -412,8 +412,8 @@ class Scanner {
|
|||
final text = _currentSpan.text.toUpperCase();
|
||||
if (keywords.containsKey(text)) {
|
||||
tokens.add(KeywordToken(keywords[text]!, _currentSpan));
|
||||
} else if (scanMoorTokens && moorKeywords.containsKey(text)) {
|
||||
tokens.add(KeywordToken(moorKeywords[text]!, _currentSpan));
|
||||
} else if (scanDriftTokens && driftKeywords.containsKey(text)) {
|
||||
tokens.add(KeywordToken(driftKeywords[text]!, _currentSpan));
|
||||
} else {
|
||||
tokens.add(IdentifierToken(false, _currentSpan));
|
||||
}
|
||||
|
|
|
@ -218,7 +218,7 @@ enum TokenType {
|
|||
window,
|
||||
without,
|
||||
|
||||
/// Moor specific token, used to declare type converter
|
||||
/// Drift specific token, used to declare type converter
|
||||
mapped,
|
||||
inlineDart,
|
||||
import,
|
||||
|
@ -226,7 +226,7 @@ enum TokenType {
|
|||
required,
|
||||
list,
|
||||
|
||||
/// A `**` token. This is only scanned when scanning for moor tokens.
|
||||
/// A `**` token. This is only scanned when scanning for drift tokens.
|
||||
doubleStar,
|
||||
}
|
||||
|
||||
|
@ -412,10 +412,10 @@ const Map<String, TokenType> postgresKeywords = {
|
|||
/// Maps [TokenType]s which are keywords to their lexeme.
|
||||
final Map<TokenType, String> reverseKeywords = {
|
||||
for (var entry in keywords.entries) entry.value: entry.key,
|
||||
for (var entry in moorKeywords.entries) entry.value: entry.key,
|
||||
for (var entry in driftKeywords.entries) entry.value: entry.key,
|
||||
};
|
||||
|
||||
const Map<String, TokenType> moorKeywords = {
|
||||
const Map<String, TokenType> driftKeywords = {
|
||||
'IMPORT': TokenType.import,
|
||||
'JSON': TokenType.json,
|
||||
'MAPPED': TokenType.mapped,
|
||||
|
@ -539,8 +539,8 @@ class AtSignVariableToken extends Token {
|
|||
: super(TokenType.atSignVariable, span);
|
||||
}
|
||||
|
||||
/// Inline Dart appearing in a create table statement. Only parsed when the moor
|
||||
/// extensions are enabled. Dart code is wrapped in backticks.
|
||||
/// Inline Dart appearing in a create table statement. Only parsed when the
|
||||
/// drift extensions are enabled. Dart code is wrapped in backticks.
|
||||
class InlineDartToken extends Token {
|
||||
InlineDartToken(FileSpan span) : super(TokenType.inlineDart, span);
|
||||
|
||||
|
@ -562,7 +562,7 @@ class KeywordToken extends Token {
|
|||
bool canConvertToIdentifier() {
|
||||
// https://stackoverflow.com/a/45775719, but we don't parse indexed yet.
|
||||
return _identifierKeywords.contains(type) ||
|
||||
moorKeywords.values.contains(type);
|
||||
driftKeywords.values.contains(type);
|
||||
}
|
||||
|
||||
IdentifierToken convertToIdentifier() {
|
||||
|
|
|
@ -419,58 +419,58 @@ class EqualityEnforcingVisitor implements AstVisitor<void, void> {
|
|||
_checkChildren(e);
|
||||
}
|
||||
|
||||
void visitMoorDeclaredStatement(DeclaredStatement e, void arg) {
|
||||
void visitDriftDeclaredStatement(DeclaredStatement e, void arg) {
|
||||
final current = _currentAs<DeclaredStatement>(e);
|
||||
_assert(current.identifier == e.identifier && current.as == e.as, e);
|
||||
_checkChildren(e);
|
||||
}
|
||||
|
||||
void visitMoorFile(MoorFile e, void arg) {
|
||||
_currentAs<MoorFile>(e);
|
||||
void visitDriftFile(DriftFile e, void arg) {
|
||||
_currentAs<DriftFile>(e);
|
||||
_checkChildren(e);
|
||||
}
|
||||
|
||||
void visitMoorImportStatement(ImportStatement e, void arg) {
|
||||
void visitDriftImportStatement(ImportStatement e, void arg) {
|
||||
final current = _currentAs<ImportStatement>(e);
|
||||
_assert(current.importedFile == e.importedFile, e);
|
||||
_checkChildren(e);
|
||||
}
|
||||
|
||||
void visitMoorNestedStarResultColumn(NestedStarResultColumn e, void arg) {
|
||||
void visitDriftNestedStarResultColumn(NestedStarResultColumn e, void arg) {
|
||||
final current = _currentAs<NestedStarResultColumn>(e);
|
||||
_assert(current.tableName == e.tableName, e);
|
||||
_assert(current.as == e.as, e);
|
||||
_checkChildren(e);
|
||||
}
|
||||
|
||||
void visitMoorNestedQueryColumn(NestedQueryColumn e, void arg) {
|
||||
void visitDriftNestedQueryColumn(NestedQueryColumn e, void arg) {
|
||||
final current = _currentAs<NestedQueryColumn>(e);
|
||||
_assert(current.as == e.as, e);
|
||||
_checkChildren(e);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is DartPlaceholder) {
|
||||
return visitDartPlaceholder(e, arg);
|
||||
} else if (e is DeclaredStatement) {
|
||||
return visitMoorDeclaredStatement(e, arg);
|
||||
} else if (e is MoorFile) {
|
||||
return visitMoorFile(e, arg);
|
||||
return visitDriftDeclaredStatement(e, arg);
|
||||
} else if (e is DriftFile) {
|
||||
return visitDriftFile(e, arg);
|
||||
} else if (e is ImportStatement) {
|
||||
return visitMoorImportStatement(e, arg);
|
||||
return visitDriftImportStatement(e, arg);
|
||||
} else if (e is NestedStarResultColumn) {
|
||||
return visitMoorNestedStarResultColumn(e, arg);
|
||||
return visitDriftNestedStarResultColumn(e, arg);
|
||||
} else if (e is StatementParameter) {
|
||||
return visitMoorStatementParameter(e, arg);
|
||||
} else if (e is MoorTableName) {
|
||||
return visitMoorTableName(e, arg);
|
||||
return visitDriftStatementParameter(e, arg);
|
||||
} else if (e is DriftTableName) {
|
||||
return visitDriftTableName(e, arg);
|
||||
} else if (e is NestedQueryColumn) {
|
||||
return visitMoorNestedQueryColumn(e, arg);
|
||||
return visitDriftNestedQueryColumn(e, arg);
|
||||
}
|
||||
}
|
||||
|
||||
void visitMoorStatementParameter(StatementParameter e, void arg) {
|
||||
void visitDriftStatementParameter(StatementParameter e, void arg) {
|
||||
if (e is VariableTypeHint) {
|
||||
final current = _currentAs<VariableTypeHint>(e);
|
||||
_assert(
|
||||
|
@ -486,8 +486,8 @@ class EqualityEnforcingVisitor implements AstVisitor<void, void> {
|
|||
_checkChildren(e);
|
||||
}
|
||||
|
||||
void visitMoorTableName(MoorTableName e, void arg) {
|
||||
final current = _currentAs<MoorTableName>(e);
|
||||
void visitDriftTableName(DriftTableName e, void arg) {
|
||||
final current = _currentAs<DriftTableName>(e);
|
||||
_assert(
|
||||
current.overriddenDataClassName == e.overriddenDataClassName &&
|
||||
current.useExistingDartClass == e.useExistingDartClass,
|
||||
|
|
|
@ -408,7 +408,7 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
|
|||
}
|
||||
|
||||
@override
|
||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
||||
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||
if (e is DartPlaceholder) {
|
||||
symbol(r'$', spaceBefore: true);
|
||||
symbol(e.name, spaceAfter: true);
|
||||
|
@ -429,7 +429,7 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
|
|||
symbol(':', spaceAfter: true);
|
||||
visit(e.statement, arg);
|
||||
symbol(';');
|
||||
} else if (e is MoorFile) {
|
||||
} else if (e is DriftFile) {
|
||||
for (final stmt in e.statements) {
|
||||
visit(stmt, arg);
|
||||
buffer.write('\n');
|
||||
|
@ -461,7 +461,7 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
|
|||
} else {
|
||||
throw AssertionError('Unknown StatementParameter: $e');
|
||||
}
|
||||
} else if (e is MoorTableName) {
|
||||
} else if (e is DriftTableName) {
|
||||
_keyword(e.useExistingDartClass ? TokenType.$with : TokenType.as);
|
||||
identifier(e.overriddenDataClassName);
|
||||
} else if (e is NestedStarResultColumn) {
|
||||
|
|
|
@ -26,7 +26,7 @@ void main() {
|
|||
});
|
||||
|
||||
test('does not register the same result set multiple times', () {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
..registerTableFromSql('''
|
||||
CREATE TABLE with_defaults (
|
||||
a TEXT DEFAULT 'something',
|
||||
|
|
|
@ -7,7 +7,7 @@ void main() {
|
|||
final oldEngine = SqlEngine(EngineOptions(version: SqliteVersion.v3_35));
|
||||
final engine = SqlEngine(EngineOptions(version: SqliteVersion.v3_37));
|
||||
final engineInDriftMode = SqlEngine(
|
||||
EngineOptions(version: SqliteVersion.v3_37, useMoorExtensions: true));
|
||||
EngineOptions(version: SqliteVersion.v3_37, useDriftExtensions: true));
|
||||
|
||||
group('using STRICT', () {
|
||||
test('with an old sqlite3 version', () {
|
||||
|
|
|
@ -61,8 +61,8 @@ void main() {
|
|||
);
|
||||
});
|
||||
|
||||
test("resolved columns don't include moor nested results", () {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
test("resolved columns don't include drift nested results", () {
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
..registerTable(demoTable);
|
||||
|
||||
final context = engine.analyze('SELECT demo.** FROM demo;');
|
||||
|
@ -95,7 +95,7 @@ void main() {
|
|||
});
|
||||
|
||||
test('resolves columns from nested results', () {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
..registerTable(demoTable)
|
||||
..registerTable(anotherTable);
|
||||
|
||||
|
@ -113,7 +113,7 @@ void main() {
|
|||
});
|
||||
|
||||
test('resolves columns in nested queries', () {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
..registerTable(demoTable);
|
||||
|
||||
final context =
|
||||
|
|
|
@ -35,7 +35,7 @@ void main() {
|
|||
|
||||
test('regression test for #1188', () {
|
||||
// Test for https://github.com/simolus3/moor/issues/1188
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
..registerTableFromSql('''
|
||||
CREATE TABLE IF NOT EXISTS "employees" (
|
||||
"id" INTEGER NOT NULL PRIMARY KEY,
|
||||
|
@ -85,7 +85,7 @@ void main() {
|
|||
|
||||
test('regression test for #1234', () {
|
||||
// https://github.com/simolus3/moor/issues/1234#issuecomment-853270925
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
..registerTableFromSql('''
|
||||
CREATE TABLE inboxes (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
|
@ -117,7 +117,7 @@ void main() {
|
|||
test('regression test for #1096', () {
|
||||
// https://github.com/simolus3/moor/issues/1096#issuecomment-931378474
|
||||
final engine = SqlEngine(
|
||||
EngineOptions(useMoorExtensions: true, version: SqliteVersion.v3_35))
|
||||
EngineOptions(useDriftExtensions: true, version: SqliteVersion.v3_35))
|
||||
..registerTableFromSql('''
|
||||
CREATE TABLE downloads (
|
||||
id INT NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
|
|
|
@ -86,15 +86,15 @@ void main() {
|
|||
);
|
||||
});
|
||||
|
||||
test('supports booleans when moor extensions are enabled', () {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
test('supports booleans when drift extensions are enabled', () {
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
final stmt = engine.parse('''
|
||||
CREATE TABLE foo (
|
||||
a BOOL, b DATETIME, c DATE, d BOOLEAN NOT NULL
|
||||
)
|
||||
''').rootNode;
|
||||
|
||||
final table = const SchemaFromCreateTable(moorExtensions: true)
|
||||
final table = const SchemaFromCreateTable(driftExtensions: true)
|
||||
.read(stmt as CreateTableStatement);
|
||||
expect(table.resolvedColumns.map((c) => c.type), const [
|
||||
ResolvedType(type: BasicType.int, hint: IsBoolean(), nullable: true),
|
||||
|
|
|
@ -5,7 +5,7 @@ import 'package:test/test.dart';
|
|||
import '../data.dart';
|
||||
|
||||
void main() {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
..registerTable(demoTable)
|
||||
..registerTable(anotherTable);
|
||||
|
||||
|
|
|
@ -35,8 +35,8 @@ void main() {
|
|||
});
|
||||
}
|
||||
|
||||
ComputedSuggestions _compute(String moorFile) {
|
||||
return completionsFor(moorFile, setup: _setupEngine);
|
||||
ComputedSuggestions _compute(String driftFile) {
|
||||
return completionsFor(driftFile, setup: _setupEngine);
|
||||
}
|
||||
|
||||
void _setupEngine(SqlEngine engine) {
|
||||
|
|
|
@ -2,15 +2,15 @@ import 'package:sqlparser/sqlparser.dart';
|
|||
import 'package:sqlparser/src/engine/autocomplete/engine.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
/// Parses the [moorFile] and computes available autocomplete suggestions at
|
||||
/// Parses the [driftFile] and computes available autocomplete suggestions at
|
||||
/// the position of a `^` character in the source.
|
||||
ComputedSuggestions completionsFor(String moorFile,
|
||||
ComputedSuggestions completionsFor(String driftFile,
|
||||
{void Function(SqlEngine)? setup}) {
|
||||
final position = moorFile.indexOf('^');
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final position = driftFile.indexOf('^');
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
setup?.call(engine);
|
||||
|
||||
final result = engine.parseMoorFile(moorFile.replaceFirst('^', ''));
|
||||
final result = engine.parseDriftFile(driftFile.replaceFirst('^', ''));
|
||||
return result.autoCompleteEngine!.suggestCompletions(position - 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -181,7 +181,7 @@ void main() {
|
|||
);
|
||||
});
|
||||
|
||||
test('parses MAPPED BY constraints when in moor mode', () {
|
||||
test('parses MAPPED BY constraints when in drift mode', () {
|
||||
testStatement(
|
||||
'CREATE TABLE a (b NOT NULL MAPPED BY `Mapper()` PRIMARY KEY)',
|
||||
CreateTableStatement(tableName: 'a', columns: [
|
||||
|
@ -195,11 +195,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
]),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
test('parses JSON KEY constraints in moor mode', () {
|
||||
test('parses JSON KEY constraints in drift mode', () {
|
||||
testStatement(
|
||||
'CREATE TABLE a (b INTEGER JSON KEY "my_json_key")',
|
||||
CreateTableStatement(
|
||||
|
@ -217,11 +217,11 @@ void main() {
|
|||
),
|
||||
],
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
test('parses CREATE TABLE WITH in moor more', () {
|
||||
test('parses CREATE TABLE WITH in drift more', () {
|
||||
testStatement(
|
||||
'CREATE TABLE a (b INTEGER) WITH MyExistingClass',
|
||||
CreateTableStatement(
|
||||
|
@ -232,15 +232,15 @@ void main() {
|
|||
typeName: 'INTEGER',
|
||||
),
|
||||
],
|
||||
moorTableName: MoorTableName('MyExistingClass', true),
|
||||
driftTableName: DriftTableName('MyExistingClass', true),
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
test('parses CREATE VIRTUAL TABLE statement', () {
|
||||
testStatement(
|
||||
'CREATE VIRTUAL TABLE IF NOT EXISTS foo USING bar(a, b(), c) AS moor',
|
||||
'CREATE VIRTUAL TABLE IF NOT EXISTS foo USING bar(a, b(), c) AS drift',
|
||||
CreateVirtualTableStatement(
|
||||
ifNotExists: true,
|
||||
tableName: 'foo',
|
||||
|
@ -250,9 +250,9 @@ void main() {
|
|||
fakeSpan('b()'),
|
||||
fakeSpan('c'),
|
||||
],
|
||||
moorTableName: MoorTableName('moor', false),
|
||||
driftTableName: DriftTableName('drift', false),
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
@ -29,9 +29,9 @@ void main() {
|
|||
),
|
||||
],
|
||||
),
|
||||
moorTableName: MoorTableName('ExistingDartClass', true),
|
||||
driftTableName: DriftTableName('ExistingDartClass', true),
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ void main() {
|
|||
from: TableReference('tbl'),
|
||||
limit: DartLimitPlaceholder(name: 'limit'),
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -28,7 +28,7 @@ void main() {
|
|||
offset: NumericLiteral(3, token(TokenType.numberLiteral)),
|
||||
),
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -48,7 +48,7 @@ void main() {
|
|||
],
|
||||
),
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -60,7 +60,7 @@ void main() {
|
|||
from: TableReference('tbl'),
|
||||
orderBy: DartOrderByPlaceholder(name: 'order'),
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import 'utils.dart';
|
|||
|
||||
const content = r'''
|
||||
import 'other.dart';
|
||||
import 'another.moor';
|
||||
import 'another.drift';
|
||||
|
||||
CREATE TABLE tbl (
|
||||
id INT NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
|
@ -22,12 +22,12 @@ add: INSERT INTO tbl $row RETURNING *;
|
|||
''';
|
||||
|
||||
void main() {
|
||||
test('parses moor files', () {
|
||||
testMoorFile(
|
||||
test('parses drift files', () {
|
||||
testDriftFile(
|
||||
content,
|
||||
MoorFile([
|
||||
DriftFile([
|
||||
ImportStatement('other.dart'),
|
||||
ImportStatement('another.moor'),
|
||||
ImportStatement('another.drift'),
|
||||
CreateTableStatement(
|
||||
tableName: 'tbl',
|
||||
columns: [
|
||||
|
@ -52,11 +52,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
),
|
||||
MoorDartName(null, identifier('placeRef')),
|
||||
DriftDartName(null, identifier('placeRef')),
|
||||
],
|
||||
),
|
||||
],
|
||||
moorTableName: MoorTableName('RowName', false),
|
||||
driftTableName: DriftTableName('RowName', false),
|
||||
),
|
||||
DeclaredStatement(
|
||||
SimpleName('all'),
|
||||
|
@ -129,14 +129,14 @@ void main() {
|
|||
});
|
||||
|
||||
test('parses transaction blocks', () {
|
||||
testMoorFile(
|
||||
testDriftFile(
|
||||
'''
|
||||
test: BEGIN
|
||||
UPDATE foo SET bar = baz;
|
||||
DELETE FROM t;
|
||||
END;
|
||||
''',
|
||||
MoorFile([
|
||||
DriftFile([
|
||||
DeclaredStatement(
|
||||
SimpleName('test'),
|
||||
TransactionBlock(
|
||||
|
@ -162,8 +162,8 @@ END;
|
|||
|
||||
test("reports error when the statement can't be parsed", () {
|
||||
// regression test for https://github.com/simolus3/moor/issues/280#issuecomment-570789454
|
||||
final parsed = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
.parseMoorFile('name: NSERT INTO foo DEFAULT VALUES;');
|
||||
final parsed = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
.parseDriftFile('name: NSERT INTO foo DEFAULT VALUES;');
|
||||
|
||||
expect(
|
||||
parsed.errors,
|
||||
|
@ -174,7 +174,7 @@ END;
|
|||
)),
|
||||
);
|
||||
|
||||
final root = parsed.rootNode as MoorFile;
|
||||
final root = parsed.rootNode as DriftFile;
|
||||
expect(
|
||||
root.allDescendants,
|
||||
isNot(contains(const TypeMatcher<DeclaredStatement>())),
|
||||
|
@ -182,8 +182,8 @@ END;
|
|||
});
|
||||
|
||||
test('syntax errors contain correct position', () {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final result = engine.parseMoorFile('''
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
final result = engine.parseDriftFile('''
|
||||
worksByComposer:
|
||||
SELECT DISTINCT A.* FROM works A, works B ON A.id =
|
||||
WHERE A.composer = :id OR B.composer = :id;
|
||||
|
@ -198,9 +198,9 @@ SELECT DISTINCT A.* FROM works A, works B ON A.id =
|
|||
|
||||
test('parses REQUIRED without type hint', () {
|
||||
final variable = ColonVariableToken(fakeSpan(':category'), ':category');
|
||||
testMoorFile(
|
||||
testDriftFile(
|
||||
'test(REQUIRED :category): SELECT :category;',
|
||||
MoorFile([
|
||||
DriftFile([
|
||||
DeclaredStatement(
|
||||
SimpleName('test'),
|
||||
SelectStatement(columns: [
|
||||
|
|
|
@ -10,9 +10,9 @@ void main() {
|
|||
test('can parse multiple statements', () {
|
||||
const sql = 'a: UPDATE tbl SET a = b; b: SELECT * FROM tbl;';
|
||||
|
||||
testMoorFile(
|
||||
testDriftFile(
|
||||
sql,
|
||||
MoorFile([
|
||||
DriftFile([
|
||||
DeclaredStatement(
|
||||
SimpleName('a'),
|
||||
UpdateStatement(
|
||||
|
@ -39,7 +39,7 @@ void main() {
|
|||
test('recovers from invalid statements', () {
|
||||
const sql = 'a: UPDATE tbl SET a = * d; b: SELECT * FROM tbl;';
|
||||
final tokens = Scanner(sql).scanTokens();
|
||||
final statements = Parser(tokens).moorFile().statements;
|
||||
final statements = Parser(tokens).driftFile().statements;
|
||||
|
||||
expect(statements, hasLength(1));
|
||||
enforceEqual(
|
||||
|
@ -54,14 +54,14 @@ void main() {
|
|||
);
|
||||
});
|
||||
|
||||
test('parses imports and declared statements in moor mode', () {
|
||||
test('parses imports and declared statements in drift mode', () {
|
||||
const sql = r'''
|
||||
import 'test.dart';
|
||||
query: SELECT * FROM tbl;
|
||||
''';
|
||||
|
||||
final tokens = Scanner(sql, scanMoorTokens: true).scanTokens();
|
||||
final statements = Parser(tokens, useMoor: true).moorFile().statements;
|
||||
final tokens = Scanner(sql, scanDriftTokens: true).scanTokens();
|
||||
final statements = Parser(tokens, useDrift: true).driftFile().statements;
|
||||
|
||||
expect(statements, hasLength(2));
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import 'utils.dart';
|
|||
|
||||
void main() {
|
||||
test('parses create table statements with a previous malformed inport', () {
|
||||
final file = parseMoor('''
|
||||
final file = parseDrift('''
|
||||
import ;
|
||||
CREATE TABLE foo (name TEXT);
|
||||
''');
|
||||
|
@ -16,7 +16,7 @@ CREATE TABLE foo (name TEXT);
|
|||
});
|
||||
|
||||
test('recovers from parsing errors in column definition', () {
|
||||
final file = parseMoor('''
|
||||
final file = parseDrift('''
|
||||
CREATE TABLE foo (
|
||||
id INTEGER PRIMARY,
|
||||
name TEXT NOT NULL
|
||||
|
@ -41,9 +41,9 @@ CREATE TABLE foo (
|
|||
});
|
||||
|
||||
test('parses trailing comma with error', () {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
|
||||
final result = engine.parseMoorFile('''
|
||||
final result = engine.parseDriftFile('''
|
||||
CREATE TABLE foo (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
|
|
|
@ -28,7 +28,7 @@ void main() {
|
|||
),
|
||||
],
|
||||
),
|
||||
moorMode: true,
|
||||
driftMode: true,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import '../utils.dart';
|
|||
|
||||
void main() {
|
||||
test('parses nested query statements', () {
|
||||
final stmt = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final stmt = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
.parse('SELECT LIST(SELECT * FROM test) FROM test')
|
||||
.rootNode as SelectStatement;
|
||||
|
||||
|
@ -23,7 +23,7 @@ void main() {
|
|||
});
|
||||
|
||||
test('parses nested query statements with as', () {
|
||||
final stmt = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final stmt = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
.parse('SELECT LIST(SELECT * FROM test) AS newname FROM test')
|
||||
.rootNode as SelectStatement;
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ void main() {
|
|||
});
|
||||
|
||||
test('parses clauses with NULLS FIRST or NULLS LAST', () {
|
||||
final parsed = SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
final parsed = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
.parse(r'SELECT * FROM tbl ORDER BY $a NULLS LAST, b NULLS FIRST')
|
||||
.rootNode as SelectStatement;
|
||||
|
||||
|
|
|
@ -24,21 +24,21 @@ IdentifierToken identifier(String content) {
|
|||
return IdentifierToken(false, fakeSpan(content));
|
||||
}
|
||||
|
||||
MoorFile parseMoor(String content) {
|
||||
return SqlEngine(EngineOptions(useMoorExtensions: true))
|
||||
.parseMoorFile(content)
|
||||
.rootNode as MoorFile;
|
||||
DriftFile parseDrift(String content) {
|
||||
return SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||
.parseDriftFile(content)
|
||||
.rootNode as DriftFile;
|
||||
}
|
||||
|
||||
void testMoorFile(String moorFile, MoorFile expected) {
|
||||
final parsed = parseMoor(moorFile);
|
||||
void testDriftFile(String driftFile, DriftFile expected) {
|
||||
final parsed = parseDrift(driftFile);
|
||||
enforceHasSpan(parsed);
|
||||
enforceEqual(parsed, expected);
|
||||
}
|
||||
|
||||
void testStatement(String sql, AstNode expected, {bool moorMode = false}) {
|
||||
void testStatement(String sql, AstNode expected, {bool driftMode = false}) {
|
||||
final result =
|
||||
SqlEngine(EngineOptions(useMoorExtensions: moorMode)).parse(sql);
|
||||
SqlEngine(EngineOptions(useDriftExtensions: driftMode)).parse(sql);
|
||||
expect(result.errors, isEmpty);
|
||||
|
||||
final parsed = result.rootNode;
|
||||
|
|
|
@ -3,9 +3,9 @@ import 'package:sqlparser/src/reader/tokenizer/token.dart';
|
|||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('parses moor specific tokens', () {
|
||||
test('parses drift specific tokens', () {
|
||||
const part = 'c INTEGER MAPPED BY `const Mapper()` NOT NULL **';
|
||||
final scanner = Scanner(part, scanMoorTokens: true);
|
||||
final scanner = Scanner(part, scanDriftTokens: true);
|
||||
final tokens = scanner.scanTokens();
|
||||
|
||||
expect(scanner.errors, isEmpty);
|
||||
|
|
|
@ -3,7 +3,7 @@ import 'package:sqlparser/src/reader/tokenizer/scanner.dart';
|
|||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('parses ** as two tokens when not using moor mode', () {
|
||||
test('parses ** as two tokens when not using drift mode', () {
|
||||
final tokens = Scanner('**').scanTokens();
|
||||
expect(tokens.map((e) => e.type),
|
||||
containsAllInOrder([TokenType.star, TokenType.star]));
|
||||
|
|
|
@ -3,10 +3,10 @@ import 'package:sqlparser/src/utils/ast_equality.dart';
|
|||
import 'package:sqlparser/utils/node_to_text.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
enum _ParseKind { statement, moorFile }
|
||||
enum _ParseKind { statement, driftFile }
|
||||
|
||||
void main() {
|
||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
||||
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||
|
||||
void testFormat(String input, {_ParseKind kind = _ParseKind.statement}) {
|
||||
AstNode parse(String input) {
|
||||
|
@ -16,8 +16,8 @@ void main() {
|
|||
case _ParseKind.statement:
|
||||
result = engine.parse(input);
|
||||
break;
|
||||
case _ParseKind.moorFile:
|
||||
result = engine.parseMoorFile(input);
|
||||
case _ParseKind.driftFile:
|
||||
result = engine.parseDriftFile(input);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -452,28 +452,28 @@ CREATE UNIQUE INDEX my_idx ON t1 (c1, c2, c3) WHERE c1 < c3;
|
|||
testWith(r'a$b', r'"a$b"');
|
||||
});
|
||||
|
||||
group('moor', () {
|
||||
group('drift', () {
|
||||
test('dart placeholders', () {
|
||||
testFormat(r'SELECT $placeholder FROM foo');
|
||||
});
|
||||
|
||||
test('imports', () {
|
||||
testFormat('import \'foo.bar\';', kind: _ParseKind.moorFile);
|
||||
testFormat('import \'foo.bar\';', kind: _ParseKind.driftFile);
|
||||
});
|
||||
|
||||
test('declared statements', () {
|
||||
testFormat('foo (?1 AS INT): SELECT * FROM bar WHERE ? < 10;',
|
||||
kind: _ParseKind.moorFile);
|
||||
kind: _ParseKind.driftFile);
|
||||
testFormat('foo: SELECT * FROM bar WHERE :id < 10;',
|
||||
kind: _ParseKind.moorFile);
|
||||
kind: _ParseKind.driftFile);
|
||||
testFormat('foo (REQUIRED :x AS TEXT OR NULL): SELECT :x;',
|
||||
kind: _ParseKind.moorFile);
|
||||
kind: _ParseKind.driftFile);
|
||||
testFormat(r'foo ($pred = FALSE): SELECT * FROM bar WHERE $pred;',
|
||||
kind: _ParseKind.moorFile);
|
||||
kind: _ParseKind.driftFile);
|
||||
});
|
||||
|
||||
test('nested star', () {
|
||||
testFormat('q: SELECT foo.** FROM foo;', kind: _ParseKind.moorFile);
|
||||
testFormat('q: SELECT foo.** FROM foo;', kind: _ParseKind.driftFile);
|
||||
});
|
||||
|
||||
test('transaction block', () {
|
||||
|
@ -486,7 +486,7 @@ test: BEGIN TRANSACTION
|
|||
INSERT INTO foo VALUES (x, y, z);
|
||||
COMMIT TRANSACTION;
|
||||
''',
|
||||
kind: _ParseKind.moorFile,
|
||||
kind: _ParseKind.driftFile,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue