sonarrradarrplexorganizrnginxdashboardhtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelanding
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							231 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							231 lines
						
					
					
						
							5.5 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								/*
							 | 
						|
								 Copyright (c) 2009 hamcrest.org
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Represents a single static factory method from a {@link Matcher} class.
							 | 
						|
								 *
							 | 
						|
								 * @todo Search method in file contents for func_get_args() to replace factoryVarArgs.
							 | 
						|
								 */
							 | 
						|
								class FactoryMethod
							 | 
						|
								{
							 | 
						|
								    /**
							 | 
						|
								     * @var FactoryClass
							 | 
						|
								     */
							 | 
						|
								    private $class;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var ReflectionMethod
							 | 
						|
								     */
							 | 
						|
								    private $reflector;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var array of string
							 | 
						|
								     */
							 | 
						|
								    private $comment;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var bool
							 | 
						|
								     */
							 | 
						|
								    private $isVarArgs;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var array of FactoryCall
							 | 
						|
								     */
							 | 
						|
								    private $calls;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var array FactoryParameter
							 | 
						|
								     */
							 | 
						|
								    private $parameters;
							 | 
						|
								
							 | 
						|
								    public function __construct(FactoryClass $class, ReflectionMethod $reflector)
							 | 
						|
								    {
							 | 
						|
								        $this->class = $class;
							 | 
						|
								        $this->reflector = $reflector;
							 | 
						|
								        $this->extractCommentWithoutLeadingShashesAndStars();
							 | 
						|
								        $this->extractFactoryNamesFromComment();
							 | 
						|
								        $this->extractParameters();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function extractCommentWithoutLeadingShashesAndStars()
							 | 
						|
								    {
							 | 
						|
								        $this->comment = explode("\n", $this->reflector->getDocComment());
							 | 
						|
								        foreach ($this->comment as &$line) {
							 | 
						|
								            $line = preg_replace('#^\s*(/\\*+|\\*+/|\\*)\s?#', '', $line);
							 | 
						|
								        }
							 | 
						|
								        $this->trimLeadingBlankLinesFromComment();
							 | 
						|
								        $this->trimTrailingBlankLinesFromComment();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function trimLeadingBlankLinesFromComment()
							 | 
						|
								    {
							 | 
						|
								        while (count($this->comment) > 0) {
							 | 
						|
								            $line = array_shift($this->comment);
							 | 
						|
								            if (trim($line) != '') {
							 | 
						|
								                array_unshift($this->comment, $line);
							 | 
						|
								                break;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function trimTrailingBlankLinesFromComment()
							 | 
						|
								    {
							 | 
						|
								        while (count($this->comment) > 0) {
							 | 
						|
								            $line = array_pop($this->comment);
							 | 
						|
								            if (trim($line) != '') {
							 | 
						|
								                array_push($this->comment, $line);
							 | 
						|
								                break;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function extractFactoryNamesFromComment()
							 | 
						|
								    {
							 | 
						|
								        $this->calls = array();
							 | 
						|
								        for ($i = 0; $i < count($this->comment); $i++) {
							 | 
						|
								            if ($this->extractFactoryNamesFromLine($this->comment[$i])) {
							 | 
						|
								                unset($this->comment[$i]);
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        $this->trimTrailingBlankLinesFromComment();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function extractFactoryNamesFromLine($line)
							 | 
						|
								    {
							 | 
						|
								        if (preg_match('/^\s*@factory(\s+(.+))?$/', $line, $match)) {
							 | 
						|
								            $this->createCalls(
							 | 
						|
								                $this->extractFactoryNamesFromAnnotation(
							 | 
						|
								                    isset($match[2]) ? trim($match[2]) : null
							 | 
						|
								                )
							 | 
						|
								            );
							 | 
						|
								            return true;
							 | 
						|
								        }
							 | 
						|
								        return false;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function extractFactoryNamesFromAnnotation($value)
							 | 
						|
								    {
							 | 
						|
								        $primaryName = $this->reflector->getName();
							 | 
						|
								        if (empty($value)) {
							 | 
						|
								            return array($primaryName);
							 | 
						|
								        }
							 | 
						|
								        preg_match_all('/(\.{3}|-|[a-zA-Z_][a-zA-Z_0-9]*)/', $value, $match);
							 | 
						|
								        $names = $match[0];
							 | 
						|
								        if (in_array('...', $names)) {
							 | 
						|
								            $this->isVarArgs = true;
							 | 
						|
								        }
							 | 
						|
								        if (!in_array('-', $names) && !in_array($primaryName, $names)) {
							 | 
						|
								            array_unshift($names, $primaryName);
							 | 
						|
								        }
							 | 
						|
								        return $names;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function createCalls(array $names)
							 | 
						|
								    {
							 | 
						|
								        $names = array_unique($names);
							 | 
						|
								        foreach ($names as $name) {
							 | 
						|
								            if ($name != '-' && $name != '...') {
							 | 
						|
								                $this->calls[] = new FactoryCall($this, $name);
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function extractParameters()
							 | 
						|
								    {
							 | 
						|
								        $this->parameters = array();
							 | 
						|
								        if (!$this->isVarArgs) {
							 | 
						|
								            foreach ($this->reflector->getParameters() as $parameter) {
							 | 
						|
								                $this->parameters[] = new FactoryParameter($this, $parameter);
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getParameterDeclarations()
							 | 
						|
								    {
							 | 
						|
								        if ($this->isVarArgs || !$this->hasParameters()) {
							 | 
						|
								            return '';
							 | 
						|
								        }
							 | 
						|
								        $params = array();
							 | 
						|
								        foreach ($this->parameters as /** @var $parameter FactoryParameter */
							 | 
						|
								                 $parameter) {
							 | 
						|
								            $params[] = $parameter->getDeclaration();
							 | 
						|
								        }
							 | 
						|
								        return implode(', ', $params);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getParameterInvocations()
							 | 
						|
								    {
							 | 
						|
								        if ($this->isVarArgs) {
							 | 
						|
								            return '';
							 | 
						|
								        }
							 | 
						|
								        $params = array();
							 | 
						|
								        foreach ($this->parameters as $parameter) {
							 | 
						|
								            $params[] = $parameter->getInvocation();
							 | 
						|
								        }
							 | 
						|
								        return implode(', ', $params);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    public function getClass()
							 | 
						|
								    {
							 | 
						|
								        return $this->class;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getClassName()
							 | 
						|
								    {
							 | 
						|
								        return $this->class->getName();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getName()
							 | 
						|
								    {
							 | 
						|
								        return $this->reflector->name;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function isFactory()
							 | 
						|
								    {
							 | 
						|
								        return count($this->calls) > 0;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getCalls()
							 | 
						|
								    {
							 | 
						|
								        return $this->calls;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function acceptsVariableArguments()
							 | 
						|
								    {
							 | 
						|
								        return $this->isVarArgs;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function hasParameters()
							 | 
						|
								    {
							 | 
						|
								        return !empty($this->parameters);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getParameters()
							 | 
						|
								    {
							 | 
						|
								        return $this->parameters;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getFullName()
							 | 
						|
								    {
							 | 
						|
								        return $this->getClassName() . '::' . $this->getName();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getCommentText()
							 | 
						|
								    {
							 | 
						|
								        return implode(PHP_EOL, $this->comment);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getComment($indent = '')
							 | 
						|
								    {
							 | 
						|
								        $comment = $indent . '/**';
							 | 
						|
								        foreach ($this->comment as $line) {
							 | 
						|
								            $comment .= PHP_EOL . rtrim($indent . ' * ' . $line);
							 | 
						|
								        }
							 | 
						|
								        $comment .= PHP_EOL . $indent . ' */';
							 | 
						|
								        return $comment;
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 |