generateForAnnotatedElement method

  1. @override
String generateForAnnotatedElement(
  1. Element element,
  2. ConstantReader annotation,
  3. BuildStep buildStep
)

Implement to return source code to generate for element.

This method is invoked based on finding elements annotated with an instance of T. The annotation is provided as a ConstantReader.

Supported return values include a single String or multiple String instances within an Iterable or Stream. It is also valid to return a Future of String, Iterable, or Stream.

Implementations should return null when no content is generated. Empty or whitespace-only String instances are also ignored.

Implementation

@override
String generateForAnnotatedElement(
  Element element,
  ConstantReader annotation,
  BuildStep buildStep,
) {
  if (element is! ClassElement) {
    throw 'Json Component generation can only apply to class elements';
  }
  final constructor = element.unnamedConstructor!;

  ChildType type = ChildType.none;

  final childParam = constructor.parameters
      .cast<ParameterElement?>()
      .firstWhere((e) => e?.name == 'child', orElse: () => null);

  final childrenParam = constructor.parameters
      .cast<ParameterElement?>()
      .firstWhere((e) => e?.name == 'children', orElse: () => null);

  if (childParam != null && childrenParam != null) {
    throw "DynamicWidget can't has child and children param in same time";
  }

  if (childParam != null) {
    type = childParam.isRequiredNamed
        ? ChildType.requiredChild
        : ChildType.child;
  }
  if (childrenParam != null) type = ChildType.children;

  if (childParam?.isRequiredNamed ?? false) {
    type = ChildType.requiredChild;
  }

  bool hasKey = constructor.parameters.any((e) => e.name == 'key');

  final hasOnRegister =
      element.lookUpMethod('onRegister', element.library) != null;

  final parameters = constructor.parameters
      .where((e) => !{'key', 'child', 'children'}.contains(e.name));

  final enrich =
      parameters.isEmpty ? enrichTemplateZeroArguments : enrichTemplate;
  return enrich(
    className: element.name,
    required: parameters.where((e) => e.isRequiredPositional).toList(),
    optional: parameters.where((e) => e.isOptionalPositional).toList(),
    named: parameters.where((e) => e.isNamed).toList(),
    builderName: annotation.peek('builderName')?.stringValue,
    childType: type,
    hasKey: hasKey,
    hasOnRegister: hasOnRegister,
  );
}