/** * @param string $path * @param RuleSet $ruleSet * * @return RuleSet */ public function traverse($path, RuleSet $ruleSet = null) { $result = $this->finder->parsePhpFiles($path); if (!$ruleSet instanceof RuleSet) { $ruleSet = new RuleSet(); } foreach ($result->parsedFiles() as $file) { if ($file->hasDeprecations()) { $ruleSet->merge($file); } } return $ruleSet; }
/** * @param string $path * @param RuleSet $ruleSet * * @return RuleSet */ public function traverse($path, RuleSet $ruleSet = null) { $files = $this->finder->in($path); if (!$ruleSet instanceof RuleSet) { $ruleSet = new RuleSet(); } foreach ($files as $i => $file) { /** @var PhpFileInfo $file */ if ($file->hasDeprecations()) { $ruleSet->merge($file); } } return $ruleSet; }
/** * @param string $sourceArg * @param string $ruleSetArg * * @return Violation[] * * @throws \Exception */ public function checkForDeprecations($sourceArg, $ruleSetArg) { $this->output->startProgress(); $this->output->startRuleSetGeneration(); $ruleSet = $this->ruleSetLoader->loadRuleSet($ruleSetArg); $ruleSet->merge($this->preDefinedRuleSet); $this->output->endRuleSetGeneration(); $this->output->startUsageDetection(); // TODO: Move to AncestorResolver not hard coded $lib = is_dir($ruleSetArg) ? $ruleSetArg : realpath('vendor'); $this->ancestorResolver->setSourcePaths(array($sourceArg, $lib)); $result = $this->deprecationFinder->parsePhpFiles($sourceArg); $violations = $this->violationDetector->getViolations($ruleSet, $result->parsedFiles()); $this->output->endUsageDetection(); $this->output->startOutputRendering(); $this->renderer->renderViolations($violations, $result->parserErrors()); $this->output->endOutputRendering(); $this->output->endProgress($result->fileCount(), count($violations)); return $violations; }
public function buildContainer() { $c = $this->container; // EVENT DISPATCHER $c['event_dispatcher'] = function () { $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new CommandListener()); return $dispatcher; }; // RULESET CACHE $c['ruleset.cache'] = function () { return new Cache(new Filesystem()); }; // RULESET TRAVERSER // TODO: fix container injection $c['ruleset.traverser'] = $c->factory(function ($c) { return new Traverser($c, $c['event_dispatcher']); }); // RULESET LOADER $c['ruleset.loader.directory'] = function ($c) { return new DirectoryLoader($c['ruleset.traverser'], $c['ruleset.cache']); }; $c['ruleset.loader.composer'] = function ($c) { return new ComposerLoader($c['ruleset.traverser'], $c['ruleset.cache'], $c['event_dispatcher']); }; $c['ruleset.loader.ruleset'] = function ($c) { return new FileLoader($c['event_dispatcher']); }; $c['symboltable'] = function () { return new SymbolTable(); }; /* * type guesser */ // SymbolTableVariableResolver $c['typeguesser.symboltable_variable_resolver.argument_resolver'] = function ($c) { return new ArgumentResolver($c['symboltable']); }; $c['typeguesser.symboltable_variable_resolver.reattach_variable_state'] = function ($c) { return new ReattachStateToVariable($c['symboltable']); }; $c['typeguesser.symboltable_variable_resolver.reattach_property_state'] = function ($c) { return new ReattachStateToProperty($c['symboltable']); }; $c['typeguesser.symboltable_variable_resolver.variable_assign'] = function ($c) { return new VariableAssignResolver($c['symboltable']); }; $c['typeguesser.symboltable_variable_resolver.property_assign'] = function ($c) { return new PropertyAssignResolver($c['symboltable']); }; $c['typeguesser.symboltable_variable_resolver.symfony_resolver'] = function ($c) { return new SymfonyResolver($c['symboltable'], $c['symfony_container_reader']); }; $c['typeguesser.symboltable_variable_resolver'] = function ($c) { $resolver = new ComposedResolver(); $resolver->addResolver($c['typeguesser.symboltable_variable_resolver.argument_resolver']); $resolver->addResolver($c['typeguesser.symboltable_variable_resolver.reattach_variable_state']); $resolver->addResolver($c['typeguesser.symboltable_variable_resolver.reattach_property_state']); $resolver->addResolver($c['typeguesser.symboltable_variable_resolver.variable_assign']); $resolver->addResolver($c['typeguesser.symboltable_variable_resolver.property_assign']); $resolver->addResolver($c['typeguesser.symboltable_variable_resolver.symfony_resolver']); return $resolver; }; // ConstructorResolver $c['typeguesser.constructor_resolver'] = function ($c) { $resolver = new ConstructorResolver($c['symboltable']); $resolver->addVisitor($c['parser.usage.visitors.symboltable_variable_resolver_visitor']); return $resolver; }; // SymfonyContainerReader $c['symfony_container_reader'] = function () { return new ContainerReader(); }; /* * AnalysisVisitors */ $c['parser.usage.visitors.constructor_resolver_visitor'] = function ($c) { return new ConstructorResolverVisitor($c['typeguesser.constructor_resolver']); }; $c['parser.usage.visitors.symboltable_variable_resolver_visitor'] = function ($c) { return new SymbolTableVariableResolverVisitor($c['typeguesser.symboltable_variable_resolver'], $c['symboltable']); }; // PARSER $c['parser.base_traverser'] = function () { $traverser = new NodeTraverser(); $traverser->addVisitor(new NameResolver()); return $traverser; }; $c['parser.usage'] = function ($c) { return new UsageParser(array($c['parser.usage.visitors.symboltable_variable_resolver_visitor'], $c['parser.usage.visitors.constructor_resolver_visitor']), array(new FindInterfaces(), new FindArguments(), new FindClasses(), new FindSuperTypes(), new FindMethodCalls(), new FindMethodDefinitions(), new FindStaticMethodCalls()), $c['parser.base_traverser'], new NodeTraverser(), new NodeTraverser()); }; $c['parser.deprecation'] = function ($c) { return new DeprecationParser(array(new FindDeprecatedTagsVisitor()), $c['parser.base_traverser']); }; // FINDER $c['finder.php_usage'] = $c->factory(function ($c) { $finder = new ParsedPhpFileFinder(); $finder->exclude('vendor')->exclude('Tests')->exclude('Test')->setParser($c['parser.usage']); return $finder; }); $c['finder.php_deprecation'] = $c->factory(function ($c) { $finder = new ParsedPhpFileFinder(); $finder->contains('@deprecated')->exclude('vendor')->exclude('Tests')->exclude('Test')->setParser($c['parser.deprecation']); return $finder; }); // VIOLATION MESSAGEHELPER $c['violation.message_helper.class_message'] = function () { return new Renderer\MessageHelper\Message\ClassViolationMessage('SensioLabs\\DeprecationDetector\\FileInfo\\Usage\\ClassUsage'); }; $c['violation.message_helper.interface_message'] = function () { return new Renderer\MessageHelper\Message\InterfaceViolationMessage('SensioLabs\\DeprecationDetector\\FileInfo\\Usage\\InterfaceUsage'); }; $c['violation.message_helper.method_message'] = function () { return new Renderer\MessageHelper\Message\MethodViolationMessage('SensioLabs\\DeprecationDetector\\FileInfo\\Usage\\MethodUsage'); }; $c['violation.message_helper.method_definition_message'] = function () { return new Renderer\MessageHelper\Message\MethodDefinitionViolationMessage('SensioLabs\\DeprecationDetector\\FileInfo\\MethodDefinition'); }; $c['violation.message_helper.supertype_message'] = function () { return new Renderer\MessageHelper\Message\SuperTypeViolationMessage('SensioLabs\\DeprecationDetector\\FileInfo\\Usage\\SuperTypeUsage'); }; $c['violation.message_helper'] = function ($c) { $messageHelper = new Renderer\MessageHelper\MessageHelper(); $messageHelper->addViolationMessage($c['violation.message_helper.class_message']); $messageHelper->addViolationMessage($c['violation.message_helper.interface_message']); $messageHelper->addViolationMessage($c['violation.message_helper.method_message']); $messageHelper->addViolationMessage($c['violation.message_helper.method_definition_message']); $messageHelper->addViolationMessage($c['violation.message_helper.supertype_message']); return $messageHelper; }; // VIOLATION RENDERER $c['violation.renderer'] = function ($c) { return new Renderer\ConsoleOutputRenderer(new ConsoleOutput(), $c['violation.message_helper']); }; // ANCESTOR RESOLVER // TODO: fix container injection $c['ancestor_resolver'] = function ($c) { return new AncestorResolver($c); }; $c['violation_checker'] = function ($c) { return new ComposedViolationChecker([new ClassViolationChecker(), new InterfaceViolationChecker(), new MethodViolationChecker($c['ancestor_resolver']), new SuperTypeViolationChecker(), new TypeHintViolationChecker(), new MethodDefinitionViolationChecker($c['ancestor_resolver'])]); }; $c['violation_detector'] = function ($c) { return new ViolationDetector($c['event_dispatcher'], $c['violation_checker']); }; }
public function reset() { $this->finder = ParsedPhpFileFinder::deprecationFinder($this->finder->getParser(), $this->finder->getOutput()); }
/** * @param ParserInterface $parser * @param VerboseProgressOutput $progressOutput * @return ParsedPhpFileFinder */ public static function usageFinder(ParserInterface $parser, VerboseProgressOutput $progressOutput) { $finder = new ParsedPhpFileFinder($parser, $progressOutput); $finder->exclude('vendor')->exclude('Tests')->exclude('Test'); return $finder; }
/** * @param Configuration $configuration * @param OutputInterface $output * * @return DeprecationDetector */ public function create(Configuration $configuration, OutputInterface $output) { $this->symbolTable = new SymbolTable(); $deprecationProgressOutput = new VerboseProgressOutput(new ProgressBar($output), $configuration->isVerbose(), 'Deprecation detection'); $deprecationUsageParser = $this->getUsageParser($configuration); $deprecationUsageFinder = ParsedPhpFileFinder::usageFinder($deprecationUsageParser, $deprecationProgressOutput); $this->ancestorResolver = new AncestorResolver($deprecationUsageParser); $ruleSetProgressOutput = new VerboseProgressOutput(new ProgressBar($output), $configuration->isVerbose(), 'RuleSet generation'); $ruleSetDeprecationParser = $this->getDeprecationParser(); $ruleSetDeprecationFinder = ParsedPhpFileFinder::deprecationFinder($ruleSetDeprecationParser, $ruleSetProgressOutput); $deprecationDirectoryTraverser = new DirectoryTraverser($ruleSetDeprecationFinder); $violationDetector = $this->getViolationDetector($configuration); $renderer = $this->getRenderer($configuration, $output); $ruleSetLoader = $this->getRuleSetLoader($deprecationDirectoryTraverser, $configuration); $progressOutput = new DefaultProgressOutput($output, new Stopwatch()); return new DeprecationDetector($this->getPredefinedRuleSet(), $ruleSetLoader, $this->ancestorResolver, $deprecationUsageFinder, $violationDetector, $renderer, $progressOutput); }