summaryrefslogtreecommitdiff
path: root/vendor/symfony/event-dispatcher/Debug
diff options
context:
space:
mode:
authorFrédéric Guillot <fred@kanboard.net>2017-12-15 11:24:35 -0800
committerFrédéric Guillot <fred@kanboard.net>2017-12-15 11:55:42 -0800
commita93b8e10f5954be0853eec693c13e84c4bd9e6f2 (patch)
treeeda5de9494b819235616e8623bb3393e9cc373af /vendor/symfony/event-dispatcher/Debug
parent2c72a283f2d51034f85f4e2ca8b194d304a3c433 (diff)
Kanboard requires at least PHP 5.6 now
Diffstat (limited to 'vendor/symfony/event-dispatcher/Debug')
-rw-r--r--vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php135
-rw-r--r--vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php2
-rw-r--r--vendor/symfony/event-dispatcher/Debug/WrappedListener.php43
3 files changed, 104 insertions, 76 deletions
diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
index 12e2b1c6..9b5c689a 100644
--- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
@@ -33,13 +33,6 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
private $dispatcher;
private $wrappedListeners;
- /**
- * Constructor.
- *
- * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
- * @param Stopwatch $stopwatch A Stopwatch instance
- * @param LoggerInterface $logger A LoggerInterface instance
- */
public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null)
{
$this->dispatcher = $dispatcher;
@@ -102,6 +95,24 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
/**
* {@inheritdoc}
*/
+ public function getListenerPriority($eventName, $listener)
+ {
+ // we might have wrapped listeners for the event (if called while dispatching)
+ // in that case get the priority by wrapper
+ if (isset($this->wrappedListeners[$eventName])) {
+ foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) {
+ if ($wrappedListener->getWrappedListener() === $listener) {
+ return $this->dispatcher->getListenerPriority($eventName, $wrappedListener);
+ }
+ }
+ }
+
+ return $this->dispatcher->getListenerPriority($eventName, $listener);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function hasListeners($eventName = null)
{
return $this->dispatcher->hasListeners($eventName);
@@ -145,8 +156,7 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
$called = array();
foreach ($this->called as $eventName => $listeners) {
foreach ($listeners as $listener) {
- $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
- $called[$eventName.'.'.$info['pretty']] = $info;
+ $called[$eventName.'.'.$listener->getPretty()] = $listener->getInfo($eventName);
}
}
@@ -184,15 +194,24 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
}
if (!$called) {
- $info = $this->getListenerInfo($listener, $eventName);
- $notCalled[$eventName.'.'.$info['pretty']] = $info;
+ if (!$listener instanceof WrappedListener) {
+ $listener = new WrappedListener($listener, null, $this->stopwatch, $this);
+ }
+ $notCalled[$eventName.'.'.$listener->getPretty()] = $listener->getInfo($eventName);
}
}
}
+ uasort($notCalled, array($this, 'sortListenersByPriority'));
+
return $notCalled;
}
+ public function reset()
+ {
+ $this->called = array();
+ }
+
/**
* Proxies all method calls to the original event dispatcher.
*
@@ -229,12 +248,11 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
private function preProcess($eventName)
{
foreach ($this->dispatcher->getListeners($eventName) as $listener) {
- $this->dispatcher->removeListener($eventName, $listener);
- $info = $this->getListenerInfo($listener, $eventName);
- $name = isset($info['class']) ? $info['class'] : $info['type'];
- $wrappedListener = new WrappedListener($listener, $name, $this->stopwatch, $this);
+ $priority = $this->getListenerPriority($eventName, $listener);
+ $wrappedListener = new WrappedListener($listener, null, $this->stopwatch, $this);
$this->wrappedListeners[$eventName][] = $wrappedListener;
- $this->dispatcher->addListener($eventName, $wrappedListener);
+ $this->dispatcher->removeListener($eventName, $listener);
+ $this->dispatcher->addListener($eventName, $wrappedListener, $priority);
}
}
@@ -247,13 +265,17 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
continue;
}
// Unwrap listener
+ $priority = $this->getListenerPriority($eventName, $listener);
$this->dispatcher->removeListener($eventName, $listener);
- $this->dispatcher->addListener($eventName, $listener->getWrappedListener());
+ $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority);
+
+ if (null !== $this->logger) {
+ $context = array('event' => $eventName, 'listener' => $listener->getPretty());
+ }
- $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
if ($listener->wasCalled()) {
if (null !== $this->logger) {
- $this->logger->debug(sprintf('Notified event "%s" to listener "%s".', $eventName, $info['pretty']));
+ $this->logger->debug('Notified event "{event}" to listener "{listener}".', $context);
}
if (!isset($this->called[$eventName])) {
@@ -264,12 +286,12 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
}
if (null !== $this->logger && $skipped) {
- $this->logger->debug(sprintf('Listener "%s" was not called for event "%s".', $info['pretty'], $eventName));
+ $this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context);
}
if ($listener->stoppedPropagation()) {
if (null !== $this->logger) {
- $this->logger->debug(sprintf('Listener "%s" stopped propagation of the event "%s".', $info['pretty'], $eventName));
+ $this->logger->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context);
}
$skipped = true;
@@ -277,63 +299,24 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
}
}
- /**
- * Returns information about the listener.
- *
- * @param object $listener The listener
- * @param string $eventName The event name
- *
- * @return array Information about the listener
- */
- private function getListenerInfo($listener, $eventName)
+ private function sortListenersByPriority($a, $b)
{
- $info = array(
- 'event' => $eventName,
- );
- if ($listener instanceof \Closure) {
- $info += array(
- 'type' => 'Closure',
- 'pretty' => 'closure',
- );
- } elseif (is_string($listener)) {
- try {
- $r = new \ReflectionFunction($listener);
- $file = $r->getFileName();
- $line = $r->getStartLine();
- } catch (\ReflectionException $e) {
- $file = null;
- $line = null;
- }
- $info += array(
- 'type' => 'Function',
- 'function' => $listener,
- 'file' => $file,
- 'line' => $line,
- 'pretty' => $listener,
- );
- } elseif (is_array($listener) || (is_object($listener) && is_callable($listener))) {
- if (!is_array($listener)) {
- $listener = array($listener, '__invoke');
- }
- $class = is_object($listener[0]) ? get_class($listener[0]) : $listener[0];
- try {
- $r = new \ReflectionMethod($class, $listener[1]);
- $file = $r->getFileName();
- $line = $r->getStartLine();
- } catch (\ReflectionException $e) {
- $file = null;
- $line = null;
- }
- $info += array(
- 'type' => 'Method',
- 'class' => $class,
- 'method' => $listener[1],
- 'file' => $file,
- 'line' => $line,
- 'pretty' => $class.'::'.$listener[1],
- );
+ if (is_int($a['priority']) && !is_int($b['priority'])) {
+ return 1;
+ }
+
+ if (!is_int($a['priority']) && is_int($b['priority'])) {
+ return -1;
+ }
+
+ if ($a['priority'] === $b['priority']) {
+ return 0;
+ }
+
+ if ($a['priority'] > $b['priority']) {
+ return -1;
}
- return $info;
+ return 1;
}
}
diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php
index 5483e815..f0212753 100644
--- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php
+++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php
@@ -15,6 +15,8 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
* @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @method reset() Resets the trace.
*/
interface TraceableEventDispatcherInterface extends EventDispatcherInterface
{
diff --git a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php
index e16627d6..f7b0273e 100644
--- a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php
+++ b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php
@@ -14,6 +14,7 @@ namespace Symfony\Component\EventDispatcher\Debug;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\VarDumper\Caster\ClassStub;
/**
* @author Fabien Potencier <fabien@symfony.com>
@@ -26,6 +27,9 @@ class WrappedListener
private $stoppedPropagation;
private $stopwatch;
private $dispatcher;
+ private $pretty;
+ private $stub;
+ private static $hasClassStub;
public function __construct($listener, $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null)
{
@@ -35,6 +39,26 @@ class WrappedListener
$this->dispatcher = $dispatcher;
$this->called = false;
$this->stoppedPropagation = false;
+
+ if (is_array($listener)) {
+ $this->name = is_object($listener[0]) ? get_class($listener[0]) : $listener[0];
+ $this->pretty = $this->name.'::'.$listener[1];
+ } elseif ($listener instanceof \Closure) {
+ $this->pretty = $this->name = 'closure';
+ } elseif (is_string($listener)) {
+ $this->pretty = $this->name = $listener;
+ } else {
+ $this->name = get_class($listener);
+ $this->pretty = $this->name.'::__invoke';
+ }
+
+ if (null !== $name) {
+ $this->name = $name;
+ }
+
+ if (null === self::$hasClassStub) {
+ self::$hasClassStub = class_exists(ClassStub::class);
+ }
}
public function getWrappedListener()
@@ -52,6 +76,25 @@ class WrappedListener
return $this->stoppedPropagation;
}
+ public function getPretty()
+ {
+ return $this->pretty;
+ }
+
+ public function getInfo($eventName)
+ {
+ if (null === $this->stub) {
+ $this->stub = self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->listener) : $this->pretty.'()';
+ }
+
+ return array(
+ 'event' => $eventName,
+ 'priority' => null !== $this->dispatcher ? $this->dispatcher->getListenerPriority($eventName, $this->listener) : null,
+ 'pretty' => $this->pretty,
+ 'stub' => $this->stub,
+ );
+ }
+
public function __invoke(Event $event, $eventName, EventDispatcherInterface $dispatcher)
{
$this->called = true;