generateForAnnotatedElement method

  1. @override
dynamic 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
generateForAnnotatedElement(Element element, ConstantReader annotation, BuildStep buildStep) async {
  if (element is! ClassElement) {
    return "";
  }
  buildStep.inputLibrary.then((LibraryElement value) {});
  ClassElement classElement = element;
  var entityAnnotation = _getEntityAnnotation(classElement.metadata);
  if (entityAnnotation == null) {
    return "";
  }

  var className = classElement.displayName;
  Map<String, dynamic> propertyMap = HashMap<String, dynamic>();

  var buffer = StringBuffer();
  buffer.writeln("import 'dart:collection';\n");
  var source = classElement.source;
  buffer.writeln("import '${source.shortName}';\n");
  buffer.writeln("class ${className}Schema {");
  buffer.writeln("  ${className}Schema._();\n");
  _genFieldsDefine(buffer, classElement.fields);
  _genMap(buffer, classElement.fields, className);
  _getSchema(buffer, annotation, propertyMap);
  buffer.writeln();
  _genDefineFields(buffer, classElement.fields, propertyMap);
  buffer.writeln();
  _genSchema(buffer, propertyMap);
  buffer.writeln("}");
  return buffer.toString();
}