annotate vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php @ 2:5311817fb629

Theme updates
author Chris Cannam
date Tue, 10 Jul 2018 13:19:18 +0000
parents
children
rev   line source
Chris@2 1 <?php
Chris@2 2 /*
Chris@2 3 * This file is part of code-unit-reverse-lookup.
Chris@2 4 *
Chris@2 5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
Chris@2 6 *
Chris@2 7 * For the full copyright and license information, please view the LICENSE
Chris@2 8 * file that was distributed with this source code.
Chris@2 9 */
Chris@2 10
Chris@2 11 namespace SebastianBergmann\CodeUnitReverseLookup;
Chris@2 12
Chris@2 13 /**
Chris@2 14 * @since Class available since Release 1.0.0
Chris@2 15 */
Chris@2 16 class Wizard
Chris@2 17 {
Chris@2 18 /**
Chris@2 19 * @var array
Chris@2 20 */
Chris@2 21 private $lookupTable = [];
Chris@2 22
Chris@2 23 /**
Chris@2 24 * @var array
Chris@2 25 */
Chris@2 26 private $processedClasses = [];
Chris@2 27
Chris@2 28 /**
Chris@2 29 * @var array
Chris@2 30 */
Chris@2 31 private $processedFunctions = [];
Chris@2 32
Chris@2 33 /**
Chris@2 34 * @param string $filename
Chris@2 35 * @param int $lineNumber
Chris@2 36 *
Chris@2 37 * @return string
Chris@2 38 */
Chris@2 39 public function lookup($filename, $lineNumber)
Chris@2 40 {
Chris@2 41 if (!isset($this->lookupTable[$filename][$lineNumber])) {
Chris@2 42 $this->updateLookupTable();
Chris@2 43 }
Chris@2 44
Chris@2 45 if (isset($this->lookupTable[$filename][$lineNumber])) {
Chris@2 46 return $this->lookupTable[$filename][$lineNumber];
Chris@2 47 } else {
Chris@2 48 return $filename . ':' . $lineNumber;
Chris@2 49 }
Chris@2 50 }
Chris@2 51
Chris@2 52 private function updateLookupTable()
Chris@2 53 {
Chris@2 54 $this->processClassesAndTraits();
Chris@2 55 $this->processFunctions();
Chris@2 56 }
Chris@2 57
Chris@2 58 private function processClassesAndTraits()
Chris@2 59 {
Chris@2 60 foreach (array_merge(get_declared_classes(), get_declared_traits()) as $classOrTrait) {
Chris@2 61 if (isset($this->processedClasses[$classOrTrait])) {
Chris@2 62 continue;
Chris@2 63 }
Chris@2 64
Chris@2 65 $reflector = new \ReflectionClass($classOrTrait);
Chris@2 66
Chris@2 67 foreach ($reflector->getMethods() as $method) {
Chris@2 68 $this->processFunctionOrMethod($method);
Chris@2 69 }
Chris@2 70
Chris@2 71 $this->processedClasses[$classOrTrait] = true;
Chris@2 72 }
Chris@2 73 }
Chris@2 74
Chris@2 75 private function processFunctions()
Chris@2 76 {
Chris@2 77 foreach (get_defined_functions()['user'] as $function) {
Chris@2 78 if (isset($this->processedFunctions[$function])) {
Chris@2 79 continue;
Chris@2 80 }
Chris@2 81
Chris@2 82 $this->processFunctionOrMethod(new \ReflectionFunction($function));
Chris@2 83
Chris@2 84 $this->processedFunctions[$function] = true;
Chris@2 85 }
Chris@2 86 }
Chris@2 87
Chris@2 88 /**
Chris@2 89 * @param \ReflectionFunctionAbstract $functionOrMethod
Chris@2 90 */
Chris@2 91 private function processFunctionOrMethod(\ReflectionFunctionAbstract $functionOrMethod)
Chris@2 92 {
Chris@2 93 if ($functionOrMethod->isInternal()) {
Chris@2 94 return;
Chris@2 95 }
Chris@2 96
Chris@2 97 $name = $functionOrMethod->getName();
Chris@2 98
Chris@2 99 if ($functionOrMethod instanceof \ReflectionMethod) {
Chris@2 100 $name = $functionOrMethod->getDeclaringClass()->getName() . '::' . $name;
Chris@2 101 }
Chris@2 102
Chris@2 103 if (!isset($this->lookupTable[$functionOrMethod->getFileName()])) {
Chris@2 104 $this->lookupTable[$functionOrMethod->getFileName()] = [];
Chris@2 105 }
Chris@2 106
Chris@2 107 foreach (range($functionOrMethod->getStartLine(), $functionOrMethod->getEndLine()) as $line) {
Chris@2 108 $this->lookupTable[$functionOrMethod->getFileName()][$line] = $name;
Chris@2 109 }
Chris@2 110 }
Chris@2 111 }