Skip to content

Commit 341839c

Browse files
author
Johyn Papin
committed
Adds the nullable option which allows to use nullable types in addition to hazzers.
1 parent cc0f287 commit 341839c

8 files changed

+237
-17
lines changed

protobuf/lib/meta.dart

+14
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const GeneratedMessage_reservedNames = <String>[
4949
'runtimeType',
5050
'setExtension',
5151
'setField',
52+
'setFieldNullable',
5253
'toBuilder',
5354
'toDebugString',
5455
'toProto3Json',
@@ -60,25 +61,38 @@ const GeneratedMessage_reservedNames = <String>[
6061
'writeToJsonMap',
6162
r'$_ensure',
6263
r'$_get',
64+
r'$_getNullable',
6365
r'$_getI64',
66+
r'$_getI64Nullable',
6467
r'$_getList',
6568
r'$_getMap',
6669
r'$_getN',
6770
r'$_getB',
6871
r'$_getBF',
72+
r'$_getBNullable',
6973
r'$_getI',
7074
r'$_getIZ',
75+
r'$_getINullable',
7176
r'$_getS',
7277
r'$_getSZ',
78+
r'$_getSNullable',
7379
r'$_has',
7480
r'$_setBool',
81+
r'$_setBoolNullable',
7582
r'$_setBytes',
83+
r'$_setBytesNullable',
7684
r'$_setDouble',
85+
r'$_setDoubleNullable',
7786
r'$_setFloat',
87+
r'$_setFloatNullable',
7888
r'$_setInt64',
89+
r'$_setInt64Nullable',
7990
r'$_setSignedInt32',
91+
r'$_setSignedInt32Nullable',
8092
r'$_setString',
93+
r'$_setStringNullable',
8194
r'$_setUnsignedInt32',
95+
r'$_setUnsignedInt32Nullable',
8296
r'$_whichOneof',
8397
];
8498

protobuf/lib/src/protobuf/field_set.dart

+58
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,38 @@ class _FieldSet {
280280
_setNonExtensionFieldUnchecked(meta, fi, value);
281281
}
282282

283+
/// Sets a non-repeated nullable field with error-checking.
284+
///
285+
/// Works for both extended and non-extended fields.
286+
/// Suitable for public API.
287+
void _setFieldNullable(int tagNumber, Object? value) {
288+
final meta = _meta;
289+
var fi = _nonExtensionInfo(meta, tagNumber);
290+
if (fi == null) {
291+
final extensions = _extensions;
292+
if (extensions == null) {
293+
throw ArgumentError('tag $tagNumber not defined in $_messageName');
294+
}
295+
if (value == null) {
296+
_clearField(tagNumber);
297+
return;
298+
}
299+
extensions._setField(tagNumber, value);
300+
return;
301+
}
302+
303+
if (fi.isRepeated) {
304+
throw ArgumentError(_setFieldFailedMessage(
305+
fi, value, 'repeating field (use get + .add())'));
306+
}
307+
if (value == null) {
308+
_clearField(tagNumber);
309+
return;
310+
}
311+
_validateField(fi, value);
312+
_setNonExtensionFieldUnchecked(meta, fi, value);
313+
}
314+
283315
/// Sets a non-repeated field without validating it.
284316
///
285317
/// Works for both extended and non-extended fields.
@@ -431,6 +463,9 @@ class _FieldSet {
431463
/// `false`.
432464
bool _$getBF(int index) => _values[index] ?? false;
433465

466+
/// The implementation of a generated getter for nullable `bool` fields.
467+
bool? _$getBNullable(int index) => _values[index];
468+
434469
/// The implementation of a generated getter for int fields.
435470
int _$getI(int index, int? defaultValue) {
436471
var value = _values[index];
@@ -445,6 +480,9 @@ class _FieldSet {
445480
/// fixed32, sfixed32) that default to `0`.
446481
int _$getIZ(int index) => _values[index] ?? 0;
447482

483+
/// The implementation of a generated getter for nullable int fields.
484+
int? _$getINullable(int index) => _values[index];
485+
448486
/// The implementation of a generated getter for String fields.
449487
String _$getS(int index, String? defaultValue) {
450488
var value = _values[index];
@@ -459,13 +497,19 @@ class _FieldSet {
459497
/// the empty string.
460498
String _$getSZ(int index) => _values[index] ?? '';
461499

500+
/// The implementation of a generated getter for nullable String fields.
501+
String? _$getSNullable(int index) => _values[index];
502+
462503
/// The implementation of a generated getter for Int64 fields.
463504
Int64 _$getI64(int index) {
464505
var value = _values[index];
465506
value ??= _getDefault(_nonExtensionInfoByIndex(index));
466507
return value;
467508
}
468509

510+
/// The implementation of a generated getter for nullable Int64 fields.
511+
Int64? _$getI64Nullable(int index) => _values[index];
512+
469513
/// The implementation of a generated 'has' method.
470514
bool _$has(int index) {
471515
var value = _values[index];
@@ -504,11 +548,25 @@ class _FieldSet {
504548
_values[index] = value;
505549
}
506550

551+
void _$setNullable(int index, Object? value) {
552+
assert(!_nonExtensionInfoByIndex(index).isRepeated);
553+
assert(value == null || _$check(index, value));
554+
if (value == null) {
555+
_clearField(_meta.byIndex[index].tagNumber);
556+
return;
557+
}
558+
559+
_$set(index, value);
560+
}
561+
507562
bool _$check(int index, var newValue) {
508563
_validateField(_nonExtensionInfoByIndex(index), newValue);
509564
return true; // Allows use in an assertion.
510565
}
511566

567+
/// The implementation of a generated nullable getter.
568+
T _$getNullable<T>(int index) => _values[index];
569+
512570
// Bulk operations reading or writing multiple fields
513571

514572
void _clear() {

protobuf/lib/src/protobuf/generated_message.dart

+81
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,15 @@ abstract class GeneratedMessage {
402402
_fieldSet._setField(tagNumber, value);
403403
}
404404

405+
/// Sets the value of a field by its [tagNumber].
406+
///
407+
/// Throws an [ArgumentError] if [value] does not match the type associated
408+
/// with [tagNumber].
409+
@pragma('dart2js:noInline')
410+
void setFieldNullable(int tagNumber, Object? value) {
411+
_fieldSet._setFieldNullable(tagNumber, value);
412+
}
413+
405414
/// For generated code only.
406415
/// @nodoc
407416
T $_get<T>(int index, T defaultValue) =>
@@ -411,6 +420,10 @@ abstract class GeneratedMessage {
411420
/// @nodoc
412421
T $_getN<T>(int index) => _fieldSet._$getND(index);
413422

423+
/// For generated code only.
424+
/// @nodoc
425+
T $_getNullable<T>(int index) => _fieldSet._$getNullable<T>(index);
426+
414427
/// For generated code only.
415428
/// @nodoc
416429
T $_ensure<T>(int index) => _fieldSet._$ensure<T>(index);
@@ -432,6 +445,10 @@ abstract class GeneratedMessage {
432445
/// @nodoc
433446
bool $_getBF(int index) => _fieldSet._$getBF(index);
434447

448+
/// For generated code only.
449+
/// @nodoc
450+
bool? $_getBNullable(int index) => _fieldSet._$getBNullable(index);
451+
435452
/// For generated code only.
436453
/// @nodoc
437454
int $_getI(int index, int defaultValue) =>
@@ -441,6 +458,10 @@ abstract class GeneratedMessage {
441458
/// @nodoc
442459
int $_getIZ(int index) => _fieldSet._$getIZ(index);
443460

461+
/// For generated code only.
462+
/// @nodoc
463+
int? $_getINullable(int index) => _fieldSet._$getINullable(index);
464+
444465
/// For generated code only.
445466
/// @nodoc
446467
String $_getS(int index, String defaultValue) =>
@@ -450,10 +471,18 @@ abstract class GeneratedMessage {
450471
/// @nodoc
451472
String $_getSZ(int index) => _fieldSet._$getSZ(index);
452473

474+
/// For generated code only.
475+
/// @nodoc
476+
String? $_getSNullable(int index) => _fieldSet._$getSNullable(index);
477+
453478
/// For generated code only.
454479
/// @nodoc
455480
Int64 $_getI64(int index) => _fieldSet._$getI64(index);
456481

482+
/// For generated code only.
483+
/// @nodoc
484+
Int64? $_getI64Nullable(int index) => _fieldSet._$getI64Nullable(index);
485+
457486
/// For generated code only.
458487
/// @nodoc
459488
bool $_has(int index) => _fieldSet._$has(index);
@@ -462,14 +491,29 @@ abstract class GeneratedMessage {
462491
/// @nodoc
463492
void $_setBool(int index, bool value) => _fieldSet._$set(index, value);
464493

494+
/// For generated code only.
495+
/// @nodoc
496+
void $_setBoolNullable(int index, bool? value) =>
497+
_fieldSet._$setNullable(index, value);
498+
465499
/// For generated code only.
466500
/// @nodoc
467501
void $_setBytes(int index, List<int> value) => _fieldSet._$set(index, value);
468502

503+
/// For generated code only.
504+
/// @nodoc
505+
void $_setBytesNullable(int index, List<int>? value) =>
506+
_fieldSet._$setNullable(index, value);
507+
469508
/// For generated code only.
470509
/// @nodoc
471510
void $_setString(int index, String value) => _fieldSet._$set(index, value);
472511

512+
/// For generated code only.
513+
/// @nodoc
514+
void $_setStringNullable(int index, String? value) =>
515+
_fieldSet._$setNullable(index, value);
516+
473517
/// For generated code only.
474518
/// @nodoc
475519
void $_setFloat(int index, double value) {
@@ -480,10 +524,24 @@ abstract class GeneratedMessage {
480524
_fieldSet._$set(index, value);
481525
}
482526

527+
/// For generated code only.
528+
/// @nodoc
529+
void $_setFloatNullable(int index, double? value) {
530+
if (value != null && !_isFloat32(value)) {
531+
_fieldSet._$check(index, value);
532+
}
533+
_fieldSet._$setNullable(index, value);
534+
}
535+
483536
/// For generated code only.
484537
/// @nodoc
485538
void $_setDouble(int index, double value) => _fieldSet._$set(index, value);
486539

540+
/// For generated code only.
541+
/// @nodoc
542+
void $_setDoubleNullable(int index, double? value) =>
543+
_fieldSet._$setNullable(index, value);
544+
487545
/// For generated code only.
488546
/// @nodoc
489547
void $_setSignedInt32(int index, int value) {
@@ -494,6 +552,15 @@ abstract class GeneratedMessage {
494552
_fieldSet._$set(index, value);
495553
}
496554

555+
/// For generated code only.
556+
/// @nodoc
557+
void $_setSignedInt32Nullable(int index, int? value) {
558+
if (value != null && !_isSigned32(value)) {
559+
_fieldSet._$check(index, value);
560+
}
561+
_fieldSet._$setNullable(index, value);
562+
}
563+
497564
/// For generated code only.
498565
/// @nodoc
499566
void $_setUnsignedInt32(int index, int value) {
@@ -504,10 +571,24 @@ abstract class GeneratedMessage {
504571
_fieldSet._$set(index, value);
505572
}
506573

574+
/// For generated code only.
575+
/// @nodoc
576+
void $_setUnsignedInt32Nullable(int index, int? value) {
577+
if (value != null && !_isUnsigned32(value)) {
578+
_fieldSet._$check(index, value);
579+
}
580+
_fieldSet._$setNullable(index, value);
581+
}
582+
507583
/// For generated code only.
508584
/// @nodoc
509585
void $_setInt64(int index, Int64 value) => _fieldSet._$set(index, value);
510586

587+
/// For generated code only.
588+
/// @nodoc
589+
void $_setInt64Nullable(int index, Int64? value) =>
590+
_fieldSet._$setNullable(index, value);
591+
511592
// Support for generating a read-only default singleton instance.
512593

513594
static final Map<Function?, _SingletonMaker<GeneratedMessage>>

protoc_plugin/lib/src/file_generator.dart

+8-2
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,14 @@ class FileGenerator extends ProtobufContainer {
166166
descriptor.enumType[i], this, usedTopLevelNames, i));
167167
}
168168
for (var i = 0; i < descriptor.messageType.length; i++) {
169-
messageGenerators.add(MessageGenerator.topLevel(descriptor.messageType[i],
170-
this, declaredMixins, defaultMixin, usedTopLevelNames, i));
169+
messageGenerators.add(MessageGenerator.topLevel(
170+
descriptor.messageType[i],
171+
this,
172+
declaredMixins,
173+
defaultMixin,
174+
usedTopLevelNames,
175+
i,
176+
options.useNullable));
171177
}
172178
for (var i = 0; i < descriptor.extension.length; i++) {
173179
extensionGenerators.add(ExtensionGenerator.topLevel(

0 commit comments

Comments
 (0)