1<?php
2
3namespace Amp;
4
5class InvalidYieldError extends \Error
6{
7    /**
8     * @param \Generator      $generator
9     * @param string          $prefix
10     * @param \Throwable|null $previous
11     */
12    public function __construct(\Generator $generator, string $prefix, \Throwable $previous = null)
13    {
14        $yielded = $generator->current();
15        $prefix .= \sprintf(
16            "; %s yielded at key %s",
17            \is_object($yielded) ? \get_class($yielded) : \gettype($yielded),
18            \var_export($generator->key(), true)
19        );
20
21        if (!$generator->valid()) {
22            parent::__construct($prefix, 0, $previous);
23            return;
24        }
25
26        $reflGen = new \ReflectionGenerator($generator);
27        $exeGen = $reflGen->getExecutingGenerator();
28        if ($isSubgenerator = ($exeGen !== $generator)) {
29            $reflGen = new \ReflectionGenerator($exeGen);
30        }
31
32        parent::__construct(\sprintf(
33            "%s on line %s in %s",
34            $prefix,
35            $reflGen->getExecutingLine(),
36            $reflGen->getExecutingFile()
37        ), 0, $previous);
38    }
39}
40