Files
cherrypick/cherrypick_generator/lib/module_generator.dart

67 lines
3.3 KiB
Dart
Raw Normal View History

2025-05-18 15:43:02 +03:00
//
// Copyright 2021 Sergey Penkovsky (sergey.penkovsky@gmail.com)
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
2025-05-17 00:34:56 +03:00
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'package:cherrypick_annotations/cherrypick_annotations.dart' as ann;
2025-05-21 15:50:24 +03:00
import 'src/generated_class.dart';
2025-05-17 22:29:37 +03:00
///
2025-05-20 19:50:13 +03:00
/// Генератор зависимостей для DI-контейнера на основе аннотаций.
///
/// Данный генератор автоматически создаёт код для внедрения зависимостей (DI)
/// на основе аннотаций в вашем исходном коде. Когда вы отмечаете класс
/// аннотацией `@module()`, этот генератор обработает все его публичные методы
/// и автоматически сгенерирует класс с биндингами (регистрациями зависимостей)
/// для DI-контейнера. Это избавляет от написания однообразного шаблонного кода.
2025-05-17 22:29:37 +03:00
///
2025-05-17 00:34:56 +03:00
class ModuleGenerator extends GeneratorForAnnotation<ann.module> {
2025-05-20 19:50:13 +03:00
/// Генерирует исходный код для класса-модуля с аннотацией `@module()`.
///
/// [element] — исходный класс, помеченный аннотацией.
/// [annotation] — значения параметров аннотации.
/// [buildStep] — информация о текущем шаге генерации.
2025-05-17 00:34:56 +03:00
@override
String generateForAnnotatedElement(
Element element,
ConstantReader annotation,
BuildStep buildStep,
) {
2025-05-20 19:50:13 +03:00
// Генератор обрабатывает только классы (остальное — ошибка)
2025-05-17 00:34:56 +03:00
if (element is! ClassElement) {
throw InvalidGenerationSourceError(
'@module() может быть применён только к классам.',
element: element,
);
}
2025-05-17 22:29:37 +03:00
2025-05-17 00:34:56 +03:00
final classElement = element;
2025-05-17 22:29:37 +03:00
2025-05-20 19:50:13 +03:00
// Создаёт объект, описывающий, какие биндинги нужно сгенерировать на основании методов класса
2025-05-21 15:50:24 +03:00
final generatedClass = GeneratedClass.fromClassElement(classElement);
2025-05-20 19:50:13 +03:00
// Генерирует итоговый Dart-код
return generatedClass.generate();
}
}
///
/// Точка входа для генератора build_runner.
/// Возвращает Builder, используемый build_runner для генерации кода для всех
/// файлов, где встречается @module().
///
2025-05-17 00:34:56 +03:00
Builder moduleBuilder(BuilderOptions options) =>
PartBuilder([ModuleGenerator()], '.cherrypick.g.dart');