diff --git a/extras/with_built_value/build.yaml b/extras/with_built_value/build.yaml new file mode 100644 index 00000000..7f761c15 --- /dev/null +++ b/extras/with_built_value/build.yaml @@ -0,0 +1,15 @@ +targets: + $default: + builders: + moor_generator: + enabled: false + moor_generator|moor_generator_not_shared: + enabled: true + built_value_generator|built_value: + enabled: false + + run_built_value: + dependencies: ['with_built_value'] + builders: + moor_generator: + enabled: false \ No newline at end of file diff --git a/extras/with_built_value/lib/database.dart b/extras/with_built_value/lib/database.dart new file mode 100644 index 00000000..2fcf39b1 --- /dev/null +++ b/extras/with_built_value/lib/database.dart @@ -0,0 +1,26 @@ +import 'package:built_value/built_value.dart'; +import 'package:moor/moor.dart'; +import 'package:moor_ffi/moor_ffi.dart'; + +part 'database.moor.dart'; +part 'database.g.dart'; + +abstract class Foo implements Built { + SomeInt get moorField; + + Foo._(); + + factory Foo([void Function(FooBuilder) updates]) = _$Foo; +} + +class SomeInts extends Table { + IntColumn get id => integer().autoIncrement()(); +} + +@UseMoor(tables: [SomeInts]) +class Database extends _$Database { + Database() : super(VmDatabase.memory()); + + @override + int get schemaVersion => 1; +} diff --git a/extras/with_built_value/lib/database.g.dart b/extras/with_built_value/lib/database.g.dart new file mode 100644 index 00000000..9ee945f8 --- /dev/null +++ b/extras/with_built_value/lib/database.g.dart @@ -0,0 +1,85 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'database.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Foo extends Foo { + @override + final SomeInt moorField; + + factory _$Foo([void Function(FooBuilder) updates]) => + (new FooBuilder()..update(updates)).build(); + + _$Foo._({this.moorField}) : super._() { + if (moorField == null) { + throw new BuiltValueNullFieldError('Foo', 'moorField'); + } + } + + @override + Foo rebuild(void Function(FooBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + FooBuilder toBuilder() => new FooBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Foo && moorField == other.moorField; + } + + @override + int get hashCode { + return $jf($jc(0, moorField.hashCode)); + } + + @override + String toString() { + return (newBuiltValueToStringHelper('Foo')..add('moorField', moorField)) + .toString(); + } +} + +class FooBuilder implements Builder { + _$Foo _$v; + + SomeInt _moorField; + SomeInt get moorField => _$this._moorField; + set moorField(SomeInt moorField) => _$this._moorField = moorField; + + FooBuilder(); + + FooBuilder get _$this { + if (_$v != null) { + _moorField = _$v.moorField; + _$v = null; + } + return this; + } + + @override + void replace(Foo other) { + if (other == null) { + throw new ArgumentError.notNull('other'); + } + _$v = other as _$Foo; + } + + @override + void update(void Function(FooBuilder) updates) { + if (updates != null) updates(this); + } + + @override + _$Foo build() { + final _$result = _$v ?? new _$Foo._(moorField: moorField); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: always_put_control_body_on_new_line,always_specify_types,annotate_overrides,avoid_annotating_with_dynamic,avoid_as,avoid_catches_without_on_clauses,avoid_returning_this,lines_longer_than_80_chars,omit_local_variable_types,prefer_expression_function_bodies,sort_constructors_first,test_types_in_equals,unnecessary_const,unnecessary_new diff --git a/extras/with_built_value/lib/database.moor.dart b/extras/with_built_value/lib/database.moor.dart new file mode 100644 index 00000000..1cc6fe86 --- /dev/null +++ b/extras/with_built_value/lib/database.moor.dart @@ -0,0 +1,135 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'database.dart'; + +// ************************************************************************** +// MoorGenerator +// ************************************************************************** + +// ignore_for_file: unnecessary_brace_in_string_interps, unnecessary_this +class SomeInt extends DataClass implements Insertable { + final int id; + SomeInt({@required this.id}); + factory SomeInt.fromData(Map data, GeneratedDatabase db, + {String prefix}) { + final effectivePrefix = prefix ?? ''; + final intType = db.typeSystem.forDartType(); + return SomeInt( + id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']), + ); + } + factory SomeInt.fromJson(Map json, + {ValueSerializer serializer}) { + serializer ??= moorRuntimeOptions.defaultSerializer; + return SomeInt( + id: serializer.fromJson(json['id']), + ); + } + @override + Map toJson({ValueSerializer serializer}) { + serializer ??= moorRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + }; + } + + @override + SomeIntsCompanion createCompanion(bool nullToAbsent) { + return SomeIntsCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + ); + } + + SomeInt copyWith({int id}) => SomeInt( + id: id ?? this.id, + ); + @override + String toString() { + return (StringBuffer('SomeInt(')..write('id: $id')..write(')')).toString(); + } + + @override + int get hashCode => $mrjf(id.hashCode); + @override + bool operator ==(dynamic other) => + identical(this, other) || (other is SomeInt && other.id == this.id); +} + +class SomeIntsCompanion extends UpdateCompanion { + final Value id; + const SomeIntsCompanion({ + this.id = const Value.absent(), + }); + SomeIntsCompanion.insert({ + this.id = const Value.absent(), + }); + SomeIntsCompanion copyWith({Value id}) { + return SomeIntsCompanion( + id: id ?? this.id, + ); + } +} + +class $SomeIntsTable extends SomeInts with TableInfo<$SomeIntsTable, SomeInt> { + final GeneratedDatabase _db; + final String _alias; + $SomeIntsTable(this._db, [this._alias]); + final VerificationMeta _idMeta = const VerificationMeta('id'); + GeneratedIntColumn _id; + @override + GeneratedIntColumn get id => _id ??= _constructId(); + GeneratedIntColumn _constructId() { + return GeneratedIntColumn('id', $tableName, false, + hasAutoIncrement: true, declaredAsPrimaryKey: true); + } + + @override + List get $columns => [id]; + @override + $SomeIntsTable get asDslTable => this; + @override + String get $tableName => _alias ?? 'some_ints'; + @override + final String actualTableName = 'some_ints'; + @override + VerificationContext validateIntegrity(SomeIntsCompanion d, + {bool isInserting = false}) { + final context = VerificationContext(); + if (d.id.present) { + context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta)); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + SomeInt map(Map data, {String tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; + return SomeInt.fromData(data, _db, prefix: effectivePrefix); + } + + @override + Map entityToSql(SomeIntsCompanion d) { + final map = {}; + if (d.id.present) { + map['id'] = Variable(d.id.value); + } + return map; + } + + @override + $SomeIntsTable createAlias(String alias) { + return $SomeIntsTable(_db, alias); + } +} + +abstract class _$Database extends GeneratedDatabase { + _$Database(QueryExecutor e) : super(SqlTypeSystem.defaultInstance, e); + $SomeIntsTable _someInts; + $SomeIntsTable get someInts => _someInts ??= $SomeIntsTable(this); + @override + Iterable get allTables => allSchemaEntities.whereType(); + @override + List get allSchemaEntities => [someInts]; +} diff --git a/extras/with_built_value/pubspec.yaml b/extras/with_built_value/pubspec.yaml new file mode 100644 index 00000000..227ba06b --- /dev/null +++ b/extras/with_built_value/pubspec.yaml @@ -0,0 +1,26 @@ +name: with_built_value +publish_to: none +version: 1.0.0 + +environment: + sdk: '>=2.6.0 <3.0.0' + +dependencies: + moor: ^2.3.0 + moor_ffi: ^0.4.0 + built_value: ^7.0.0 + +dev_dependencies: + moor_generator: ^2.1.0 + built_value_generator: ^7.0.0 + build_runner: '>=1.3.0 <2.0.0' + +dependency_overrides: + moor: + path: ../../moor + moor_ffi: + path: ../../moor_ffi + moor_generator: + path: ../../moor_generator + sqlparser: + path: ../../sqlparser \ No newline at end of file diff --git a/moor_generator/build.yaml b/moor_generator/build.yaml index eee55968..0155fb8a 100644 --- a/moor_generator/build.yaml +++ b/moor_generator/build.yaml @@ -1,3 +1,15 @@ +# Short description for each builder + +# - preparing_builder: Infers the type of inline Dart expressions in moor files. +# We create a `input.temp.dart` file containing the expressions so that they +# can be resolved. +# - moor_generator: The regular SharedPartBuilder for @UseMoor and @UseDao +# annotations +# - moor_generator_not_shared: Like moor_generator, but as a PartBuilder instead of +# a SharedPartBuilder. This builder is disabled by default, but users may choose +# to use it so that generated classes can be used by other builders. +# - moor_cleanup: Deletes the `.temp.dart` files generated by the `preparing_builder`. + builders: preparing_builder: import: "package:moor_generator/integrations/build.dart" @@ -16,6 +28,14 @@ builders: required_inputs: [".dart_in_moor"] applies_builders: ["source_gen|combining_builder"] + moor_generator_not_shared: + import: "package:moor_generator/integrations/build.dart" + builder_factories: ["moorBuilderNotShared"] + build_extensions: {".dart": [".moor.dart"]} + build_to: source + auto_apply: none + required_inputs: [".dart_in_moor"] + post_process_builders: moor_cleanup: import: "package:moor_generator/integrations/build.dart" diff --git a/moor_generator/lib/integrations/build.dart b/moor_generator/lib/integrations/build.dart index 2cd4282f..19205d6c 100644 --- a/moor_generator/lib/integrations/build.dart +++ b/moor_generator/lib/integrations/build.dart @@ -2,7 +2,10 @@ import 'package:build/build.dart'; import 'package:moor_generator/src/backends/build/moor_builder.dart'; import 'package:moor_generator/src/backends/build/preprocess_builder.dart'; -Builder moorBuilder(BuilderOptions options) => MoorBuilder(options); +Builder moorBuilder(BuilderOptions options) => MoorSharedPartBuilder(options); + +Builder moorBuilderNotShared(BuilderOptions options) => + MoorPartBuilder(options); Builder preparingBuilder(BuilderOptions options) => PreprocessBuilder(); diff --git a/moor_generator/lib/src/backends/build/moor_builder.dart b/moor_generator/lib/src/backends/build/moor_builder.dart index 23a45bb9..c994884a 100644 --- a/moor_generator/lib/src/backends/build/moor_builder.dart +++ b/moor_generator/lib/src/backends/build/moor_builder.dart @@ -10,28 +10,8 @@ import 'package:moor_generator/src/backends/build/generators/moor_generator.dart import 'package:moor_generator/writer.dart'; import 'package:source_gen/source_gen.dart'; -class MoorBuilder extends SharedPartBuilder { - final MoorOptions options; - - MoorBuilder._(List generators, String name, this.options) - : super(generators, name); - - factory MoorBuilder(BuilderOptions options) { - final parsedOptions = MoorOptions.fromJson(options.config); - - final generators = [ - MoorGenerator(), - DaoGenerator(), - ]; - - final builder = MoorBuilder._(generators, 'moor', parsedOptions); - - for (final generator in generators.cast()) { - generator.builder = builder; - } - - return builder; - } +mixin MoorBuilder on Builder { + MoorOptions get options; Writer createWriter() => Writer(options); @@ -54,6 +34,54 @@ class MoorBuilder extends SharedPartBuilder { } } +T _createBuilder( + BuilderOptions options, + T Function(List generators, MoorOptions parsedOptions) creator, +) { + final parsedOptions = MoorOptions.fromJson(options.config); + + final generators = [ + MoorGenerator(), + DaoGenerator(), + ]; + + final builder = creator(generators, parsedOptions); + + for (final generator in generators.cast()) { + generator.builder = builder; + } + + return builder; +} + +class MoorSharedPartBuilder extends SharedPartBuilder with MoorBuilder { + @override + final MoorOptions options; + + MoorSharedPartBuilder._(List generators, String name, this.options) + : super(generators, name); + + factory MoorSharedPartBuilder(BuilderOptions options) { + return _createBuilder(options, (generators, parsedOptions) { + return MoorSharedPartBuilder._(generators, 'moor', parsedOptions); + }); + } +} + +class MoorPartBuilder extends PartBuilder with MoorBuilder { + @override + final MoorOptions options; + + MoorPartBuilder._(List generators, String extension, this.options) + : super(generators, extension); + + factory MoorPartBuilder(BuilderOptions options) { + return _createBuilder(options, (generators, parsedOptions) { + return MoorPartBuilder._(generators, '.moor.dart', parsedOptions); + }); + } +} + abstract class BaseGenerator { MoorBuilder builder; }