Remove support for non-nnbd code

This commit is contained in:
Simon Binder 2022-07-01 21:34:02 +02:00
parent 9014fa82a8
commit 52c07c9d3f
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
24 changed files with 92 additions and 214 deletions

View File

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

View File

@ -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();

View File

@ -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.',
);
}
}

View File

@ -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,
),
);

View File

@ -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');
}
}

View File

@ -88,7 +88,7 @@ class ExistingRowClass {
typeArguments: typeInstantiation,
nullabilitySuffix: NullabilitySuffix.none,
)
.getDisplayString(withNullability: options.nnbd);
.getDisplayString(withNullability: true);
}
}
}

View File

@ -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() {

View File

@ -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?>';
}
}

View File

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

View File

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

View File

@ -34,6 +34,6 @@ extension TypeUtils on DartType {
return getDisplayString(withNullability: false);
}
return getDisplayString(withNullability: options.nnbd);
return getDisplayString(withNullability: true);
}
}

View File

@ -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,
);
}

View File

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

View File

@ -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,');
}

View File

@ -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 += '!';
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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);
}
}

View File

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

View File

@ -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']);

View File

@ -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');
}
}

View File

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