Skip to content

Commit 15ed01f

Browse files
committed
Made nullable sentinel static
1 parent b98071b commit 15ed01f

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

packages/crystallis/lib/runtime/mixin.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import 'package:meta/meta.dart';
44
import 'field_metadata.dart';
55
import 'validator.dart';
66

7+
/// Sentinel value used to represent true nullability in [copyWith] parameters.
8+
enum _NullableSentinel { i }
9+
710
/// Mixin class that provides validation functionality for data classes.
811
/// Applied to classes generated with [Crystallise].
912
abstract mixin class CrystallisData {
@@ -14,6 +17,11 @@ abstract mixin class CrystallisData {
1417
@protected
1518
Crystallise get config;
1619

20+
/// Nullable value sentinel used in generated [copyWith] methods.
21+
@protected
22+
// ignore: library_private_types_in_public_api
23+
static const _NullableSentinel nullValue = _NullableSentinel.i;
24+
1725
/// Get the value of a field by name.
1826
/// To see what type it might be, check [metadata].
1927
///

packages/crystallis_generator/lib/crystallis_generator.dart

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,6 @@ class CrystallisGenerator extends GeneratorForAnnotation<Crystallise> {
109109
buffer.writeln();
110110
}
111111

112-
if (enableCopyWith) {
113-
buffer.writeln('enum _Sentinel { i }');
114-
buffer.writeln();
115-
}
116-
117112
// class declaration
118113
if (!mutable) {
119114
buffer.writeln("@immutable");
@@ -323,12 +318,12 @@ class CrystallisGenerator extends GeneratorForAnnotation<Crystallise> {
323318
var objectQuestionType = element.library.typeProvider.objectQuestionType;
324319
var objectType = element.library.typeProvider.objectType;
325320
for (final f in fields) {
326-
buffer.write('${f.type.isNullable ? objectQuestionType : objectType} ${f.name} = _Sentinel.i,');
321+
buffer.write('${f.type.isNullable ? objectQuestionType : objectType} ${f.name} = CrystallisData.nullValue,');
327322
}
328323
buffer.writeln('}) => $publicName(');
329324
for (final f in fields) {
330325
var prefix = ' ' * 6;
331-
buffer.write('$prefix${f.name}: ${f.name} == _Sentinel.i');
326+
buffer.write('$prefix${f.name}: ${f.name} == CrystallisData.nullValue');
332327
if (useDeepCopy && (f.type.isDartCoreList || f.type.isDartCoreSet || f.type.isDartCoreMap)) {
333328
final bool curly = !f.type.isDartCoreList;
334329
String open = curly ? '{' : '[';

packages/crystallis_generator/test/generated_golden.test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,8 @@ void main() {
398398
final generated = outputs['$outputPackage|lib/user.data.g.dart']!;
399399
expect(generated, contains('UserData Function({'));
400400
expect(generated, contains('}) get copyWith =>'));
401-
expect(generated, contains('Object friends = _Sentinel.i'));
402-
expect(generated, contains('friends: friends == _Sentinel.i'));
401+
expect(generated, contains('Object friends = CrystallisData.nullValue'));
402+
expect(generated, contains('friends: friends == CrystallisData.nullValue'));
403403
expect(generated, contains('this.friends'));
404404
expect(generated, isNot(contains('...this.friends')));
405405
expect(generated, contains('friends as List<String>'));
@@ -417,8 +417,8 @@ void main() {
417417
final generated = outputs['$outputPackage|lib/user.data.g.dart']!;
418418
expect(generated, contains('UserData Function({'));
419419
expect(generated, contains('}) get copyWith =>'));
420-
expect(generated, contains('Object friends = _Sentinel.i'));
421-
expect(generated, contains('friends: friends == _Sentinel.i'));
420+
expect(generated, contains('Object friends = CrystallisData.nullValue'));
421+
expect(generated, contains('friends: friends == CrystallisData.nullValue'));
422422
expect(generated, contains('[...this.friends]'));
423423
expect(generated, contains('[...friends as List<String>]'));
424424
});

0 commit comments

Comments
 (0)