Eloquent\Phony\Spy\Detail\GeneratorSpyFactoryDetailHhvm::createGeneratorSpy PHP Метод

createGeneratorSpy() публичный статический Метод

Create a new generator spy.
public static createGeneratorSpy ( Eloquent\Phony\Call\Call $call, Generator $generator, CallEventFactory $callEventFactory, boolean $isGeneratorImplicitNextSupported ) : Generator
$call Eloquent\Phony\Call\Call The call from which the generator originated.
$generator Generator The generator.
$callEventFactory Eloquent\Phony\Call\Event\CallEventFactory The call event factory to use.
$isGeneratorImplicitNextSupported boolean True if implicit generator next() behavior is supported.
Результат Generator The newly created generator spy.
    public static function createGeneratorSpy(Call $call, Generator $generator, CallEventFactory $callEventFactory, $isGeneratorImplicitNextSupported)
    {
        $call->addIterableEvent($callEventFactory->createUsed());
        $isFirst = true;
        $received = null;
        $receivedException = null;
        while (true) {
            $thrown = null;
            try {
                if ($isFirst) {
                    if (!$isGeneratorImplicitNextSupported) {
                        $generator->next();
                    }
                } else {
                    if ($receivedException) {
                        $generator->throw($receivedException);
                    } else {
                        $generator->send($received);
                    }
                }
                if (!$generator->valid()) {
                    $call->setEndEvent($callEventFactory->createReturned(null));
                    break;
                }
            } catch (Throwable $thrown) {
                // re-thrown after recording
            } catch (Exception $thrown) {
                // re-thrown after recording
            }
            if ($thrown) {
                $call->setEndEvent($callEventFactory->createThrew($thrown));
                throw $thrown;
            }
            $key = $generator->key();
            $value = $generator->current();
            $received = null;
            $receivedException = null;
            $call->addIterableEvent($callEventFactory->createProduced($key, $value));
            try {
                $received = (yield $key => $value);
                $call->addIterableEvent($callEventFactory->createReceived($received));
            } catch (Exception $receivedException) {
                $call->addIterableEvent($callEventFactory->createReceivedException($receivedException));
            }
            $isFirst = false;
            unset($value);
        }
    }

Usage Example

Пример #1
0
 /**
  * Create a new generator spy.
  *
  * @param Call      $call      The call from which the generator originated.
  * @param Generator $generator The generator.
  *
  * @return Generator The newly created generator spy.
  */
 public function create(Call $call, Generator $generator)
 {
     if ($this->isHhvm) {
         // @codeCoverageIgnoreStart
         if ($this->isGeneratorReturnSupported) {
             $spy = GeneratorSpyFactoryDetailHhvmWithReturn::createGeneratorSpy($call, $generator, $this->callEventFactory);
         } else {
             $spy = GeneratorSpyFactoryDetailHhvm::createGeneratorSpy($call, $generator, $this->callEventFactory, $this->isGeneratorImplicitNextSupported);
         }
         // @codeCoverageIgnoreEnd
     } elseif ($this->isGeneratorReturnSupported) {
         $spy = GeneratorSpyFactoryDetailPhpWithReturn::createGeneratorSpy($call, $generator, $this->callEventFactory);
         // @codeCoverageIgnoreStart
     } else {
         $spy = GeneratorSpyFactoryDetailPhp::createGeneratorSpy($call, $generator, $this->callEventFactory);
     }
     // @codeCoverageIgnoreEnd
     $spy->_phonySubject = $generator;
     return $spy;
 }
GeneratorSpyFactoryDetailHhvm