mirror of https://github.com/AMT-Cheif/drift.git
Remove support for non-nnbd code
This commit is contained in:
parent
9014fa82a8
commit
52c07c9d3f
|
@ -2,6 +2,11 @@
|
|||
|
||||
- Remove the `null_aware_type_converters` build option. Effectively, it is always
|
||||
turned on now.
|
||||
- Starting from this version, drift only supports generating non-nullable Dart code.
|
||||
You'll have to at least opt your database code into null-safety to use this and
|
||||
upcoming drift releases.
|
||||
|
||||
These changes help reduce complexity in the generator.
|
||||
|
||||
## 1.7.0
|
||||
|
||||
|
|
|
@ -13,8 +13,7 @@ class DaoGenerator extends Generator implements BaseGenerator {
|
|||
@override
|
||||
Future<String> generate(LibraryReader library, BuildStep buildStep) async {
|
||||
final parsed = await builder.analyzeDartFile(buildStep);
|
||||
final writer =
|
||||
builder.createWriter(nnbd: library.element.isNonNullableByDefault);
|
||||
final writer = builder.createWriter();
|
||||
|
||||
for (final dao in parsed.declaredDaos) {
|
||||
final classScope = writer.child();
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import 'package:build/build.dart';
|
||||
import 'package:drift_dev/src/backends/build/moor_builder.dart';
|
||||
import 'package:drift_dev/writer.dart';
|
||||
import 'package:pub_semver/pub_semver.dart';
|
||||
import 'package:source_gen/source_gen.dart';
|
||||
|
||||
const _targetMajorVersion = 2;
|
||||
const _targetMinorVersion = 6;
|
||||
final _minLanguageVersion = Version(2, 12, 0);
|
||||
|
||||
class MoorGenerator extends Generator implements BaseGenerator {
|
||||
@override
|
||||
|
@ -13,8 +13,7 @@ class MoorGenerator extends Generator implements BaseGenerator {
|
|||
@override
|
||||
Future<String> generate(LibraryReader library, BuildStep buildStep) async {
|
||||
final parsed = await builder.analyzeDartFile(buildStep);
|
||||
final writer =
|
||||
builder.createWriter(nnbd: library.element.isNonNullableByDefault);
|
||||
final writer = builder.createWriter();
|
||||
|
||||
if (parsed.declaredDatabases.isNotEmpty) {
|
||||
const ignore = '// ignore_for_file: type=lint';
|
||||
|
@ -27,19 +26,18 @@ class MoorGenerator extends Generator implements BaseGenerator {
|
|||
|
||||
if (parsed.declaredDatabases.isNotEmpty) {
|
||||
// Warn if the project uses an SDK version that is incompatible with what
|
||||
// moor generates.
|
||||
// drift generates.
|
||||
final version = library.element.languageVersion.effective;
|
||||
final major = version.major;
|
||||
final minor = version.minor;
|
||||
|
||||
const expected = '$_targetMajorVersion.$_targetMinorVersion';
|
||||
|
||||
if (major < _targetMajorVersion ||
|
||||
(major == _targetMajorVersion && minor < _targetMinorVersion)) {
|
||||
log.warning('The language version of this file is Dart $major.$minor. '
|
||||
'Drift generates code for Dart $expected or later. Please consider '
|
||||
'raising the minimum SDK version in your pubspec.yaml to at least '
|
||||
'$expected.0.');
|
||||
if (version < _minLanguageVersion) {
|
||||
log.warning(
|
||||
'The language version of this file is Dart $major.$minor. '
|
||||
'Drift generates code for Dart $_minLanguageVersion or later. Please '
|
||||
'consider raising the minimum SDK version in your pubspec.yaml to at '
|
||||
'least $_minLanguageVersion.',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,11 +20,10 @@ mixin MoorBuilder on Builder {
|
|||
MoorOptions get options;
|
||||
bool get isForNewDriftPackage;
|
||||
|
||||
Writer createWriter({bool nnbd = false}) {
|
||||
Writer createWriter() {
|
||||
return Writer(
|
||||
options,
|
||||
generationOptions: GenerationOptions(
|
||||
nnbd: nnbd,
|
||||
writeForMoorPackage: !isForNewDriftPackage,
|
||||
),
|
||||
);
|
||||
|
|
|
@ -1,26 +1,18 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:analyzer/dart/analysis/features.dart';
|
||||
import 'package:args/command_runner.dart';
|
||||
import 'package:dart_style/dart_style.dart';
|
||||
import 'package:drift_dev/moor_generator.dart';
|
||||
import 'package:drift_dev/src/cli/cli.dart';
|
||||
import 'package:drift_dev/src/services/schema/schema_files.dart';
|
||||
import 'package:drift_dev/writer.dart';
|
||||
import 'package:package_config/package_config.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:pub_semver/pub_semver.dart';
|
||||
|
||||
class GenerateUtilsCommand extends Command {
|
||||
final MoorCli cli;
|
||||
|
||||
GenerateUtilsCommand(this.cli) {
|
||||
argParser.addFlag(
|
||||
'null-safety',
|
||||
defaultsTo: null,
|
||||
help: 'Whether to generate null-safe test code.',
|
||||
);
|
||||
argParser.addFlag(
|
||||
'data-classes',
|
||||
defaultsTo: false,
|
||||
|
@ -48,9 +40,6 @@ class GenerateUtilsCommand extends Command {
|
|||
|
||||
@override
|
||||
Future<void> run() async {
|
||||
final isNnbd = (argResults?['null-safety'] as bool?) ??
|
||||
await _isCurrentPackageNullSafe();
|
||||
|
||||
final isForMoor = argResults!.arguments.contains('moor_generator');
|
||||
|
||||
final rest = argResults!.rest;
|
||||
|
@ -78,48 +67,17 @@ class GenerateUtilsCommand extends Command {
|
|||
outputDir,
|
||||
version,
|
||||
entities,
|
||||
isNnbd,
|
||||
argResults?['data-classes'] as bool,
|
||||
argResults?['companions'] as bool,
|
||||
isForMoor,
|
||||
);
|
||||
}
|
||||
|
||||
await _writeLibraryFile(outputDir, schema.keys, isNnbd, isForMoor);
|
||||
await _writeLibraryFile(outputDir, schema.keys, isForMoor);
|
||||
print(
|
||||
'Wrote ${schema.length + 1} files into ${p.relative(outputDir.path)}');
|
||||
}
|
||||
|
||||
Future<bool> _isCurrentPackageNullSafe() async {
|
||||
PackageConfig? config;
|
||||
try {
|
||||
config = await findPackageConfig(Directory.current);
|
||||
} on Object {
|
||||
stderr.write('Could not determine whether to use null-safety. Please '
|
||||
'run this command in a Dart project, or try running `pub get` first');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (config == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Just use any file in the current package, the file doesn't have to exist.
|
||||
final ownPackage =
|
||||
config.packageOf(Uri.file(File('pubspec.yaml').absolute.path));
|
||||
if (ownPackage == null) return false;
|
||||
|
||||
final version = ownPackage.languageVersion;
|
||||
if (version == null) return false;
|
||||
|
||||
final featureSet = FeatureSet.fromEnableFlags2(
|
||||
sdkLanguageVersion: Version(version.major, version.minor, 0),
|
||||
flags: const [],
|
||||
);
|
||||
|
||||
return featureSet.isEnabled(Feature.non_nullable);
|
||||
}
|
||||
|
||||
Future<Map<int, List<MoorSchemaEntity>>> _parseSchema(
|
||||
Directory directory) async {
|
||||
final results = <int, List<MoorSchemaEntity>>{};
|
||||
|
@ -144,7 +102,6 @@ class GenerateUtilsCommand extends Command {
|
|||
Directory output,
|
||||
int version,
|
||||
List<MoorSchemaEntity> entities,
|
||||
bool nnbd,
|
||||
bool dataClasses,
|
||||
bool companions,
|
||||
bool isForMoor,
|
||||
|
@ -153,7 +110,6 @@ class GenerateUtilsCommand extends Command {
|
|||
cli.project.moorOptions,
|
||||
generationOptions: GenerationOptions(
|
||||
forSchema: version,
|
||||
nnbd: nnbd,
|
||||
writeCompanions: companions,
|
||||
writeDataClasses: dataClasses,
|
||||
writeForMoorPackage: isForMoor,
|
||||
|
@ -163,7 +119,7 @@ class GenerateUtilsCommand extends Command {
|
|||
|
||||
final leaf = writer.leaf()
|
||||
..writeln(_prefix)
|
||||
..writeDartVersion(nnbd);
|
||||
..writeln('//@dart=2.12');
|
||||
|
||||
if (isForMoor) {
|
||||
leaf.writeln("import 'package:moor/moor.dart';");
|
||||
|
@ -181,11 +137,11 @@ class GenerateUtilsCommand extends Command {
|
|||
return file.writeAsString(_dartfmt.format(writer.writeGenerated()));
|
||||
}
|
||||
|
||||
Future<void> _writeLibraryFile(Directory output, Iterable<int> versions,
|
||||
bool nnbd, bool useMoorImports) {
|
||||
Future<void> _writeLibraryFile(
|
||||
Directory output, Iterable<int> versions, bool useMoorImports) {
|
||||
final buffer = StringBuffer()
|
||||
..writeln(_prefix)
|
||||
..writeDartVersion(nnbd);
|
||||
..writeln('//@dart=2.12');
|
||||
|
||||
if (useMoorImports) {
|
||||
buffer
|
||||
|
@ -230,9 +186,3 @@ class GenerateUtilsCommand extends Command {
|
|||
static final _dartfmt = DartFormatter();
|
||||
static const _prefix = '// GENERATED CODE, DO NOT EDIT BY HAND.';
|
||||
}
|
||||
|
||||
extension on StringBuffer {
|
||||
void writeDartVersion(bool isNnbd) {
|
||||
writeln(isNnbd ? '//@dart=2.12' : '//@dart=2.9');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -88,7 +88,7 @@ class ExistingRowClass {
|
|||
typeArguments: typeInstantiation,
|
||||
nullabilitySuffix: NullabilitySuffix.none,
|
||||
)
|
||||
.getDisplayString(withNullability: options.nnbd);
|
||||
.getDisplayString(withNullability: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -161,7 +161,7 @@ class MoorColumn implements HasDeclaration, HasType {
|
|||
// We currently use nullable columns everywhere because it's not clear how
|
||||
// to express nullability in joins otherwise. When serializing data with
|
||||
// JsonTypeConverter it needs to match the nullability of the column
|
||||
return options.nnbd && (!checkNullable || nullable) ? '$code?' : code;
|
||||
return (!checkNullable || nullable) ? '$code?' : code;
|
||||
}
|
||||
|
||||
SqlType sqlType() {
|
||||
|
|
|
@ -742,7 +742,7 @@ class ExpressionDartPlaceholderType extends DartPlaceholderType {
|
|||
if (columnType == null) return 'Expression';
|
||||
|
||||
final dartType = dartTypeNames[columnType]!;
|
||||
return 'Expression<${options.nullableType(dartType)}>';
|
||||
return 'Expression<$dartType?>';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ class DriftDartType {
|
|||
if (nullabilitySuffix == NullabilitySuffix.star) {
|
||||
return getDisplayString(withNullability: false);
|
||||
}
|
||||
return getDisplayString(withNullability: options.nnbd);
|
||||
return getDisplayString(withNullability: true);
|
||||
} else {
|
||||
return type.codeString(options);
|
||||
}
|
||||
|
@ -101,8 +101,7 @@ extension OperationOnTypes on HasType {
|
|||
|
||||
String variableTypeCodeWithoutArray(
|
||||
[GenerationOptions options = const GenerationOptions()]) {
|
||||
final innerHasSuffix = nullable && options.nnbd;
|
||||
return innerHasSuffix ? '$variableTypeName?' : variableTypeName;
|
||||
return nullable ? '$variableTypeName?' : variableTypeName;
|
||||
}
|
||||
|
||||
/// The dart type that matches the values of this column. For instance, if a
|
||||
|
|
|
@ -134,7 +134,7 @@ class UsedTypeConverter {
|
|||
|
||||
String dartTypeCode(GenerationOptions options, bool nullableInSql) {
|
||||
var type = dartType.codeString(options);
|
||||
if (options.nnbd && (canBeSkippedForNulls && nullableInSql)) type += '?';
|
||||
if (canBeSkippedForNulls && nullableInSql) type += '?';
|
||||
|
||||
return type;
|
||||
}
|
||||
|
@ -142,7 +142,7 @@ class UsedTypeConverter {
|
|||
/// A suitable typename to store an instance of the type converter used here.
|
||||
String converterNameInCode(GenerationOptions options,
|
||||
{bool makeNullable = false}) {
|
||||
var sqlDartType = sqlType.getDisplayString(withNullability: options.nnbd);
|
||||
var sqlDartType = sqlType.getDisplayString(withNullability: true);
|
||||
if (makeNullable) sqlDartType += '?';
|
||||
|
||||
final className =
|
||||
|
|
|
@ -34,6 +34,6 @@ extension TypeUtils on DartType {
|
|||
return getDisplayString(withNullability: false);
|
||||
}
|
||||
|
||||
return getDisplayString(withNullability: options.nnbd);
|
||||
return getDisplayString(withNullability: true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,6 @@ class DatabaseWriter {
|
|||
getterName: entity.dbGetterName,
|
||||
returnType: tableClassName,
|
||||
code: '$tableClassName(this)',
|
||||
options: scope.generationOptions,
|
||||
);
|
||||
} else if (entity is MoorTrigger) {
|
||||
writeMemoizedGetter(
|
||||
|
@ -79,7 +78,6 @@ class DatabaseWriter {
|
|||
returnType: 'Trigger',
|
||||
code: 'Trigger(${asDartLiteral(entity.createSql(scope.options))}, '
|
||||
'${asDartLiteral(entity.displayName)})',
|
||||
options: scope.generationOptions,
|
||||
);
|
||||
} else if (entity is MoorIndex) {
|
||||
writeMemoizedGetter(
|
||||
|
@ -88,7 +86,6 @@ class DatabaseWriter {
|
|||
returnType: 'Index',
|
||||
code: 'Index(${asDartLiteral(entity.displayName)}, '
|
||||
'${asDartLiteral(entity.createSql(scope.options))})',
|
||||
options: scope.generationOptions,
|
||||
);
|
||||
} else if (entity is MoorView) {
|
||||
writeMemoizedGetter(
|
||||
|
@ -96,7 +93,6 @@ class DatabaseWriter {
|
|||
getterName: entity.dbGetterName,
|
||||
returnType: entity.entityInfoName,
|
||||
code: '${entity.entityInfoName}(this)',
|
||||
options: scope.generationOptions,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -112,7 +108,6 @@ class DatabaseWriter {
|
|||
getterName: getterName,
|
||||
returnType: typeName,
|
||||
code: '$typeName(this as $databaseImplName)',
|
||||
options: scope.generationOptions,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -170,7 +170,7 @@ class QueryWriter {
|
|||
String readingCode(ResultColumn column, GenerationOptions generationOptions,
|
||||
MoorOptions moorOptions) {
|
||||
var rawDartType = dartTypeNames[column.type];
|
||||
if (column.nullable && generationOptions.nnbd) {
|
||||
if (column.nullable) {
|
||||
rawDartType = '$rawDartType?';
|
||||
}
|
||||
|
||||
|
@ -419,9 +419,7 @@ class QueryWriter {
|
|||
(!isNullable || isMarkedAsRequired) && defaultCode == null ||
|
||||
options.namedParametersAlwaysRequired;
|
||||
if (isRequired) {
|
||||
_buffer
|
||||
..write(scope.required)
|
||||
..write(' ');
|
||||
_buffer.write('required ');
|
||||
}
|
||||
|
||||
_buffer.write('$type ${optional.dartParameterName}');
|
||||
|
@ -881,9 +879,7 @@ class _ExpandedVariableWriter {
|
|||
.write('${_converter(element.typeConverter!)}.toSql($dartExpr)');
|
||||
}
|
||||
|
||||
final needsNullAssertion =
|
||||
!element.nullable && scope.generationOptions.nnbd;
|
||||
if (needsNullAssertion) {
|
||||
if (!element.nullable) {
|
||||
buffer.write('!');
|
||||
}
|
||||
} else if (capture != null) {
|
||||
|
|
|
@ -44,7 +44,7 @@ class ResultSetWriter {
|
|||
final fieldName = nested.dartFieldName;
|
||||
|
||||
if (nested.isNullable) {
|
||||
typeName = scope.nullableType(typeName);
|
||||
typeName += '?';
|
||||
}
|
||||
|
||||
into.write('$modifier $typeName $fieldName;\n');
|
||||
|
@ -68,16 +68,14 @@ class ResultSetWriter {
|
|||
|
||||
// write the constructor
|
||||
if (scope.options.rawResultSetData) {
|
||||
into.write('$className({${scope.required} QueryRow row,');
|
||||
into.write('$className({required QueryRow row,');
|
||||
} else {
|
||||
into.write('$className({');
|
||||
}
|
||||
|
||||
for (final column in fieldNames) {
|
||||
if (nonNullableFields.contains(column)) {
|
||||
into
|
||||
..write(scope.required)
|
||||
..write(' ');
|
||||
into.write('required ');
|
||||
}
|
||||
into.write('this.$column,');
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ class DataClassWriter {
|
|||
_buffer = scope.leaf();
|
||||
}
|
||||
|
||||
String get serializerType => scope.nullableType('ValueSerializer');
|
||||
String get serializerType => 'ValueSerializer?';
|
||||
|
||||
String get _runtimeOptions => scope.generationOptions.writeForMoorPackage
|
||||
? 'moorRuntimeOptions'
|
||||
|
@ -65,7 +65,7 @@ class DataClassWriter {
|
|||
if (nullableDartType) {
|
||||
return 'this.${column.dartGetterName}';
|
||||
} else {
|
||||
return '${scope.required} this.${column.dartGetterName}';
|
||||
return 'required this.${column.dartGetterName}';
|
||||
}
|
||||
}).join(', '))
|
||||
..write('});');
|
||||
|
@ -108,7 +108,7 @@ class DataClassWriter {
|
|||
..write('factory $dataClassName.fromData')
|
||||
..write('(Map<String, dynamic> data, ')
|
||||
..write(includeUnusedDbColumn ? ' GeneratedDatabase db,' : '')
|
||||
..write('{${scope.nullableType('String')} prefix}) { \n')
|
||||
..write('{String? prefix}) { \n')
|
||||
..write("final effectivePrefix = prefix ?? '';");
|
||||
|
||||
final writer = RowMappingWriter(
|
||||
|
@ -211,7 +211,7 @@ class DataClassWriter {
|
|||
_buffer
|
||||
..write('Value<$typeName> ${column.dartGetterName} ')
|
||||
..write('= const Value.absent()');
|
||||
} else if (!isNullable && scope.generationOptions.nnbd) {
|
||||
} else if (!isNullable) {
|
||||
// We always use nullable parameters in copyWith, since all parameters
|
||||
// are optional. The !isNullable check is there to avoid a duplicate
|
||||
// question mark in the type name.
|
||||
|
@ -255,9 +255,9 @@ class DataClassWriter {
|
|||
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.
|
||||
final needsNullCheck = column.nullable || !scope.generationOptions.nnbd;
|
||||
// also include null columns. Since we' generating NNBD code, we can
|
||||
// include non-nullable columns without an additional null check.
|
||||
final needsNullCheck = column.nullable;
|
||||
final needsScope = needsNullCheck || column.typeConverter != null;
|
||||
if (needsNullCheck) {
|
||||
_buffer.write('if (!nullToAbsent || ${column.dartGetterName} != null)');
|
||||
|
@ -316,7 +316,7 @@ class DataClassWriter {
|
|||
..write(dartName)
|
||||
..write(': ');
|
||||
|
||||
final needsNullCheck = column.nullable || !scope.generationOptions.nnbd;
|
||||
final needsNullCheck = column.nullable;
|
||||
if (needsNullCheck) {
|
||||
_buffer
|
||||
..write(dartName)
|
||||
|
@ -369,7 +369,7 @@ class RowMappingWriter {
|
|||
final sqlType = 'const ${sqlTypes[column.type]}()';
|
||||
var loadType = '$sqlType.mapFromDatabaseResponse($rawData)';
|
||||
|
||||
if (!column.nullable && options.nnbd) {
|
||||
if (!column.nullable) {
|
||||
loadType += '!';
|
||||
}
|
||||
|
||||
|
|
|
@ -119,17 +119,15 @@ abstract class TableOrViewWriter {
|
|||
getterName: column.dartGetterName,
|
||||
returnType: type,
|
||||
code: expressionBuffer.toString(),
|
||||
options: options,
|
||||
hasOverride: isOverride,
|
||||
);
|
||||
}
|
||||
|
||||
void writeMappingMethod(Scope scope) {
|
||||
if (!scope.generationOptions.writeDataClasses) {
|
||||
final nullableString = scope.nullableType('String');
|
||||
buffer.writeln('''
|
||||
@override
|
||||
Never map(Map<String, dynamic> data, {$nullableString tablePrefix}) {
|
||||
Never map(Map<String, dynamic> data, {$String? tablePrefix}) {
|
||||
throw UnsupportedError('TableInfo.map in schema verification code');
|
||||
}
|
||||
''');
|
||||
|
@ -139,7 +137,7 @@ abstract class TableOrViewWriter {
|
|||
final dataClassName = tableOrView.dartTypeCode(scope.generationOptions);
|
||||
|
||||
buffer.write('@override\n$dataClassName map(Map<String, dynamic> data, '
|
||||
'{${scope.nullableType('String')} tablePrefix}) {\n');
|
||||
'{String? tablePrefix}) {\n');
|
||||
|
||||
if (tableOrView.hasExistingRowClass) {
|
||||
buffer.write('final effectivePrefix = '
|
||||
|
@ -275,7 +273,7 @@ class TableWriter extends TableOrViewWriter {
|
|||
..writeln('{')
|
||||
// write a GeneratedDatabase reference that is set in the constructor
|
||||
..writeln('@override final GeneratedDatabase attachedDatabase;')
|
||||
..writeln('final ${scope.nullableType('String')} _alias;')
|
||||
..writeln('final String? _alias;')
|
||||
..writeln(
|
||||
'${table.entityInfoName}(this.attachedDatabase, [this._alias]);');
|
||||
|
||||
|
@ -363,8 +361,6 @@ class TableWriter extends TableOrViewWriter {
|
|||
|
||||
const locals = {'instance', 'isInserting', 'context', 'data'};
|
||||
|
||||
final nonNullAssert = scope.generationOptions.nnbd ? '!' : '';
|
||||
|
||||
for (final column in table.columns) {
|
||||
final getterName = column.thisIfNeeded(locals);
|
||||
final metaName = _fieldNameForColumnMeta(column);
|
||||
|
@ -383,7 +379,7 @@ class TableWriter extends TableOrViewWriter {
|
|||
..write('context.handle('
|
||||
'$metaName, '
|
||||
'$getterName.isAcceptableOrUnknown('
|
||||
'data[$columnNameString]$nonNullAssert, $metaName));')
|
||||
'data[$columnNameString]!, $metaName));')
|
||||
..write('}');
|
||||
|
||||
if (table.isColumnRequiredForInsert(column)) {
|
||||
|
|
|
@ -85,7 +85,7 @@ class UpdateCompanionWriter {
|
|||
requiredColumns.add(column);
|
||||
final typeName = column.dartTypeCode(scope.generationOptions);
|
||||
|
||||
_buffer.write('${scope.required} $typeName $param,');
|
||||
_buffer.write('required $typeName $param,');
|
||||
} else {
|
||||
_buffer.write('this.$param = const Value.absent(),');
|
||||
}
|
||||
|
@ -124,8 +124,7 @@ class UpdateCompanionWriter {
|
|||
for (final column in columns) {
|
||||
// todo (breaking change): This should not consider type converters.
|
||||
final typeName = column.dartTypeCode(scope.generationOptions);
|
||||
final type = scope.nullableType('Expression<$typeName>');
|
||||
_buffer.write('$type ${column.dartGetterName}, \n');
|
||||
_buffer.write('Expression<$typeName>? ${column.dartGetterName}, \n');
|
||||
}
|
||||
|
||||
_buffer
|
||||
|
@ -154,8 +153,7 @@ class UpdateCompanionWriter {
|
|||
first = false;
|
||||
|
||||
final typeName = column.dartTypeCode(scope.generationOptions);
|
||||
final valueType = scope.nullableType('Value<$typeName>');
|
||||
_buffer.write('$valueType ${column.dartGetterName}');
|
||||
_buffer.write('Value<$typeName>? ${column.dartGetterName}');
|
||||
}
|
||||
|
||||
_buffer
|
||||
|
|
|
@ -41,7 +41,7 @@ class ViewWriter extends TableOrViewWriter {
|
|||
buffer.writeln(' implements HasResultSet {');
|
||||
|
||||
buffer
|
||||
..writeln('final ${scope.nullableType('String')} _alias;')
|
||||
..writeln('final String? _alias;')
|
||||
..writeln(
|
||||
'@override final ${databaseWriter.dbClassName} attachedDatabase;')
|
||||
..writeln('${view.entityInfoName}(this.attachedDatabase, '
|
||||
|
|
|
@ -14,25 +14,17 @@ import 'package:recase/recase.dart';
|
|||
///
|
||||
/// This means that [code] should be an expression without any trailing
|
||||
/// semicolon.
|
||||
void writeMemoizedGetter(
|
||||
{required StringBuffer buffer,
|
||||
void writeMemoizedGetter({
|
||||
required StringBuffer buffer,
|
||||
required String getterName,
|
||||
required String returnType,
|
||||
required String code,
|
||||
required GenerationOptions options,
|
||||
bool hasOverride = false}) {
|
||||
if (options.nnbd) {
|
||||
bool hasOverride = false,
|
||||
}) {
|
||||
if (hasOverride) {
|
||||
buffer.write('@override\n');
|
||||
}
|
||||
buffer.writeln('late final $returnType $getterName = $code;');
|
||||
} else {
|
||||
buffer.write('$returnType _$getterName;\n');
|
||||
if (hasOverride) {
|
||||
buffer.write('@override\n');
|
||||
}
|
||||
buffer.write('$returnType get $getterName => _$getterName ??= $code;');
|
||||
}
|
||||
}
|
||||
|
||||
/// Writes the following dart code into the [buffer]:
|
||||
|
@ -62,20 +54,10 @@ void writeMemoizedGetterWithBody(
|
|||
bool hasOverride = false}) {
|
||||
final constructingMethod = '_construct${ReCase(getterName).pascalCase}';
|
||||
|
||||
// We only need another field without nnbd
|
||||
if (!options.nnbd) buffer.write('$returnType _$getterName;\n');
|
||||
|
||||
if (hasOverride) {
|
||||
buffer.write('@override\n');
|
||||
}
|
||||
if (options.nnbd) {
|
||||
buffer
|
||||
.writeln('late final $returnType $getterName = $constructingMethod();');
|
||||
} else {
|
||||
buffer
|
||||
..write('$returnType get $getterName =>')
|
||||
..writeln(' _$getterName ??= $constructingMethod();');
|
||||
}
|
||||
buffer.writeln('late final $returnType $getterName = $constructingMethod();');
|
||||
|
||||
buffer
|
||||
..write('$returnType $constructingMethod() {\n')
|
||||
|
|
|
@ -108,9 +108,6 @@ class GenerationOptions {
|
|||
/// source.
|
||||
final int? forSchema;
|
||||
|
||||
/// Whether to generate Dart code that supports non-nullable types.
|
||||
final bool nnbd;
|
||||
|
||||
/// Whether data classes should be generated.
|
||||
final bool writeDataClasses;
|
||||
|
||||
|
@ -123,7 +120,6 @@ class GenerationOptions {
|
|||
|
||||
const GenerationOptions({
|
||||
this.forSchema,
|
||||
this.nnbd = false,
|
||||
this.writeDataClasses = true,
|
||||
this.writeCompanions = true,
|
||||
this.writeForMoorPackage = false,
|
||||
|
@ -132,10 +128,6 @@ class GenerationOptions {
|
|||
/// Whether, instead of generating the full database code, we're only
|
||||
/// generating a subset needed for schema verification.
|
||||
bool get isGeneratingForSchema => forSchema != null;
|
||||
|
||||
String nullableType(String withoutSuffix) {
|
||||
return nnbd ? '$withoutSuffix?' : withoutSuffix;
|
||||
}
|
||||
}
|
||||
|
||||
class _LeafNode extends _Node {
|
||||
|
@ -182,13 +174,3 @@ extension WriterUtilsForColumns on MoorColumn {
|
|||
return dartGetterName;
|
||||
}
|
||||
}
|
||||
|
||||
extension ScopeUtils on Scope {
|
||||
String get required {
|
||||
return generationOptions.nnbd ? 'required' : '@required';
|
||||
}
|
||||
|
||||
String nullableType(String withoutSuffix) {
|
||||
return generationOptions.nullableType(withoutSuffix);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import 'package:drift_dev/src/analyzer/dart/parser.dart';
|
|||
import 'package:drift_dev/src/analyzer/errors.dart';
|
||||
import 'package:drift_dev/src/analyzer/runner/steps.dart';
|
||||
import 'package:drift_dev/src/analyzer/session.dart';
|
||||
import 'package:drift_dev/writer.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
import '../../utils/test_backend.dart';
|
||||
|
@ -292,7 +291,7 @@ void main() {
|
|||
hasOverriddenSource ? isNotNull : isNull,
|
||||
)
|
||||
.having(
|
||||
(e) => e.dartType.codeString(const GenerationOptions(nnbd: true)),
|
||||
(e) => e.dartType.codeString(),
|
||||
'mappedType.codeString',
|
||||
toString,
|
||||
),
|
||||
|
|
|
@ -43,7 +43,7 @@ usersWithLongName: SELECT * FROM users WHERE LENGTH(name) > 25;
|
|||
expect(table.columns.map((c) => c.dartGetterName),
|
||||
['id', 'name', 'field', 'another', 'differentJson']);
|
||||
expect(table.columns.map((c) => c.dartTypeCode()),
|
||||
['int', 'String', 'bool', 'DateTime', 'int']);
|
||||
['int', 'String', 'bool?', 'DateTime?', 'int?']);
|
||||
expect(table.columns.map((c) => c.getJsonKey()),
|
||||
['id', 'name', 'field', 'another', 'myJsonKey']);
|
||||
|
||||
|
|
|
@ -28,32 +28,24 @@ class Database extends _$Database {}
|
|||
''';
|
||||
|
||||
void main() {
|
||||
group('generates mutable classes if needed', () {
|
||||
Future<void> _testWith(bool nnbd) async {
|
||||
test('generates mutable classes if needed', () async {
|
||||
await testBuilder(
|
||||
MoorPartBuilder(const BuilderOptions({'mutable_classes': true})),
|
||||
{'a|lib/main.dart': nnbd ? _testInput : '//@dart=2.6\n$_testInput'},
|
||||
const {'a|lib/main.dart': _testInput},
|
||||
reader: await PackageAssetReader.currentIsolate(),
|
||||
outputs: {
|
||||
outputs: const {
|
||||
'a|lib/main.moor.dart': _GeneratesWithoutFinalFields(
|
||||
{'User', 'UsersCompanion', 'SomeQueryResult'},
|
||||
isNullSafe: nnbd,
|
||||
),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
test('null-safety', () => _testWith(true));
|
||||
test('legacy', () => _testWith(false));
|
||||
}, tags: 'analyzer');
|
||||
}
|
||||
|
||||
class _GeneratesWithoutFinalFields extends Matcher {
|
||||
final Set<String> expectedWithoutFinals;
|
||||
final bool isNullSafe;
|
||||
|
||||
const _GeneratesWithoutFinalFields(this.expectedWithoutFinals,
|
||||
{this.isNullSafe = false});
|
||||
const _GeneratesWithoutFinalFields(this.expectedWithoutFinals);
|
||||
|
||||
@override
|
||||
Description describe(Description description) {
|
||||
|
@ -77,7 +69,7 @@ class _GeneratesWithoutFinalFields extends Matcher {
|
|||
final parsed = parseFile(
|
||||
path: '/foo.dart',
|
||||
featureSet: FeatureSet.fromEnableFlags2(
|
||||
sdkLanguageVersion: Version(2, isNullSafe ? 12 : 6, 0),
|
||||
sdkLanguageVersion: Version(2, 12, 0),
|
||||
flags: const [],
|
||||
),
|
||||
resourceProvider: resourceProvider,
|
||||
|
@ -122,6 +114,7 @@ class _GeneratesWithoutFinalFields extends Matcher {
|
|||
@override
|
||||
Description describeMismatch(dynamic item, Description mismatchDescription,
|
||||
Map matchState, bool verbose) {
|
||||
return mismatchDescription.add(matchState['desc'] as String);
|
||||
return mismatchDescription
|
||||
.add((matchState['desc'] as String?) ?? 'Had syntax errors');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,9 +21,8 @@ void main() {
|
|||
final file = await state.analyze('package:a/main.moor');
|
||||
final fileState = file.currentResult as ParsedMoorFile;
|
||||
|
||||
final writer = Writer(
|
||||
const MoorOptions.defaults(generateNamedParameters: true),
|
||||
generationOptions: const GenerationOptions(nnbd: true));
|
||||
final writer =
|
||||
Writer(const MoorOptions.defaults(generateNamedParameters: true));
|
||||
QueryWriter(writer.child()).write(fileState.resolvedQueries!.single);
|
||||
|
||||
expect(writer.writeGenerated(), contains('required List<int?> idList'));
|
||||
|
@ -44,9 +43,8 @@ void main() {
|
|||
final file = await state.analyze('package:a/main.moor');
|
||||
final fileState = file.currentResult as ParsedMoorFile;
|
||||
|
||||
final writer = Writer(
|
||||
const MoorOptions.defaults(newSqlCodeGeneration: true),
|
||||
generationOptions: const GenerationOptions(nnbd: true));
|
||||
final writer =
|
||||
Writer(const MoorOptions.defaults(newSqlCodeGeneration: true));
|
||||
QueryWriter(writer.child()).write(fileState.resolvedQueries!.single);
|
||||
|
||||
expect(
|
||||
|
@ -73,9 +71,8 @@ void main() {
|
|||
final file = await state.analyze('package:a/main.moor');
|
||||
final fileState = file.currentResult as ParsedMoorFile;
|
||||
|
||||
final writer = Writer(
|
||||
const MoorOptions.defaults(newSqlCodeGeneration: true),
|
||||
generationOptions: const GenerationOptions(nnbd: true));
|
||||
final writer =
|
||||
Writer(const MoorOptions.defaults(newSqlCodeGeneration: true));
|
||||
QueryWriter(writer.child()).write(fileState.resolvedQueries!.single);
|
||||
|
||||
expect(
|
||||
|
@ -112,10 +109,7 @@ void main() {
|
|||
|
||||
expect(file.errors.errors, isEmpty);
|
||||
|
||||
final writer = Writer(
|
||||
options,
|
||||
generationOptions: const GenerationOptions(nnbd: true),
|
||||
);
|
||||
final writer = Writer(options);
|
||||
QueryWriter(writer.child()).write(fileState.resolvedQueries!.single);
|
||||
|
||||
expect(writer.writeGenerated(), expectation);
|
||||
|
@ -178,10 +172,7 @@ void main() {
|
|||
|
||||
expect(file.errors.errors, isEmpty);
|
||||
|
||||
final writer = Writer(
|
||||
options,
|
||||
generationOptions: const GenerationOptions(nnbd: true),
|
||||
);
|
||||
final writer = Writer(options);
|
||||
QueryWriter(writer.child()).write(fileState.resolvedQueries!.single);
|
||||
|
||||
final result = writer.writeGenerated();
|
||||
|
@ -196,10 +187,8 @@ void main() {
|
|||
|
||||
expect(file.errors.errors, isEmpty);
|
||||
|
||||
final writer = Writer(
|
||||
const MoorOptions.defaults(newSqlCodeGeneration: false),
|
||||
generationOptions: const GenerationOptions(nnbd: true),
|
||||
);
|
||||
final writer =
|
||||
Writer(const MoorOptions.defaults(newSqlCodeGeneration: false));
|
||||
|
||||
expect(
|
||||
() => QueryWriter(writer.child())
|
||||
|
|
Loading…
Reference in New Issue