| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import 'package:analyzer/dart/element/element.dart';
- import 'package:build/build.dart';
- import 'package:router_gen/annotation/router_page.dart';
- import 'package:router_gen/annotation/router_param.dart';
- import 'package:router_gen/model/router.dart';
- import 'package:router_gen/util/utils.dart';
- import 'package:source_gen/source_gen.dart';
- import 'package:path/path.dart' as Path;
- /// save router annotation to router
- class RouterGenerator extends GeneratorForAnnotation<RouterPage> {
- final _paramChecker = const TypeChecker.fromRuntime(RouterParam);
- @override
- generateForAnnotatedElement(
- Element element, ConstantReader annotation, BuildStep buildStep) async {
- if (element.kind == ElementKind.CLASS) {
- router.imports.add(getImportStr(buildStep));
- String path = buildStep.inputId.path; // lib/xxx.dart
- String basename = Path.basename(buildStep.inputId.path); // xxx.dart
- // router name
- String className = element.name;
- String aptName = annotation.peek("path")?.stringValue;
- String routerName =
- toCamelCase(aptName == null || aptName.isEmpty ? className : aptName);
- var page = Page();
- page.name = className;
- page.path = Path.join(
- path.replaceFirst("lib", "").replaceFirst(basename, ""), routerName);
- page.arguments = [];
- for (FieldElement e in (element as ClassElement).fields) {
- if (_paramChecker.hasAnnotationOf(e)) {
- String type = e.type.getDisplayString(withNullability: false);
- bool required =
- e.computeConstantValue()?.getField("required")?.toBoolValue();
- page.arguments.add(Argument(
- e.name,
- type,
- required ?? true,
- ));
- }
- }
- router.routerMap[routerName] = page;
- }
- return null;
- }
- }
|