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 class RouterGenerator extends GeneratorForAnnotation { 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 aptPath = annotation.peek("path")?.stringValue; String routerName = toCamelCase(aptPath == null || aptPath.isEmpty ? className : aptPath); var page = Page(); page.name = className; page.path = routerName.startsWith("/") ? routerName : 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[Path.basename(routerName)] = page; } return null; } }