| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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<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 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;
- }
- }
|