router_generator.dart 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import 'package:analyzer/dart/element/element.dart';
  2. import 'package:build/build.dart';
  3. import 'package:router_gen/annotation/router_page.dart';
  4. import 'package:router_gen/annotation/router_param.dart';
  5. import 'package:router_gen/model/router.dart';
  6. import 'package:router_gen/util/utils.dart';
  7. import 'package:source_gen/source_gen.dart';
  8. import 'package:path/path.dart' as Path;
  9. /// save router annotation to router
  10. class RouterGenerator extends GeneratorForAnnotation<RouterPage> {
  11. final _paramChecker = const TypeChecker.fromRuntime(RouterParam);
  12. @override
  13. generateForAnnotatedElement(
  14. Element element, ConstantReader annotation, BuildStep buildStep) async {
  15. if (element.kind == ElementKind.CLASS) {
  16. router.imports.add(getImportStr(buildStep));
  17. String path = buildStep.inputId.path; // lib/xxx.dart
  18. String basename = Path.basename(buildStep.inputId.path); // xxx.dart
  19. // router name
  20. String className = element.name;
  21. String aptName = annotation.peek("path")?.stringValue;
  22. String routerName =
  23. toCamelCase(aptName == null || aptName.isEmpty ? className : aptName);
  24. var page = Page();
  25. page.name = className;
  26. page.path = Path.join(
  27. path.replaceFirst("lib", "").replaceFirst(basename, ""), routerName);
  28. page.arguments = [];
  29. for (FieldElement e in (element as ClassElement).fields) {
  30. if (_paramChecker.hasAnnotationOf(e)) {
  31. String type = e.type.getDisplayString(withNullability: false);
  32. bool required =
  33. e.computeConstantValue()?.getField("required")?.toBoolValue();
  34. page.arguments.add(Argument(
  35. e.name,
  36. type,
  37. required ?? true,
  38. ));
  39. }
  40. }
  41. router.routerMap[routerName] = page;
  42. }
  43. return null;
  44. }
  45. }