Start writing simple migrate script

This commit is contained in:
Simon Binder 2021-10-07 22:55:54 +02:00
parent fd0764594d
commit 6877cf9673
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
6 changed files with 115 additions and 8 deletions

View File

@ -2,4 +2,4 @@
/// `moor_ffi`.
library moor_ffi_functions;
export 'package:drift/extensions/ffi.dart';
export 'package:drift/extensions/native.dart';

View File

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

View File

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

View File

@ -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();
});
}