generate function

Future<void> generate(
  1. List<PackageNode> annotationPackages
)

Implementation

Future<void> generate(List<PackageNode> annotationPackages) async {
  RouteGeneratorBase? root;
  final List<RouteGeneratorBase> nodes = <RouteGeneratorBase>[];
  final List<String> libPaths = <String>[];
  for (final PackageNode annotationPackage in annotationPackages) {
    final RouteGeneratorBase routeGenerator = Args().isFastMode
        ? FastRouteGenerator(
            packageName: annotationPackage.name,
            packagePath: annotationPackage.path,
            isRoot: annotationPackage.isRoot && !Args().isPackage,
          )
        : RouteGenerator(
            packageName: annotationPackage.name,
            packagePath: annotationPackage.path,
            isRoot: annotationPackage.isRoot && !Args().isPackage,
          );

    final String? libPath = routeGenerator.lib?.path;
    if (libPath == null) {
      return;
    }

    libPaths.add(libPath);

    if (routeGenerator.isRoot) {
      root = routeGenerator;
    } else {
      nodes.add(routeGenerator);
    }
  }

  AnalysisContextCollection? collection;
  if (!Args().isFastMode) {
    collection = AnalysisContextCollection(
      includedPaths: libPaths,
      resourceProvider: PhysicalResourceProvider.INSTANCE,
    );
  }

  for (final RouteGeneratorBase routeGenerator in nodes.toList()) {
    // remove first
    RoutesFileGenerator.deleteFile(
      packageName: routeGenerator.packageName,
      lib: routeGenerator.lib!,
    );
    // remove first
    routeGenerator.deleteFile();
    await routeGenerator.scanLib(collection: collection);
    if (routeGenerator.hasAnnotationRoute) {
      routeGenerator.generateFile();
    } else {
      nodes.remove(routeGenerator);
    }
  }

  nodes.sort(
    (RouteGeneratorBase a, RouteGeneratorBase b) =>
        a.packageName.compareTo(b.packageName),
  );

  if (root != null) {
    // remove first
    RoutesFileGenerator.deleteFile(
      packageName: root.packageName,
      lib: root.lib!,
    );
    // remove first
    root.deleteFile();
    await root.scanLib(output: Args().outputPath, collection: collection);

    root.generateFile(nodes: nodes);
  }

  GitPackageHandler().deleteGitPackageFromDartTool();
}