Extract columns override into shared method

This commit is contained in:
Simon Binder 2022-12-31 13:58:52 +01:00
parent 91495e6f8d
commit 31e1312fc3
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
2 changed files with 60 additions and 116 deletions

View File

@ -92,8 +92,10 @@ class DataClassWriter {
..write('});');
if (isInsertable) {
// If we generate mixins for the `toColumns` override, we don't need to
// generate a duplicate method in the data class.
if (!scope.options.writeToColumnsMixins) {
_writeToColumnsOverride();
_emitter.writeToColumnsOverride(columns);
}
if (scope.options.dataClassToCompanions) {
_writeToCompanion();
@ -245,63 +247,6 @@ class DataClassWriter {
_buffer.write(');');
}
void _writeToColumnsOverride() {
final expression = _emitter.drift('Expression');
final variable = _emitter.drift('Variable');
_buffer
..write('@override\nMap<String, $expression> toColumns'
'(bool nullToAbsent) {\n')
..write('final map = <String, $expression> {};');
for (final column in columns) {
// Generated column - cannot be used for inserts or updates
if (column.isGenerated) continue;
// We include all columns that are not null. If nullToAbsent is false, we
// also include null columns. When generating NNBD code, we can include
// non-nullable columns without an additional null check since we know
// the values aren't going to be null.
final needsNullCheck = column.nullableInDart;
final needsScope = needsNullCheck || column.typeConverter != null;
if (needsNullCheck) {
_buffer.write('if (!nullToAbsent || ${column.nameInDart} != null)');
}
if (needsScope) _buffer.write('{');
final typeName =
_emitter.dartCode(_emitter.variableTypeCode(column, nullable: false));
final mapSetter = 'map[${asDartLiteral(column.nameInSql)}] = '
'$variable<$typeName>';
if (column.typeConverter != null) {
// apply type converter before writing the variable
final converter = column.typeConverter!;
_emitter
..write('final converter = ')
..writeDart(_emitter.writer
.readConverter(converter, forNullable: column.nullable))
..writeln(';')
..write(mapSetter)
..write('(converter.toSql(${column.nameInDart})');
_buffer.write(');');
} else {
// no type converter. Write variable directly
_buffer
..write(mapSetter)
..write('(')
..write(column.nameInDart)
..write(');');
}
// This one closes the optional if from before.
if (needsScope) _buffer.write('}');
}
_buffer.write('return map; \n}\n');
}
void _writeToCompanion() {
final asTable = table as DriftTable;
final companionType = _emitter.writer.companionType(asTable);
@ -424,3 +369,59 @@ class RowMappingWriter {
buffer.write(')');
}
}
extension WriteToColumns on TextEmitter {
void writeToColumnsOverride(Iterable<DriftColumn> columns) {
final expression = drift('Expression');
final variable = drift('Variable');
this
..write('@override\nMap<String, $expression> toColumns'
'(bool nullToAbsent) {\n')
..write('final map = <String, $expression> {};');
for (final column in columns) {
// Generated column - cannot be used for inserts or updates
if (column.isGenerated) continue;
// We include all columns that are not null. If nullToAbsent is false, we
// also include null columns. When generating NNBD code, we can include
// non-nullable columns without an additional null check since we know
// the values aren't going to be null.
final needsNullCheck = column.nullableInDart;
final needsScope = needsNullCheck || column.typeConverter != null;
if (needsNullCheck) {
write('if (!nullToAbsent || ${column.nameInDart} != null)');
}
if (needsScope) write('{');
final typeName = dartCode(variableTypeCode(column, nullable: false));
final mapSetter = 'map[${asDartLiteral(column.nameInSql)}] = '
'$variable<$typeName>';
if (column.typeConverter != null) {
// apply type converter before writing the variable
final converter = column.typeConverter!;
this
..write('final converter = ')
..writeDart(readConverter(converter, forNullable: column.nullable))
..writeln(';')
..write(mapSetter)
..write('(converter.toSql(${column.nameInDart}));');
} else {
// no type converter. Write variable directly
this
..write(mapSetter)
..write('(')
..write(column.nameInDart)
..write(');');
}
// This one closes the optional if from before.
if (needsScope) write('}');
}
write('return map; \n}\n');
}
}

View File

@ -380,67 +380,10 @@ class TableWriter extends TableOrViewWriter {
buffer.writeln('$typeName get ${column.nameInDart};');
}
_writeToColumnsOverride();
emitter.writeToColumnsOverride(table.columns);
buffer.write('}');
}
void _writeToColumnsOverride() {
final expression = emitter.drift('Expression');
final variable = emitter.drift('Variable');
buffer
..write('@override\nMap<String, $expression> toColumns'
'(bool nullToAbsent) {\n')
..write('final map = <String, $expression> {};');
for (final column in table.columns) {
// Generated column - cannot be used for inserts or updates
if (column.isGenerated) continue;
// We include all columns that are not null. If nullToAbsent is false, we
// also include null columns. When generating NNBD code, we can include
// non-nullable columns without an additional null check since we know
// the values aren't going to be null.
final needsNullCheck = column.nullableInDart;
final needsScope = needsNullCheck || column.typeConverter != null;
if (needsNullCheck) {
buffer.write('if (!nullToAbsent || ${column.nameInDart} != null)');
}
if (needsScope) buffer.write('{');
final typeName =
emitter.dartCode(emitter.variableTypeCode(column, nullable: false));
final mapSetter = 'map[${asDartLiteral(column.nameInSql)}] = '
'$variable<$typeName>';
if (column.typeConverter != null) {
// apply type converter before writing the variable
final converter = column.typeConverter!;
emitter
..write('final converter = ')
..writeDart(emitter.writer
.readConverter(converter, forNullable: column.nullable))
..writeln(';')
..write(mapSetter)
..write('(converter.toSql(${column.nameInDart})');
buffer.write(');');
} else {
// no type converter. Write variable directly
buffer
..write(mapSetter)
..write('(')
..write(column.nameInDart)
..write(');');
}
// This one closes the optional if from before.
if (needsScope) buffer.write('}');
}
buffer.write('return map; \n}\n');
}
void _writeConvertersAsStaticFields() {
for (final converter in table.appliedConverters) {
final typeName =