X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fconsolidation%2Fannotated-command%2Fsrc%2FParser%2FInternal%2FFullyQualifiedClassCache.php;fp=vendor%2Fconsolidation%2Fannotated-command%2Fsrc%2FParser%2FInternal%2FFullyQualifiedClassCache.php;h=4daab65afc017507ad90aef3142160ab1843f95b;hp=0000000000000000000000000000000000000000;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/vendor/consolidation/annotated-command/src/Parser/Internal/FullyQualifiedClassCache.php b/vendor/consolidation/annotated-command/src/Parser/Internal/FullyQualifiedClassCache.php new file mode 100644 index 000000000..4daab65af --- /dev/null +++ b/vendor/consolidation/annotated-command/src/Parser/Internal/FullyQualifiedClassCache.php @@ -0,0 +1,106 @@ +primeCache($filename, $className); + return $this->cached($filename, $className); + } + + protected function cached($filename, $className) + { + return isset($this->classCache[$filename][$className]) ? $this->classCache[$filename][$className] : $className; + } + + protected function primeCache($filename, $className) + { + // If the cache has already been primed, do no further work + if (isset($this->namespaceCache[$filename])) { + return false; + } + + $handle = fopen($filename, "r"); + if (!$handle) { + return false; + } + + $namespaceName = $this->primeNamespaceCache($filename, $handle); + $this->primeUseCache($filename, $handle); + + // If there is no 'use' statement for the className, then + // generate an effective classname from the namespace + if (!isset($this->classCache[$filename][$className])) { + $this->classCache[$filename][$className] = $namespaceName . '\\' . $className; + } + + fclose($handle); + } + + protected function primeNamespaceCache($filename, $handle) + { + $namespaceName = $this->readNamespace($handle); + if (!$namespaceName) { + return false; + } + $this->namespaceCache[$filename] = $namespaceName; + return $namespaceName; + } + + protected function primeUseCache($filename, $handle) + { + $usedClasses = $this->readUseStatements($handle); + if (empty($usedClasses)) { + return false; + } + $this->classCache[$filename] = $usedClasses; + } + + protected function readNamespace($handle) + { + $namespaceRegex = '#^\s*namespace\s+#'; + $line = $this->readNextRelevantLine($handle); + if (!$line || !preg_match($namespaceRegex, $line)) { + return false; + } + + $namespaceName = preg_replace($namespaceRegex, '', $line); + $namespaceName = rtrim($namespaceName, ';'); + return $namespaceName; + } + + protected function readUseStatements($handle) + { + $useRegex = '#^\s*use\s+#'; + $result = []; + while (true) { + $line = $this->readNextRelevantLine($handle); + if (!$line || !preg_match($useRegex, $line)) { + return $result; + } + $usedClass = preg_replace($useRegex, '', $line); + $usedClass = rtrim($usedClass, ';'); + $unqualifiedClass = preg_replace('#.*\\\\#', '', $usedClass); + // If this is an aliased class, 'use \Foo\Bar as Baz', then adjust + if (strpos($usedClass, ' as ')) { + $unqualifiedClass = preg_replace('#.*\sas\s+#', '', $usedClass); + $usedClass = preg_replace('#\s+as\s+#', '', $usedClass); + } + $result[$unqualifiedClass] = $usedClass; + } + } + + protected function readNextRelevantLine($handle) + { + while (($line = fgets($handle)) !== false) { + if (preg_match('#^\s*\w#', $line)) { + return trim($line); + } + } + return false; + } +}