generateDefaultsProvider static method
String
generateDefaultsProvider(
- Element element,
- bool createBaseClass
)
Implementation
static String generateDefaultsProvider(
Element element, bool createBaseClass) {
var classElement = element.asClassElement();
if (classElement.kind.name == 'ENUM') return '';
var superTypeElement = classElement.supertype!.element;
var annotation = TypeChecker.fromRuntime(DefaultsProvider)
.firstAnnotationOf(superTypeElement);
final superClassHasDefaultsProvider = annotation != null;
final className = classElement.name;
final constructorFields = _getFieldDescriptors(classElement, true);
final parameterFieldBuffer = StringBuffer();
final constructorFieldBuffer = StringBuffer();
for (var field in constructorFields) {
parameterFieldBuffer
.writeln('${field.fieldElementTypeName}? ${field.name},');
constructorFieldBuffer
.writeln('${field.name}: ${field.name} ?? this.${field.name},');
}
final propertyFields = _getFieldDescriptors(classElement, false);
final propertyFieldBuffer = StringBuffer();
for (var field in constructorFields) {
if (!superClassHasDefaultsProvider ||
propertyFields.any((element) => element.name == field.name)) {
var gen =
FieldCodeGenerator.fromFieldDescriptor(field, createBaseClass);
propertyFieldBuffer.writeln(
'''${field.fieldElementTypeName} get ${field.name} ${createBaseClass && gen.defaultExpression == '' ? '' : ' => ' + gen.defaultExpression};''');
} else {
propertyFieldBuffer.writeln(
'''${field.fieldElementTypeName} get ${field.name} => _superDefaultsProvider.${field.name};''');
}
}
final providerClassName =
'${className}DefaultsProvider${createBaseClass ? 'Base' : ''}';
final superDeclaration = superClassHasDefaultsProvider
? '''final _superDefaultsProvider = ${superTypeElement.name}DefaultsProvider();'''
: '';
final constructor = classElement.isAbstract
? ''
: '''
$className createWithDefaults( ${parameterFieldBuffer.isEmpty ? '' : '{ $parameterFieldBuffer }'} ) {
return $className(
$constructorFieldBuffer
);
}
''';
return '''
${createBaseClass ? 'abstract' : ''} class $providerClassName {
$superDeclaration
$constructor
$propertyFieldBuffer
}
''';
}