resolve method

  1. @override
PluginActivationPlan resolve(
  1. List<PluginSetupDescriptor> descriptors
)
override

Resolve descriptors into an ordered activation plan.

Implementation

@override
PluginActivationPlan resolve(List<PluginSetupDescriptor> descriptors) {
  final byId = {for (final d in descriptors) d.pluginId: d};
  final errors = <PluginActivationError>[];
  final ordered = <PluginSetupDescriptor>[];
  final visited = <String>{};
  final visiting = <String>{};

  void visit(String id) {
    if (visited.contains(id)) return;
    if (visiting.contains(id)) {
      errors.add(PluginActivationError(
        pluginId: id,
        type: ActivationErrorType.circularDependency,
        message: 'Circular dependency detected for plugin: $id',
      ));
      return;
    }

    final descriptor = byId[id];
    if (descriptor == null) return;

    visiting.add(id);

    for (final dep in descriptor.dependsOn) {
      if (!byId.containsKey(dep)) {
        errors.add(PluginActivationError(
          pluginId: id,
          type: ActivationErrorType.missingDependency,
          message: 'Missing dependency: $dep required by $id',
        ));
        continue;
      }
      visit(dep);
    }

    visiting.remove(id);
    visited.add(id);
    ordered.add(descriptor);
  }

  for (final d in descriptors) {
    visit(d.pluginId);
  }

  int totalSteps = 0;
  for (final d in ordered) {
    totalSteps += d.steps.length;
  }

  return PluginActivationPlan(
    orderedPlugins: ordered,
    errors: errors,
    totalSteps: totalSteps,
  );
}