xmlElementBuilderGeneratorFactory function
Creates a BuilderGenerator from a FieldElement
that has an annotation of the form @XmlElement()
.
Implementation
BuilderGenerator xmlElementBuilderGeneratorFactory(FieldElement element) {
final xmlElement = element.getXmlElement()!.toXmlElementValue()!;
final type = element.type;
if (type is ParameterizedType &&
(type.isDartCoreIterable || type.isDartCoreList || type.isDartCoreSet)) {
final converterElement = element.getXmlConverterElement(
type: type.typeArguments.single,
);
if (converterElement is ClassElement) {
return IterableBuilderGenerator(
XmlConverterXmlElementBuilderGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
converterElement.name,
namespace: xmlElement.namespace,
isSelfClosing: xmlElement.isSelfClosing,
includeIfNull: xmlElement.includeIfNull,
isNullable: type.typeArguments.single.isNullable,
isConverterNullable: converterElement.thisType.allSupertypes.any(
(supertype) =>
supertype.element.library.identifier ==
'package:xml_annotation/src/annotations/xml_converter.dart' &&
supertype.element.name == 'XmlConverter' &&
supertype.typeArguments.single.isNullable,
),
),
isNullable: type.isNullable,
);
} else if (type.typeArguments.single.element!.hasXmlSerializable) {
return IterableBuilderGenerator(
XmlSerializableXmlElementBuilderGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
namespace: xmlElement.namespace,
isSelfClosing: xmlElement.isSelfClosing,
includeIfNull: xmlElement.includeIfNull,
isNullable: type.typeArguments.single.isNullable,
),
isNullable: type.isNullable,
);
} else {
return IterableBuilderGenerator(
XmlTextXmlElementBuilderGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
namespace: xmlElement.namespace,
isSelfClosing: xmlElement.isSelfClosing,
includeIfNull: xmlElement.includeIfNull,
isNullable: type.typeArguments.single.isNullable,
),
isNullable: type.isNullable,
);
}
} else {
final converterElement = element.getXmlConverterElement(
type: type,
);
if (converterElement is ClassElement) {
return XmlConverterXmlElementBuilderGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
converterElement.name,
namespace: xmlElement.namespace,
isSelfClosing: xmlElement.isSelfClosing,
includeIfNull: xmlElement.includeIfNull,
isNullable: type.isNullable,
isConverterNullable: converterElement.thisType.allSupertypes.any(
(supertype) =>
supertype.element.library.identifier ==
'package:xml_annotation/src/annotations/xml_converter.dart' &&
supertype.element.name == 'XmlConverter' &&
supertype.typeArguments.single.isNullable,
),
);
} else if (type.element!.hasXmlSerializable) {
return XmlSerializableXmlElementBuilderGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
namespace: xmlElement.namespace,
isSelfClosing: xmlElement.isSelfClosing,
includeIfNull: xmlElement.includeIfNull,
isNullable: type.isNullable,
);
} else {
return XmlTextXmlElementBuilderGenerator(
xmlElement.name ?? element.getEncodedFieldName(),
namespace: xmlElement.namespace,
isSelfClosing: xmlElement.isSelfClosing,
includeIfNull: xmlElement.includeIfNull,
isNullable: type.isNullable,
);
}
}
}