Imported DocBlock Reflection and transformed into a PHP 5.3 module

This commit is contained in:
Mike van Riel
2012-04-06 20:15:46 +02:00
commit fea7abe168
27 changed files with 1883 additions and 0 deletions
@@ -0,0 +1,121 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock;
/**
* Parses a Long Description of a DocBlock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class LongDescription implements \Reflector
{
/** @var string */
protected $contents = '';
/** @var \phpDocumentor\Reflection\DocBlock\Tags[] */
protected $tags = array();
/**
* Parses the string for inline tags and if the Markdown class is included;
* format the found text.
*
* @param string $content the DocBlock contents without asterisks.
*/
public function __construct($content)
{
if (preg_match('/\{\@(.+?)\}/', $content, $matches)) {
array_shift($matches);
foreach ($matches as $tag) {
$this->tags[] = Tag::createInstance('@' . $tag);
}
}
$this->contents = trim($content);
}
/**
* Returns the text of this description.
*
* @return string
*/
public function getContents()
{
return $this->contents;
}
/**
* Return a formatted variant of the Long Description using MarkDown.
*
* @todo this should become a more intelligent piece of code where the
* configuration contains a setting what format long descriptions are.
*
* @return string
*/
public function getFormattedContents()
{
$result = $this->contents;
// if the long description contains a plain HTML <code> element, surround
// it with a pre element. Please note that we explicitly used str_replace
// and not preg_replace to gain performance
if (strpos($result, '<code>') !== false) {
$result = str_replace(
array('<code>', "<code>\r\n", "<code>\n", "<code>\r", '</code>'),
array('<pre><code>', '<code>', '<code>', '<code>', '</code></pre>'),
$result
);
}
if (class_exists('\dflydev\markdown\MarkdownExtraParser()')) {
$md = new \dflydev\markdown\MarkdownExtraParser();
$result = $md->transformMarkdown($result);
}
return trim($result);
}
/**
* Returns a list of tags mentioned in the text.
*
* @return \phpDocumentor\Reflection\DocBlock\Tags[]
*/
public function getTags()
{
return $this->tags;
}
/**
* Builds a string representation of this object.
*
* @todo determine the exact format as used by PHP Reflection and implement it.
*
* @return void
*/
static public function export()
{
throw new \Exception('Not yet implemented');
}
/**
* Returns the exported information (we should use the export static method
* BUT this throws an exception at this point).
*
* @return string
*/
public function __toString()
{
return 'Not yet implemented';
}
}
@@ -0,0 +1,171 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock;
/**
* Parses a tag definition for a DocBlock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class Tag implements \Reflector
{
/** @var string Name of the tag */
protected $tag = '';
/** @var string content of the tag */
protected $content = '';
/** @var string description of the content of this tag */
protected $description = '';
/** @var int line number of the tag */
protected $line_number = 0;
/** @var object docblock class */
protected $docblock;
/**
* Factory method responsible for instantiating the correct sub type.
*
* @param string $tag_line The text for this tag, including description.
*
* @throws \InvalidArgumentException if an invalid tag line was presented.
*
* @return \phpDocumentor\Reflection\DocBlock\Tag
*/
public static function createInstance($tag_line)
{
if (!preg_match(
'/^@([\w\-\_\\\\]+)(?:\s*([^\s].*)|$)?/us', $tag_line, $matches
)) {
throw new \InvalidArgumentException(
'Invalid tag_line detected: ' . $tag_line
);
}
// support hypphen separated tag names
$tag_name = str_replace(
' ', '', ucwords(str_replace('-', ' ', $matches[1]))
).'Tag';
$class_name = '\\phpDocumentor\\Reflection\\DocBlock\\Tag\\' . $tag_name;
return (@class_exists($class_name))
? new $class_name($matches[1], isset($matches[2]) ? $matches[2] : '')
: new self($matches[1], isset($matches[2]) ? $matches[2] : '');
}
/**
* Parses a tag and populates the member variables.
*
* @param string $type Name of the tag.
* @param string $content The contents of the given tag.
*/
public function __construct($type, $content)
{
$this->tag = $type;
$this->content = $content;
$this->description = $content;
}
/**
* Returns the name of this tag.
*
* @return string
*/
public function getName()
{
return $this->tag;
}
/**
* Returns the content of this tag.
*
* @return string
*/
public function getContent()
{
return $this->content;
}
/**
* Returns the description component of this tag.
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set the tag line number
*
* @param int $number the line number of the tag
*
* @return void
*/
public function setLineNumber($number)
{
$this->line_number = (int)$number;
}
/**
* Get the line number of the tag
*
* @return int tag line number
*/
public function getLineNumber()
{
return $this->line_number;
}
/**
* Inject the docblock class
*
* This exposes some common functionality contained in the docblock abstract.
*
* @param object $docblock Object containing the DocBlock.
*
* @return void
*/
public function setDocBlock($docblock)
{
$this->docblock = $docblock;
}
/**
* Builds a string representation of this object.
*
* @todo determine the exact format as used by PHP Reflection and implement it.
*
* @return void
*/
static public function export()
{
throw new \Exception('Not yet implemented');
}
/**
* Returns the exported information (we should use the export static method
* BUT this throws an exception at this point).
*
* @return string
*/
public function __toString()
{
return 'Not yet implemented';
}
}
@@ -0,0 +1,25 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a @covers tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class CoversTag extends SeeTag
{
}
@@ -0,0 +1,71 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Ben Selby <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a @link tag in a Docblock.
*
* @author Ben Selby <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class LinkTag extends Tag
{
/** @var string */
protected $link = '';
/**
* Parses a tag and populates the member variables.
*
* @param string $type Tag type
* @param string $content Content of the tag
*/
public function __construct($type, $content)
{
$this->tag = $type;
$pieces = explode(' ', $content);
if (count($pieces) > 1) {
$this->link = array_shift($pieces);
$this->description = implode(' ', $pieces);
} else {
$this->link = $content;
$this->description = $content;
}
$this->content = $content;
}
/**
* Returns the link
*
* @return string
*/
public function getLink()
{
return $this->link;
}
/**
* Sets the link
*
* @param string $link The link
*
* @return void
*/
public function setLink($link)
{
$this->link = $link;
}
}
@@ -0,0 +1,130 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@method} in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class MethodTag extends ParamTag
{
/** @var string */
protected $method_name = '';
/** @var string */
protected $arguments = '';
/**
* Parses a tag and populates the member variables.
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/
public function __construct($type, $content)
{
$this->tag = $type;
$this->content = $content;
$matches = array();
// 1. none or more whitespace
// 2. optionally a word with underscores followed by whitespace : as
// type for the return value
// 3. then optionally a word with underscores followed by () and
// whitespace : as method name as used by phpDocumentor
// 4. then a word with underscores, followed by ( and any character
// until a ) and whitespace : as method name with signature
// 5. any remaining text : as description
if (preg_match(
'/^[\s]*(?:([\w\|_\\\\]+)[\s]+)?(?:[\w_]+\(\)[\s]+)?([\w\|_\\\\]+)\(([^\)]*)\)'
.'[\s]*(.*)/u',
$content,
$matches
)) {
list(
,
$this->type,
$this->method_name,
$this->arguments,
$this->description
) = $matches;
if (!$this->type)
{
$this->type = 'void';
}
} else {
echo date('c') . ' ERR (3): @method contained invalid contents: '
. $this->content . PHP_EOL;
}
}
/**
* Sets the name of this method.
*
* @param string $method_name The name of the method.
*
* @return void
*/
public function setMethodName($method_name)
{
$this->method_name = $method_name;
}
/**
* Retrieves the method name.
*
* @return string
*/
public function getMethodName()
{
return $this->method_name;
}
/**
* Sets the arguments for this method.
*
* @param string $arguments A comma-separated arguments line.
*
* @return void
*/
public function setArguments($arguments)
{
$this->arguments = $arguments;
}
/**
* Returns an array containing each argument as array of type and name.
*
* Please note that the argument sub-array may only contain 1 element if no
* type was specified.
*
* @return string[]
*/
public function getArguments()
{
if (empty($this->arguments)) {
return array();
}
$arguments = explode(',', $this->arguments);
foreach ($arguments as $key => $value) {
$arguments[$key] = explode(' ', trim($value));
}
return $arguments;
}
}
@@ -0,0 +1,101 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@param} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class ParamTag extends Tag
{
/** @var string */
protected $type = null;
/**
* @var string
*/
protected $variableName = null;
/**
* Parses a tag and populates the member variables.
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/
public function __construct($type, $content)
{
$this->tag = $type;
$this->content = $content;
$content = preg_split('/\s+/u', $content);
// if there is only 1, it is either a piece of content or a variable name
if (count($content) > 1) {
$this->type = array_shift($content);
}
// if the next item starts with a $ it must be the variable name
if ((strlen($content[0]) > 0) && ($content[0][0] == '$')) {
$this->variableName = array_shift($content);
}
$this->description = implode(' ', $content);
}
/**
* Returns the unique types of the variable.
*
* @return string[]
*/
public function getTypes()
{
$types = explode('|', $this->type);
array_walk($types, 'trim');
return $types;
}
/**
* Returns the type section of the variable.
*
* @return string
*/
public function getType()
{
return $this->type;
}
/**
* Returns the variable's name.
*
* @return string
*/
public function getVariableName()
{
return $this->variableName;
}
/**
* Sets the variable's name.
*
* @param string $name The new name for this variable.
*
* @return void
*/
public function setVariableName($name)
{
$this->variableName = $name;
}
}
@@ -0,0 +1,25 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@property} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class PropertyReadTag extends PropertyTag
{
}
@@ -0,0 +1,25 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@property} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class PropertyTag extends ParamTag
{
}
@@ -0,0 +1,25 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@property} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class PropertyWriteTag extends PropertyTag
{
}
@@ -0,0 +1,66 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@return} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class ReturnTag extends ParamTag
{
/** @var string */
protected $type = null;
/**
* Parses a tag and populates the member variables.
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/
public function __construct($type, $content)
{
$this->tag = $type;
$this->content = $content;
$content = preg_split('/\s+/u', $content);
// any output is considered a type
$this->type = array_shift($content);
$this->description = implode(' ', $content);
}
/**
* Returns the type of the variable.
*
* @return string
*/
public function getTypes()
{
$types = explode('|', $this->type);
array_walk($types, 'trim');
return $types;
}
/**
* Returns the type of the variable.
*
* @return string
*/
public function getType()
{
return $this->type;
}
}
@@ -0,0 +1,56 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@see} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class SeeTag extends Tag
{
/** @var string */
protected $refers = null;
/**
* Parses a tag and populates the member variables.
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/
public function __construct($type, $content)
{
$this->tag = $type;
$this->content = $content;
$content = preg_split('/\s+/u', $content);
// any output is considered a type
$this->refers = array_shift($content);
$this->description = implode(' ', $content);
}
/**
* Returns the type of the variable.
*
* @return string
*/
public function getReference()
{
return $this->refers;
}
}
@@ -0,0 +1,43 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a mistyped @throws tag called @throw in a Docblock.
*
* This is a very common error, so @throw is aliased to be @throws
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class ThrowTag extends ThrowsTag
{
/**
* Sets the type to {@throws} and lets parent parse the tag and populates the
* member variables.
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/
public function __construct($type, $content)
{
if ('throw' !== $type) {
throw new \InvalidArgumentException(
'Internal error, ' . __CLASS__ . ' was called with ' . $type
);
}
parent::__construct('throws', $content);
}
}
@@ -0,0 +1,25 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@throws} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class ThrowsTag extends ReturnTag
{
}
@@ -0,0 +1,25 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@uses} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class UsesTag extends SeeTag
{
}
@@ -0,0 +1,53 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5
*
* @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tag;
/**
* Reflection class for a {@var} tag in a Docblock.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class VarTag extends ParamTag
{
/**
* Parses a tag and populates the member variables.
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/
public function __construct($type, $content)
{
$this->tag = $type;
$this->content = $content;
$content = preg_split('/\s+/u', $content);
if (count($content) == 0) {
return;
}
// var always starts with the variable name
$this->type = array_shift($content);
// if the next item starts with a $ it must be the variable name
if ((count($content) > 0)
&& (strlen($content[0]) > 0)
&& ($content[0][0] == '$')
) {
$this->variableName = array_shift($content);
}
$this->description = implode(' ', $content);
}
}