mirror of https://github.com/AMT-Cheif/drift.git
Start writing simple migrate script
This commit is contained in:
parent
fd0764594d
commit
6877cf9673
|
@ -2,4 +2,4 @@
|
|||
/// `moor_ffi`.
|
||||
library moor_ffi_functions;
|
||||
|
||||
export 'package:drift/extensions/ffi.dart';
|
||||
export 'package:drift/extensions/native.dart';
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
/// For more information other platforms, see [other engines](https://moor.simonbinder.eu/docs/other-engines/vm/).
|
||||
library moor.ffi;
|
||||
|
||||
import 'package:drift/ffi.dart';
|
||||
import 'package:drift/native.dart';
|
||||
|
||||
export 'package:drift/ffi.dart' hide NativeDatabase;
|
||||
export 'package:drift/native.dart' hide NativeDatabase;
|
||||
|
||||
/// A moor database implementation based on `dart:ffi`, running directly in a
|
||||
/// Dart VM or an AOT compiled Dart/Flutter application.
|
||||
|
|
|
@ -4,8 +4,11 @@ import 'dart:io';
|
|||
import 'package:analyzer/dart/analysis/analysis_context.dart';
|
||||
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
|
||||
import 'package:analyzer/dart/analysis/results.dart';
|
||||
import 'package:analyzer/dart/ast/ast.dart';
|
||||
import 'package:analyzer/dart/ast/visitor.dart';
|
||||
import 'package:moor_generator/src/utils/string_escaper.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:sqlparser/sqlparser.dart' hide AnalysisContext;
|
||||
import 'package:sqlparser/sqlparser.dart' hide AnalysisContext, StringLiteral;
|
||||
import 'package:yaml_edit/yaml_edit.dart';
|
||||
|
||||
import '../cli.dart';
|
||||
|
@ -64,6 +67,10 @@ class MigrateCommand extends MoorCommand {
|
|||
}
|
||||
|
||||
final typedResult = unitResult as ResolvedUnitResult;
|
||||
final writer = _Moor2DriftDartRewriter(await file.readAsString());
|
||||
typedResult.unit.accept(writer);
|
||||
|
||||
await file.writeAsString(writer.content);
|
||||
}
|
||||
|
||||
Future<String> _transformMoorFile(File file) async {
|
||||
|
@ -95,3 +102,55 @@ class MigrateCommand extends MoorCommand {
|
|||
|
||||
Future<void> _transformPubspec(File file) async {}
|
||||
}
|
||||
|
||||
class _Moor2DriftDartRewriter extends GeneralizingAstVisitor<void> {
|
||||
String content;
|
||||
var _skew = 0;
|
||||
|
||||
_Moor2DriftDartRewriter(this.content);
|
||||
|
||||
void _replace(int start, int originalLength, String newContent) {
|
||||
content = content.replaceRange(
|
||||
_skew + start, _skew + start + originalLength, newContent);
|
||||
_skew += newContent.length - originalLength;
|
||||
}
|
||||
|
||||
void _rewriteImportString(StringLiteral l) {
|
||||
// Don't do anything if this is not a 'package:moor/` uri
|
||||
final value = l.stringValue;
|
||||
if (value == null) return;
|
||||
|
||||
final uri = Uri.tryParse(value);
|
||||
if (uri == null || uri.scheme != 'package') return;
|
||||
|
||||
final segments = uri.pathSegments;
|
||||
if (segments.length <= 1 || segments[0] != 'moor') return;
|
||||
|
||||
// Oh, it is a moor package import! Replace with the right drift import.
|
||||
var path = p.url.joinAll(segments.skip(1));
|
||||
|
||||
// Some libraries have a changed path
|
||||
switch (path.toLowerCase()) {
|
||||
case 'moor.dart':
|
||||
path = 'drift.dart'; // moor/moor.dart -> drift/drift.dart
|
||||
break;
|
||||
case 'ffi.dart':
|
||||
path = 'native.dart'; // moor/ffi.dart -> drift/native.dart
|
||||
break;
|
||||
case 'extensions/moor_ffi.dart':
|
||||
path = 'extensions/native.dart'; // similar rename here
|
||||
break;
|
||||
case 'moor_web.dart':
|
||||
path = 'web.dart'; // moor/moor_web.dart -> drift/web.dart
|
||||
break;
|
||||
}
|
||||
|
||||
final driftImport = 'package:drift/$path';
|
||||
_replace(l.offset, l.length, asDartLiteral(driftImport));
|
||||
}
|
||||
|
||||
@override
|
||||
void visitUriBasedDirective(UriBasedDirective node) {
|
||||
_rewriteImportString(node.uri);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
// @dart=2.9
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:isolate';
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:moor_generator/src/cli/cli.dart';
|
||||
import 'package:package_config/package_config_types.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:test/scaffolding.dart';
|
||||
import 'package:test_descriptor/test_descriptor.dart' as d;
|
||||
|
||||
|
@ -22,7 +25,23 @@ Future<void> _apply() {
|
|||
}
|
||||
|
||||
Future<void> _setup(Iterable<d.Descriptor> lib,
|
||||
{String pubspec, Iterable<d.Descriptor> additional}) {
|
||||
{String pubspec, Iterable<d.Descriptor> additional}) async {
|
||||
// Copy and patch moor_generator's package config instead of running `pub get`
|
||||
// in each test.
|
||||
|
||||
final uri = await Isolate.packageConfig;
|
||||
final config =
|
||||
PackageConfig.parseBytes(await File.fromUri(uri).readAsBytes(), uri);
|
||||
|
||||
final appUri = '${File(p.join(d.sandbox, 'app')).absolute.uri}/';
|
||||
final newConfig = PackageConfig([
|
||||
...config.packages,
|
||||
Package('app', Uri.parse(appUri),
|
||||
packageUriRoot: Uri.parse('${appUri}lib/')),
|
||||
]);
|
||||
final configBuffer = StringBuffer();
|
||||
PackageConfig.writeString(newConfig, configBuffer);
|
||||
|
||||
pubspec ??= '''
|
||||
name: app
|
||||
|
||||
|
@ -35,10 +54,13 @@ dev_dependencies:
|
|||
moor_generator: ^4.4.0
|
||||
''';
|
||||
|
||||
return d.dir('app', [
|
||||
await d.dir('app', [
|
||||
d.dir('lib', lib),
|
||||
d.file('pubspec.yaml', pubspec),
|
||||
...?additional
|
||||
d.dir('.dart_tool', [
|
||||
d.file('package_config.json', configBuffer.toString()),
|
||||
]),
|
||||
...?additional,
|
||||
]).create();
|
||||
}
|
||||
|
||||
|
@ -54,6 +76,32 @@ void main() {
|
|||
await d.dir('app/lib', [
|
||||
d.file('a.drift', "import 'b.drift';"),
|
||||
d.file('b.drift', 'CREATE TABLE foo (x TEXT);'),
|
||||
]).create();
|
||||
]).validate();
|
||||
});
|
||||
|
||||
_test('patches moor imports', () async {
|
||||
await _setup([
|
||||
d.file('a.dart', '''
|
||||
import 'package:moor/moor.dart' as moor;
|
||||
import 'package:moor/extensions/moor_ffi.dart';
|
||||
import 'package:moor/src/some/internal/file.dart';
|
||||
|
||||
export 'package:moor/moor_web.dart';
|
||||
export 'package:moor/fFI.dart';
|
||||
'''),
|
||||
]);
|
||||
|
||||
await _apply();
|
||||
|
||||
await d.dir('app/lib', [
|
||||
d.file('a.dart', '''
|
||||
import 'package:drift/drift.dart' as moor;
|
||||
import 'package:drift/extensions/native.dart';
|
||||
import 'package:drift/src/some/internal/file.dart';
|
||||
|
||||
export 'package:drift/web.dart';
|
||||
export 'package:drift/native.dart';
|
||||
'''),
|
||||
]).validate();
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue