/** * Initialise the manifest */ protected function init() { if ($data = $this->cache->load($this->cacheKey)) { $this->themes = $data; } else { $this->regenerate(); } }
public function handleFile($basename, $pathname, $depth) { if ($basename == self::CONF_FILE) { $this->configs[] = $pathname; return; } $classes = null; $interfaces = null; $namespace = null; $imports = null; $traits = null; // The results of individual file parses are cached, since only a few // files will have changed and TokenisedRegularExpression is quite // slow. A combination of the file name and file contents hash are used, // since just using the datetime lead to problems with upgrading. $key = preg_replace('/[^a-zA-Z0-9_]/', '_', $basename) . '_' . md5_file($pathname); $valid = false; if ($data = $this->cache->load($key)) { $valid = isset($data['classes']) && is_array($data['classes']) && isset($data['interfaces']) && is_array($data['interfaces']) && isset($data['namespace']) && is_string($data['namespace']) && isset($data['imports']) && is_array($data['imports']) && isset($data['traits']) && is_array($data['traits']); if ($valid) { $classes = $data['classes']; $interfaces = $data['interfaces']; $namespace = $data['namespace']; $imports = $data['imports']; $traits = $data['traits']; } } if (!$valid) { $tokens = token_get_all(file_get_contents($pathname)); $classes = self::get_namespaced_class_parser()->findAll($tokens); $traits = self::get_trait_parser()->findAll($tokens); $namespace = self::get_namespace_parser()->findAll($tokens); if ($namespace) { $namespace = implode('', $namespace[0]['namespaceName']); } else { $namespace = ''; } $imports = $this->getImportsFromTokens($tokens); $interfaces = self::get_interface_parser()->findAll($tokens); $cache = array('classes' => $classes, 'interfaces' => $interfaces, 'namespace' => $namespace, 'imports' => $imports, 'traits' => $traits); $this->cache->save($cache, $key); } // Ensure namespace has no trailing slash, and namespaceBase does $namespaceBase = ''; if ($namespace) { $namespace = rtrim($namespace, '\\'); $namespaceBase = $namespace . '\\'; } foreach ($classes as $class) { $name = $namespaceBase . $class['className']; $extends = isset($class['extends']) ? implode('', $class['extends']) : null; $implements = isset($class['interfaces']) ? $class['interfaces'] : null; if ($extends) { $extends = $this->findClassOrInterfaceFromCandidateImports($extends, $namespace, $imports); } if (!empty($implements)) { //join all the tokens $implements = implode('', $implements); //split at comma $implements = explode(',', $implements); //normalise interfaces foreach ($implements as &$interface) { $interface = $this->findClassOrInterfaceFromCandidateImports($interface, $namespace, $imports); } //release the var name unset($interface); } $lowercaseName = strtolower($name); if (array_key_exists($lowercaseName, $this->classes)) { throw new Exception(sprintf('There are two files containing the "%s" class: "%s" and "%s"', $name, $this->classes[$lowercaseName], $pathname)); } $this->classes[$lowercaseName] = $pathname; if ($extends) { $extends = strtolower($extends); if (!isset($this->children[$extends])) { $this->children[$extends] = array($name); } else { $this->children[$extends][] = $name; } } else { $this->roots[] = $name; } if ($implements) { foreach ($implements as $interface) { $interface = strtolower($interface); if (!isset($this->implementors[$interface])) { $this->implementors[$interface] = array($name); } else { $this->implementors[$interface][] = $name; } } } } foreach ($interfaces as $interface) { $this->interfaces[strtolower($namespaceBase . $interface['interfaceName'])] = $pathname; } foreach ($traits as $trait) { $this->traits[strtolower($namespaceBase . $trait['traitName'])] = $pathname; } }