generateForAnnotatedElement method

  1. @override
FutureOr<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
FutureOr<String> generateForAnnotatedElement(Element element, ConstantReader annotation, BuildStep buildStep) async {
  final singleton = annotation.read('singleton').boolValue;
  final lazy = annotation.read('lazy').boolValue;

  final _buffer = StringBuffer();
  _write(Object o) => _buffer.write(o);
  final visitor = ModelVisitor();
  List<Element> listElements = element.library!.topLevelElements.toList();
  for (var i = listElements.length - 1; i >= 0; i--) {
    var item = listElements[i];
    item.visitChildren(visitor);

    if (visitor.isAnnotation) {
      break;
    }

    if (i == 0) {
      element.visitChildren(visitor);
      break;
    }
  }
  _write("final \$${element.displayName} = BindInject((i) => ${element.displayName}(${visitor.params.join(', ')}), isSingleton: $singleton, isLazy: $lazy,);");
  return _buffer.toString();
}