part of '_json_serializable_test_input.dart'; @ShouldGenerate(r''' SubType _$SubTypeFromJson(Map json) { return SubType( json['subTypeViaCtor'] as int, json['super-final-field'] as int) ..superReadWriteField = json['superReadWriteField'] as int ..subTypeReadWrite = json['subTypeReadWrite'] as int; } Map _$SubTypeToJson(SubType instance) { final val = { 'super-final-field': instance.superFinalField, }; void writeNotNull(String key, dynamic value) { if (value != null) { val[key] = value; } } writeNotNull('superReadWriteField', instance.superReadWriteField); val['subTypeViaCtor'] = instance.subTypeViaCtor; val['subTypeReadWrite'] = instance.subTypeReadWrite; return val; } ''', expectedWrappedOutput: r''' SubType _$SubTypeFromJson(Map json) { return SubType( json['subTypeViaCtor'] as int, json['super-final-field'] as int) ..superReadWriteField = json['superReadWriteField'] as int ..subTypeReadWrite = json['subTypeReadWrite'] as int; } Map _$SubTypeToJson(SubType instance) => _$SubTypeJsonMapWrapper(instance); class _$SubTypeJsonMapWrapper extends $JsonMapWrapper { final SubType _v; _$SubTypeJsonMapWrapper(this._v); @override Iterable get keys sync* { yield 'super-final-field'; if (_v.superReadWriteField != null) { yield 'superReadWriteField'; } yield 'subTypeViaCtor'; yield 'subTypeReadWrite'; } @override dynamic operator [](Object key) { if (key is String) { switch (key) { case 'super-final-field': return _v.superFinalField; case 'superReadWriteField': return _v.superReadWriteField; case 'subTypeViaCtor': return _v.subTypeViaCtor; case 'subTypeReadWrite': return _v.subTypeReadWrite; } } return null; } } ''') @JsonSerializable() class SubType extends SuperType { final int subTypeViaCtor; int subTypeReadWrite; SubType(this.subTypeViaCtor, int superFinalField) : super(superFinalField); } // NOTE: `SuperType` is intentionally after `SubType` in the source file to // validate field ordering semantics. class SuperType { @JsonKey(name: 'super-final-field', nullable: false) final int superFinalField; @JsonKey(includeIfNull: false) int superReadWriteField; SuperType(this.superFinalField); /// Add a property to try to throw-off the generator /// Since `priceHalf` is final and not in the constructor, it will be excluded int get priceHalf => priceFraction(2); /// Add a method to try to throw-off the generator int priceFraction(int other) => superFinalField == null ? null : superFinalField ~/ other; } @ShouldGenerate(r''' Map _$SubTypeWithAnnotatedFieldOverrideExtendsToJson( SubTypeWithAnnotatedFieldOverrideExtends instance) { final val = { 'super-final-field': instance.superFinalField, }; void writeNotNull(String key, dynamic value) { if (value != null) { val[key] = value; } } writeNotNull('superReadWriteField', instance.superReadWriteField); val['priceHalf'] = instance.priceHalf; return val; } ''') @JsonSerializable(createFactory: false) class SubTypeWithAnnotatedFieldOverrideExtends extends SuperType { SubTypeWithAnnotatedFieldOverrideExtends(int superTypeViaCtor) : super(superTypeViaCtor); } @ShouldGenerate(r''' Map _$SubTypeWithAnnotatedFieldOverrideExtendsWithOverridesToJson( SubTypeWithAnnotatedFieldOverrideExtendsWithOverrides instance) => { 'priceHalf': instance.priceHalf, 'superReadWriteField': instance.superReadWriteField, 'super-final-field': instance.superFinalField }; ''') @JsonSerializable(createFactory: false) class SubTypeWithAnnotatedFieldOverrideExtendsWithOverrides extends SuperType { SubTypeWithAnnotatedFieldOverrideExtendsWithOverrides(int superTypeViaCtor) : super(superTypeViaCtor); /// The annotation applied here overrides the annotation in [SuperType]. @JsonKey(includeIfNull: true) @override int get superReadWriteField => super.superReadWriteField; @override set superReadWriteField(int value) { super.superReadWriteField = value; } /// The order is picked up by this override, but the annotation is still /// applied from [SuperType]. @override int get superFinalField => super.superFinalField; } @ShouldGenerate(r''' Map _$SubTypeWithAnnotatedFieldOverrideImplementsToJson( SubTypeWithAnnotatedFieldOverrideImplements instance) => { 'superReadWriteField': instance.superReadWriteField, 'superFinalField': instance.superFinalField }; ''') @JsonSerializable(createFactory: false) class SubTypeWithAnnotatedFieldOverrideImplements implements SuperType { // Note the order of fields in the output is determined by this class @override int superReadWriteField; @JsonKey(ignore: true) @override int get priceHalf => 42; /// Since the relationship is `implements` no [JsonKey] values from /// [SuperType] are honored. @override int get superFinalField => 42; @override int priceFraction(int other) => other; }