generateDefaultsProvider static method

String generateDefaultsProvider(
  1. Element element,
  2. 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

    }

  ''';
}