function enterNode(Node $node) { switch (get_class($node)) { case Class_::class: $name = $node->namespacedName ? $node->namespacedName->toString() : "anonymous class"; if ($name) { $file = $this->index->getClassFile($name); if ($file) { $this->output->emitError(__CLASS__, $this->filename, $node->getLine(), BaseCheck::TYPE_PARSE_ERROR, "Class {$name} already exists in {$file}."); } else { $this->index->addClass($name, $node, $this->filename); } array_push($this->classStack, $node); } break; case Interface_::class: $name = $node->namespacedName->toString(); $this->index->addInterface($name, $node, $this->filename); array_push($this->classStack, $node); break; case Function_::class: $name = $node->namespacedName->toString(); $this->index->addFunction($name, $node, $this->filename); break; case \PhpParser\Node\Const_::class: if (count($this->classStack) == 0) { $defineName = strval($node->name); $this->index->addDefine($defineName, $node, $this->filename); } break; case FuncCall::class: if ($node->name instanceof Node\Name) { $name = strval($node->name); if (strcasecmp($name, 'define') == 0 && count($node->args) >= 1 && $node->args[0]->value instanceof Node\Scalar\String_) { $defineName = $node->args[0]->value->value; $this->index->addDefine($defineName, $node, $this->filename); } } break; case Trait_::class: $name = $node->namespacedName->toString(); $this->index->addTrait($name, $node, $this->filename); array_push($this->classStack, $node); break; } if ($node instanceof ClassMethod && property_exists($node, 'namespacedName') && count($this->classStack) > 0) { $classNode = $this->classStack[count($this->classStack) - 1]; $className = $classNode->namespacedName->toString(); $this->index->addMethod($className, $node->name, $node); } return null; }
function phase2(Config $config, OutputInterface $output, $toProcess) { $traverser1 = new NodeTraverser(); $traverser1->addVisitor(new DocBlockNameResolver()); $analyzer = new StaticAnalyzer($config->getBasePath(), $config->getSymbolTable(), $output, $config); $traverser2 = new NodeTraverser(); $traverser2->addVisitor(new TraitImportingVisitor($config->getSymbolTable())); $traverser3 = new NodeTraverser(); $traverser3->addVisitor($analyzer); $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); $processingCount = 0; foreach ($toProcess as $file) { try { $name = Util::removeInitialPath($config->getBasePath(), $file); $output->output(".", $name); $processingCount++; //echo " - $processingCount:" . $file . "\n"; $fileData = file_get_contents($file); $stmts = $parser->parse($fileData); if ($stmts) { $analyzer->setFile($name); $stmts = $traverser1->traverse($stmts); $stmts = $traverser2->traverse($stmts); $traverser3->traverse($stmts); } } catch (Error $e) { $output->emitError(__CLASS__, $file, 0, "Parse error", $e->getMessage()); } catch (\Guardrail\Exceptions\UnknownTraitException $e) { $output->emitError(__CLASS__, $file, 0, "Unknown trait error", $e->getMessage()); } } if ($output instanceof XUnitOutput) { // print_r($output->getCounts()); } return $output->getErrorCount() > 0 ? 1 : 0; }
function index(Config $config, OutputInterface $output, \RecursiveIteratorIterator $it2, $stubs = false) { $baseDir = $config->getBasePath(); $symbolTable = $config->getSymbolTable(); $indexer = new SymbolTableIndexer($symbolTable, $output); $traverser1 = new NodeTraverser(); $traverser1->addVisitor(new NameResolver()); $traverser2 = new NodeTraverser(); $traverser2->addVisitor($indexer); $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); $configArr = $config->getConfigArray(); $count = 0; foreach ($it2 as $file) { if (($file->getExtension() == "php" || $file->getExtension() == "inc") && $file->isFile()) { $name = Util::removeInitialPath($baseDir, $file->getPathname()); if (strpos($name, "phar://") === 0) { $name = str_replace(\Phar::running(), "", $name); while ($name[0] == '/') { $name = substr($name, 1); } $name = "phar://" . $name; } try { if (!$stubs && isset($configArr['ignore']) && is_array($configArr['ignore']) && Util::matchesGlobs($baseDir, $file->getPathname(), $configArr['ignore'])) { continue; } ++$count; $output->output(".", " - {$count}:" . $name); // If the $fileName is in our phar then make it a relative path so that files that we index don't // depend on the phar file existing in a particular directory. $fileData = file_get_contents($file->getPathname()); if ($config->shouldReindex()) { $symbolTable->removeFileFromIndex($file->getPathname()); } $indexer->setFilename($name); $stmts = $parser->parse($fileData); if ($stmts) { $traverser1->traverse($stmts); $traverser2->traverse($stmts); } } catch (Error $e) { $output->emitError(__CLASS__, $file, 0, ' Parse Error: ' . $e->getMessage() . "\n"); } } } return $count; }
function emitErrorOnLine($file, $lineNumber, $class, $message = "") { return $this->doc->emitError(get_class($this), $file, $lineNumber, $class, $message); }