Skip to content

Commit

Permalink
fix: xml converter iterable fields
Browse files Browse the repository at this point in the history
  • Loading branch information
tnc1997 committed Nov 30, 2024
1 parent 2630ea2 commit 07a4327
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,9 @@ BuilderGenerator xmlElementBuilderGeneratorFactory(FieldElement element) {
final type = element.type;
if (type is ParameterizedType &&
(type.isDartCoreIterable || type.isDartCoreList || type.isDartCoreSet)) {
final converterElement = element.getXmlConverterElement(type: type);
final converterElement = element.getXmlConverterElement(
type: type.typeArguments.single,
);
if (converterElement is ClassElement) {
return IterableBuilderGenerator(
XmlConverterXmlElementBuilderGenerator(
Expand Down Expand Up @@ -141,7 +143,9 @@ BuilderGenerator xmlElementBuilderGeneratorFactory(FieldElement element) {
);
}
} else {
final converterElement = element.getXmlConverterElement(type: type);
final converterElement = element.getXmlConverterElement(
type: type,
);
if (converterElement is ClassElement) {
return XmlConverterXmlElementBuilderGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ ConstructorGenerator xmlElementConstructorGeneratorFactory(
final type = element.type;
if (type is ParameterizedType &&
(type.isDartCoreIterable || type.isDartCoreList || type.isDartCoreSet)) {
final converterElement = element.getXmlConverterElement(type: type);
final converterElement = element.getXmlConverterElement(
type: type.typeArguments.single,
);
if (converterElement is ClassElement) {
return IterableConstructorGenerator(
XmlConverterXmlElementConstructorGenerator(
Expand Down Expand Up @@ -147,7 +149,9 @@ ConstructorGenerator xmlElementConstructorGeneratorFactory(
);
}
} else {
final converterElement = element.getXmlConverterElement(type: type);
final converterElement = element.getXmlConverterElement(
type: type,
);
if (converterElement is ClassElement) {
return XmlConverterXmlElementConstructorGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@ GetterGenerator xmlElementGetterGeneratorFactory(FieldElement element) {
final type = element.type;
if (type is ParameterizedType &&
(type.isDartCoreIterable || type.isDartCoreList || type.isDartCoreSet)) {
final converterElement = element.getXmlConverterElement(type: type);
final converterElement = element.getXmlConverterElement(
type: type.typeArguments.single,
);
if (converterElement is ClassElement) {
return XmlConverterXmlElementIterableGetterGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
Expand Down Expand Up @@ -117,7 +119,9 @@ GetterGenerator xmlElementGetterGeneratorFactory(FieldElement element) {
);
}
} else {
final converterElement = element.getXmlConverterElement(type: type);
final converterElement = element.getXmlConverterElement(
type: type,
);
if (converterElement is ClassElement) {
return XmlConverterXmlElementGetterGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
Expand Down
4 changes: 3 additions & 1 deletion xml_serializable/lib/src/xml_serializable_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,9 @@ class XmlSerializableGenerator extends GeneratorForAnnotation<XmlSerializable> {
type ??= element.type;

if (element.hasXmlElement) {
final converterElement = element.getXmlConverterElement(type: type);
final converterElement = element.getXmlConverterElement(
type: type,
);
if (converterElement is ClassElement) {
return XmlConverterXmlElementSerializerGenerator(
converterElement.name,
Expand Down
105 changes: 105 additions & 0 deletions xml_serializable/test/xml_converter_src.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,40 @@ class ClassAnnotationInconvertibleElementField {
ClassAnnotationInconvertibleElementField({required this.value});
}

@ShouldGenerate(r'''
void _$ClassAnnotationIterableElementFieldBuildXmlChildren(ClassAnnotationIterableElementField instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) {
final value = instance.value;
final valueSerialized = value;
for (final value in valueSerialized) { builder.element('value', nest: () { const ElementDateTimeConverter().buildXmlChildren(value, builder, namespaces: namespaces); }); }
}
ClassAnnotationIterableElementField _$ClassAnnotationIterableElementFieldFromXmlElement(XmlElement element) {
final value = element.getElements('value')!;
return ClassAnnotationIterableElementField(value: value.map((e) => const ElementDateTimeConverter().fromXmlElement(e)).toList());
}
List<XmlAttribute> _$ClassAnnotationIterableElementFieldToXmlAttributes(ClassAnnotationIterableElementField instance, {Map<String, String?> namespaces = const {}}) {
final attributes = <XmlAttribute>[];
return attributes;
}
List<XmlNode> _$ClassAnnotationIterableElementFieldToXmlChildren(ClassAnnotationIterableElementField instance, {Map<String, String?> namespaces = const {}}) {
final children = <XmlNode>[];
final value = instance.value;
final valueSerialized = value;
final valueConstructed = valueSerialized.map((e) => XmlElement(XmlName('value'), const ElementDateTimeConverter().toXmlAttributes(e, namespaces: namespaces), const ElementDateTimeConverter().toXmlChildren(e, namespaces: namespaces)));
children.addAll(valueConstructed);
return children;
}''')
@annotation.XmlSerializable()
@ElementDateTimeConverter()
class ClassAnnotationIterableElementField {
@annotation.XmlElement()
List<DateTime> value;

ClassAnnotationIterableElementField({required this.value});
}

@ShouldGenerate(r'''
void _$ClassAnnotationNullableElementFieldBuildXmlChildren(ClassAnnotationNullableElementField instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) {
final value = instance.value;
Expand Down Expand Up @@ -240,6 +274,40 @@ class FieldAnnotationInconvertibleElementField {
FieldAnnotationInconvertibleElementField({required this.value});
}

@ShouldGenerate(r'''
void _$FieldAnnotationIterableElementFieldBuildXmlChildren(FieldAnnotationIterableElementField instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) {
final value = instance.value;
final valueSerialized = value;
for (final value in valueSerialized) { builder.element('value', nest: () { const ElementDateTimeConverter().buildXmlChildren(value, builder, namespaces: namespaces); }); }
}
FieldAnnotationIterableElementField _$FieldAnnotationIterableElementFieldFromXmlElement(XmlElement element) {
final value = element.getElements('value')!;
return FieldAnnotationIterableElementField(value: value.map((e) => const ElementDateTimeConverter().fromXmlElement(e)).toList());
}
List<XmlAttribute> _$FieldAnnotationIterableElementFieldToXmlAttributes(FieldAnnotationIterableElementField instance, {Map<String, String?> namespaces = const {}}) {
final attributes = <XmlAttribute>[];
return attributes;
}
List<XmlNode> _$FieldAnnotationIterableElementFieldToXmlChildren(FieldAnnotationIterableElementField instance, {Map<String, String?> namespaces = const {}}) {
final children = <XmlNode>[];
final value = instance.value;
final valueSerialized = value;
final valueConstructed = valueSerialized.map((e) => XmlElement(XmlName('value'), const ElementDateTimeConverter().toXmlAttributes(e, namespaces: namespaces), const ElementDateTimeConverter().toXmlChildren(e, namespaces: namespaces)));
children.addAll(valueConstructed);
return children;
}''')
@annotation.XmlSerializable()
class FieldAnnotationIterableElementField {
@annotation.XmlElement()
@ElementDateTimeConverter()
List<DateTime> value;

FieldAnnotationIterableElementField({required this.value});
}

@ShouldGenerate(r'''
void _$FieldAnnotationNullableElementFieldBuildXmlChildren(FieldAnnotationNullableElementField instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) {
final value = instance.value;
Expand Down Expand Up @@ -630,6 +698,43 @@ class SerializableConverterInconvertibleElementField {
SerializableConverterInconvertibleElementField({required this.value});
}

@ShouldGenerate(r'''
void _$SerializableConverterIterableElementFieldBuildXmlChildren(SerializableConverterIterableElementField instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) {
final value = instance.value;
final valueSerialized = value;
for (final value in valueSerialized) { builder.element('value', nest: () { const ElementDateTimeConverter().buildXmlChildren(value, builder, namespaces: namespaces); }); }
}
SerializableConverterIterableElementField _$SerializableConverterIterableElementFieldFromXmlElement(XmlElement element) {
final value = element.getElements('value')!;
return SerializableConverterIterableElementField(value: value.map((e) => const ElementDateTimeConverter().fromXmlElement(e)).toList());
}
List<XmlAttribute> _$SerializableConverterIterableElementFieldToXmlAttributes(SerializableConverterIterableElementField instance, {Map<String, String?> namespaces = const {}}) {
final attributes = <XmlAttribute>[];
return attributes;
}
List<XmlNode> _$SerializableConverterIterableElementFieldToXmlChildren(SerializableConverterIterableElementField instance, {Map<String, String?> namespaces = const {}}) {
final children = <XmlNode>[];
final value = instance.value;
final valueSerialized = value;
final valueConstructed = valueSerialized.map((e) => XmlElement(XmlName('value'), const ElementDateTimeConverter().toXmlAttributes(e, namespaces: namespaces), const ElementDateTimeConverter().toXmlChildren(e, namespaces: namespaces)));
children.addAll(valueConstructed);
return children;
}''')
@annotation.XmlSerializable(
converters: [
ElementDateTimeConverter(),
],
)
class SerializableConverterIterableElementField {
@annotation.XmlElement()
List<DateTime> value;

SerializableConverterIterableElementField({required this.value});
}

@ShouldGenerate(r'''
void _$SerializableConverterNullableElementFieldBuildXmlChildren(SerializableConverterNullableElementField instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) {
final value = instance.value;
Expand Down
3 changes: 3 additions & 0 deletions xml_serializable/test/xml_converter_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ Future<void> main() async {
'ClassAnnotationAttributeField',
'ClassAnnotationElementField',
'ClassAnnotationInconvertibleElementField',
'ClassAnnotationIterableElementField',
'ClassAnnotationNullableElementField',
'FieldAnnotationAttributeField',
'FieldAnnotationElementField',
'FieldAnnotationInconvertibleElementField',
'FieldAnnotationIterableElementField',
'FieldAnnotationNullableElementField',
'NullableClassAnnotationElementField',
'NullableClassAnnotationNullableElementField',
Expand All @@ -29,6 +31,7 @@ Future<void> main() async {
'SerializableConverterAttributeField',
'SerializableConverterElementField',
'SerializableConverterInconvertibleElementField',
'SerializableConverterIterableElementField',
'SerializableConverterNullableElementField',
],
formatOutput: (code) => code,
Expand Down

0 comments on commit 07a4327

Please sign in to comment.