router_generator.dart 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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
  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 aptPath = annotation.peek("path")?.stringValue;
  22. String routerName =
  23. toCamelCase(aptPath == null || aptPath.isEmpty ? className : aptPath);
  24. var page = Page();
  25. page.name = className;
  26. page.path = routerName.startsWith("/")
  27. ? routerName
  28. : Path.join(path.replaceFirst("lib", "").replaceFirst(basename, ""),
  29. routerName);
  30. page.arguments = [];
  31. for (FieldElement e in (element as ClassElement).fields) {
  32. if (_paramChecker.hasAnnotationOf(e)) {
  33. String type = e.type.getDisplayString(withNullability: false);
  34. bool required =
  35. e.computeConstantValue()?.getField("required")?.toBoolValue();
  36. page.arguments.add(Argument(
  37. e.name,
  38. type,
  39. required ?? true,
  40. ));
  41. }
  42. }
  43. router.routerMap[Path.basename(routerName)] = page;
  44. }
  45. return null;
  46. }
  47. }