diff --git a/drift_dev/lib/src/writer/tables/data_class_writer.dart b/drift_dev/lib/src/writer/tables/data_class_writer.dart index cc7769bf..aa7f209e 100644 --- a/drift_dev/lib/src/writer/tables/data_class_writer.dart +++ b/drift_dev/lib/src/writer/tables/data_class_writer.dart @@ -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 toColumns' - '(bool nullToAbsent) {\n') - ..write('final map = {};'); - - 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 columns) { + final expression = drift('Expression'); + final variable = drift('Variable'); + + this + ..write('@override\nMap toColumns' + '(bool nullToAbsent) {\n') + ..write('final map = {};'); + + 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'); + } +} diff --git a/drift_dev/lib/src/writer/tables/table_writer.dart b/drift_dev/lib/src/writer/tables/table_writer.dart index 54d1910b..92d27f2d 100644 --- a/drift_dev/lib/src/writer/tables/table_writer.dart +++ b/drift_dev/lib/src/writer/tables/table_writer.dart @@ -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 toColumns' - '(bool nullToAbsent) {\n') - ..write('final map = {};'); - - 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 =