generateForAnnotatedElement method

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

The main entry point for code generation.

Checks class validity, collects injectable fields, and produces injection code.

Основная точка входа генератора. Проверяет класс, собирает инъектируемые поля и создает код внедрения зависимостей.

Implementation

@override
FutureOr<String> generateForAnnotatedElement(
  Element element,
  ConstantReader annotation,
  BuildStep buildStep,
) {
  if (element is! ClassElement) {
    throw InvalidGenerationSourceError(
      '@injectable() can only be applied to classes.',
      element: element,
    );
  }

  final classElement = element;
  final className = classElement.name;
  final mixinName = '_\$$className';

  final buffer = StringBuffer()
    ..writeln('mixin $mixinName {')
    ..writeln('  void _inject($className instance) {');

  // Collect and process all @inject fields.
  // Собираем и обрабатываем все поля с @inject.
  final injectFields =
      classElement.fields.where(_isInjectField).map(_parseInjectField);

  for (final parsedField in injectFields) {
    buffer.writeln(_generateInjectionLine(parsedField));
  }

  buffer
    ..writeln('  }')
    ..writeln('}');

  return buffer.toString();
}