public function configure(NodeTraverserInterface $traverser)
{
$this->guardTaskHasVisitors();
$this->guardContextIsRegistered();
$configuredVisitors = $this->loadEnabledVisitorsForCurrentOptions();
$configuredVisitorIds = array_keys($configuredVisitors);
$registeredVisitors = $this->registeredVisitorIds;
$registeredVisitorsIds = array_keys($registeredVisitors);
$visitorIds = array_values(array_intersect($registeredVisitorsIds, $configuredVisitorIds));
$unknownConfiguredVisitorIds = array_diff($configuredVisitorIds, $registeredVisitorsIds);
if (count($unknownConfiguredVisitorIds)) {
throw new RuntimeException(sprintf('Found unknown php_parser visitors: %s', implode(',', $unknownConfiguredVisitorIds)));
}
foreach ($visitorIds as $visitorAlias) {
$visitorId = $registeredVisitors[$visitorAlias];
$visitor = $this->container->get($visitorId);
if ($visitor instanceof ContextAwareVisitorInterface) {
$visitor->setContext($this->context);
}
$options = $configuredVisitors[$visitorAlias];
if ($visitor instanceof ConfigurableVisitorInterface && is_array($options)) {
$visitor->configure($options);
}
$traverser->addVisitor($visitor);
}
// Reset context to make sure the next configure call will actually run in the correct context:
$this->context = null;
}