Optional part builder, example with built_value

See #89
This commit is contained in:
Simon Binder 2020-02-06 22:27:54 +01:00
parent 4002898f26
commit cd9b7101b4
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
8 changed files with 361 additions and 23 deletions

View File

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

View File

@ -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<Foo, FooBuilder> {
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;
}

View File

@ -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, FooBuilder> {
_$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

View File

@ -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<SomeInt> {
final int id;
SomeInt({@required this.id});
factory SomeInt.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
return SomeInt(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']),
);
}
factory SomeInt.fromJson(Map<String, dynamic> json,
{ValueSerializer serializer}) {
serializer ??= moorRuntimeOptions.defaultSerializer;
return SomeInt(
id: serializer.fromJson<int>(json['id']),
);
}
@override
Map<String, dynamic> toJson({ValueSerializer serializer}) {
serializer ??= moorRuntimeOptions.defaultSerializer;
return <String, dynamic>{
'id': serializer.toJson<int>(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<SomeInt> {
final Value<int> id;
const SomeIntsCompanion({
this.id = const Value.absent(),
});
SomeIntsCompanion.insert({
this.id = const Value.absent(),
});
SomeIntsCompanion copyWith({Value<int> 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<GeneratedColumn> 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<GeneratedColumn> get $primaryKey => {id};
@override
SomeInt map(Map<String, dynamic> data, {String tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null;
return SomeInt.fromData(data, _db, prefix: effectivePrefix);
}
@override
Map<String, Variable> entityToSql(SomeIntsCompanion d) {
final map = <String, Variable>{};
if (d.id.present) {
map['id'] = Variable<int, IntType>(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<TableInfo> get allTables => allSchemaEntities.whereType<TableInfo>();
@override
List<DatabaseSchemaEntity> get allSchemaEntities => [someInts];
}

View File

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

View File

@ -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: builders:
preparing_builder: preparing_builder:
import: "package:moor_generator/integrations/build.dart" import: "package:moor_generator/integrations/build.dart"
@ -16,6 +28,14 @@ builders:
required_inputs: [".dart_in_moor"] required_inputs: [".dart_in_moor"]
applies_builders: ["source_gen|combining_builder"] 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: post_process_builders:
moor_cleanup: moor_cleanup:
import: "package:moor_generator/integrations/build.dart" import: "package:moor_generator/integrations/build.dart"

View File

@ -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/moor_builder.dart';
import 'package:moor_generator/src/backends/build/preprocess_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(); Builder preparingBuilder(BuilderOptions options) => PreprocessBuilder();

View File

@ -10,28 +10,8 @@ import 'package:moor_generator/src/backends/build/generators/moor_generator.dart
import 'package:moor_generator/writer.dart'; import 'package:moor_generator/writer.dart';
import 'package:source_gen/source_gen.dart'; import 'package:source_gen/source_gen.dart';
class MoorBuilder extends SharedPartBuilder { mixin MoorBuilder on Builder {
final MoorOptions options; MoorOptions get options;
MoorBuilder._(List<Generator> generators, String name, this.options)
: super(generators, name);
factory MoorBuilder(BuilderOptions options) {
final parsedOptions = MoorOptions.fromJson(options.config);
final generators = <Generator>[
MoorGenerator(),
DaoGenerator(),
];
final builder = MoorBuilder._(generators, 'moor', parsedOptions);
for (final generator in generators.cast<BaseGenerator>()) {
generator.builder = builder;
}
return builder;
}
Writer createWriter() => Writer(options); Writer createWriter() => Writer(options);
@ -54,6 +34,54 @@ class MoorBuilder extends SharedPartBuilder {
} }
} }
T _createBuilder<T extends MoorBuilder>(
BuilderOptions options,
T Function(List<Generator> generators, MoorOptions parsedOptions) creator,
) {
final parsedOptions = MoorOptions.fromJson(options.config);
final generators = <Generator>[
MoorGenerator(),
DaoGenerator(),
];
final builder = creator(generators, parsedOptions);
for (final generator in generators.cast<BaseGenerator>()) {
generator.builder = builder;
}
return builder;
}
class MoorSharedPartBuilder extends SharedPartBuilder with MoorBuilder {
@override
final MoorOptions options;
MoorSharedPartBuilder._(List<Generator> 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<Generator> 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 { abstract class BaseGenerator {
MoorBuilder builder; MoorBuilder builder;
} }