generateForAnnotatedElement method
String
generateForAnnotatedElement(
- Element element,
- ConstantReader annotation,
- 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,
);
}