private function scanPages() { ApplicationInitializer::loadAssets(ASSETS_DIRECTORY); $this->pages = array(); $scanner = new ClassScanner(array(new SubClassRule('\\picon\\WebPage'))); $pages = $scanner->scanForName(); foreach ($pages as $pageName) { $this->addToPath($pageName, $pageName); } $pathScanner = new ClassScanner(array(new AnnotationRule('Path'))); foreach ($pathScanner->scanForReflection($pages) as $reflection) { $pathAnnoation = $reflection->getAnnotation('Path'); $path = $pathAnnoation->path; if (empty($path)) { throw new \UnexpectedValueException(sprintf("Expecting path annoation to have a path value for class %s", $reflection->getName())); } $this->addToPath($path, $reflection->getNamespaceName() . '\\' . $reflection->getName()); } PiconApplication::get()->getPageMapInitializationListener()->onInitialize($this); }
/** * @param string $file full path to file */ private function analyzeFile($file) { $fileContent = $this->filesystem->getFile($file); $entitiesUsedInFile = $this->classScanner->getUsedEntities($file); $fileNamespace = (string) new NamespaceString($this->namespaceVendor, $this->root, $file); foreach ($entitiesUsedInFile as $usedEntity => $lines) { // we have a fully qualified name, so we do not need any use statements if (substr($usedEntity, 0, 1) === '\\') { continue; } if (substr($usedEntity, 0, 1) === '$') { continue; } $simpleName = $aliasName = $usedEntity; if (strpos($usedEntity, '\\') > 0) { $parts = explode('\\', $usedEntity); $simpleName = $parts[count($parts) - 1]; $aliasName = $parts[0]; } if (isset($this->definedEntities[$simpleName])) { foreach ($this->definedEntities[$simpleName]['namespaces'] as $usedEntityNamespace) { if ($usedEntityNamespace === $fileNamespace) { continue 2; } $usedEntityNamespaceT = $usedEntityNamespace . '\\' . $simpleName; if (preg_match('/\\Wuse\\s+\\\\?' . str_replace('\\', '\\\\', $usedEntityNamespaceT) . ';/', $fileContent)) { continue 2; } if (strpos($usedEntityNamespaceT, $fileNamespace) === 0) { $usedEntityNamespaceT = substr($usedEntityNamespaceT, strlen($fileNamespace) + 1); if (preg_match('/\\Wuse\\s+\\\\?' . str_replace('\\', '\\\\', $usedEntityNamespaceT) . ';/', $fileContent)) { continue 2; } } $parts = explode('\\', $usedEntityNamespace); $usedEntityNamespaceT = ''; foreach ($parts as $part) { if ($part === $aliasName) { break; } $usedEntityNamespaceT .= $part . '\\'; } if ($usedEntityNamespaceT === $fileNamespace . '\\') { continue 2; } $usedEntityNamespaceT .= $aliasName; if (preg_match('/\\Wuse\\s+\\\\?' . str_replace('\\', '\\\\', $usedEntityNamespaceT) . ';/', $fileContent)) { continue 2; } if (preg_match('/\\Wuse\\s+\\\\?[a-zA-Z0-9\\\\]+\\sas\\s' . $aliasName . ';/', $fileContent)) { continue 2; } } if (preg_match('/\\Wuse\\s+\\\\?' . str_replace('\\', '\\\\', $usedEntity) . ';/', $fileContent)) { continue; } if (preg_match('/\\Wuse\\s+[a-zA-Z0-9\\\\]+\\\\' . str_replace('\\', '\\\\', $usedEntity) . ';/', $fileContent)) { continue; } $this->addMultipleErrors('Class ' . $usedEntity . ' (fully qualified: ' . $usedEntityNamespace . '\\' . $simpleName . ') was referenced relatively but has no matching use statement', $file, $lines); } else { if (preg_match('/\\Wuse\\s+\\\\?' . str_replace('\\', '\\\\', $usedEntity) . ';/', $fileContent)) { continue; } if (preg_match('/\\Wuse\\s+[a-zA-Z0-9\\\\]+\\\\' . str_replace('\\', '\\\\', $usedEntity) . ';/', $fileContent)) { continue; } if (preg_match('/\\Wuse\\s+\\\\?[a-zA-Z0-9\\\\]+\\sas\\s' . $aliasName . ';/', $fileContent)) { continue; } $this->addMultipleErrors('Class ' . $usedEntity . ' was referenced relatively but not defined', $file, $lines); } } }