Compare commits

...
80 Commits
Author SHA1 Message Date
Vasil Rangelov 5d93f42598 Added "scalar" as a recognized keyword (phpDocumentor/phpDocumentor2#694);
Changed the list of keywords to be static (for the purpose of reducing memory consumption);
Updated composer.lock with the latest dependencies (PHPUnit in particular).
2012-12-02 22:26:45 +02:00
Vasil Rangelov eb83d810de Added a Travis status image to README.md;
Also, fixed a typo.
2012-11-30 22:43:34 +02:00
Vasil Rangelov 6f0fc03c49 Added setters at Location and Description;
Added DocBlock::appendTag();
Minor reorganization at the tag setters;
2012-11-30 22:37:41 +02:00
Vasil Rangelov b09525332f Refactored all tags to have setters for all of their components;
Removed the special handling for VarTag (it's now equivalent to ParamTag);
Minor doc, CS and coverage fixes.
2012-11-30 19:26:19 +02:00
Vasil Rangelov c2796044a6 Adjusted composer files for consistency with PhpDocumentor. 2012-11-29 20:12:53 +02:00
Vasil Rangelov 8418970624 CS fixes. 2012-11-27 19:52:28 +02:00
Vasil Rangelov 0d38c84407 Added @boenrobot to Travis' email notifications;
Some CS fixes at TagTest.php.
2012-11-22 13:22:00 +02:00
Vasil Rangelov bfc443b40c Merge pull request #15 from ashnazg/make-build
Make travis build
2012-11-22 03:03:34 -08:00
Chuck Burgess 4a9ddd15fe restore original 2012-11-21 19:16:31 -06:00
Chuck Burgess 87ed522579 graphviz isn't necessary 2012-11-21 19:15:29 -06:00
Chuck Burgess f01f8ea41d use phpunit in vendor 2012-11-21 19:08:28 -06:00
Chuck Burgess 620b932272 restore color=true 2012-11-21 19:05:59 -06:00
Vasil Rangelov beb96a487b Added tests related to the namespaced tag support;
Restored ReturnTag::getTypesCollection() to "protected", to avoid potential BC breaks later.
2012-11-22 01:23:31 +02:00
Vasil Rangelov 7a03741e0b Added support for namespaced tags;
Simplified @see and @link parsing;
Added comments to the regexes of @method, @example and @source;
Added a test case for what 2812eac046 intended to fix.
2012-11-22 00:37:22 +02:00
Chuck Burgess a79e4c174c initial travis build 2012-11-21 15:09:44 -06:00
Chuck Burgess be61012d74 add --dev deps 2012-11-21 15:09:22 -06:00
Chuck Burgess 99de44e96f tighten up dist file 2012-11-21 15:08:31 -06:00
Vasil Rangelov b20c7da00b Merge pull request #13 from boenrobot/location
Abstracting away namespace (and other context dependent) information into a new object
2012-11-21 12:36:31 -08:00
Vasil Rangelov 99054d341f Introduced Context and Location, and adapted Collection and ReturnTag accordingly. 2012-11-21 15:55:10 +02:00
Vasil Rangelov 9da4a65065 Reverted the move of explode() into Return, and moved the implode() into Collection's new __toString() method instead;
Also had to made type resolution lazy, as a pleasant side effect.

This reverts commit db20ae39fb.
2012-11-18 18:50:45 +02:00
Vasil Rangelov 39faeec91d Revert "Merge pull request #10 from boenrobot/author"
This reverts commit 21c36677ab, reversing
changes made to ffcaa03337.
2012-11-18 17:15:48 +02:00
Vasil Rangelov 0c15eb99f5 Removed redundant preg_split from SourceTag (mistakenly pasted from ReturnTag). 2012-11-17 17:32:48 +02:00
Vasil Rangelov 21c36677ab Merge pull request #10 from boenrobot/author
Introduced role, description and space separated URIs to the author tag.
2012-11-17 06:33:38 -08:00
Vasil Rangelov ffcaa03337 Merge pull request #12 from boenrobot/source-and-example
Reflections for @source and @example
2012-11-17 05:23:56 -08:00
Vasil Rangelov 37810ef836 Added @example tag handler, and registered it and @source at Tag. 2012-11-17 15:23:16 +02:00
Vasil Rangelov 587406073d Added reflection for @source tag. 2012-11-17 15:16:56 +02:00
Vasil Rangelov aed654aa85 Merge pull request #11 from boenrobot/version-and-derivatives
Reflections for @version, @since and @deprecated
2012-11-17 05:13:04 -08:00
Vasil Rangelov 2812eac046 Simplified ReturnTag parsing. 2012-11-16 21:53:17 +02:00
Vasil Rangelov db20ae39fb Moved the type separation into ReturnTag, for consistency with the type merging that is currently there. 2012-11-16 21:43:25 +02:00
Vasil Rangelov cdaa97eb31 Added a limit on Collection's explode(), thus (insignificantly, but still) improving performance. 2012-11-14 22:42:56 +02:00
Vasil Rangelov 27bdc08a1e Fixed DocBlock giving and reception for long descriptions. 2012-11-14 18:05:03 +02:00
Vasil Rangelov a18985a888 Doc updates and fixes. 2012-11-13 21:50:56 +02:00
Vasil Rangelov 747e6d7cdf Updated @author in accordance with the latest changes. 2012-11-13 19:23:42 +02:00
Vasil Rangelov c2f692140f Merge branch 'master' of github.com:boenrobot/ReflectionDocBlock into author
Conflicts:
	src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php
2012-11-13 19:13:34 +02:00
Vasil Rangelov 8eb596c1cc Updated @version in accordance with the latest changes in Tag. 2012-11-13 19:10:13 +02:00
Vasil Rangelov 26e2eade91 Merge branch 'master' of github.com:boenrobot/ReflectionDocBlock into version-and-derivatives 2012-11-13 19:05:14 +02:00
Vasil Rangelov 1ac9106c48 Made all tag handlers call Tag::__construct() rather than "manually" duplicating it;
Tag::__construct() trims the description (as is common for most tag handlers), while the original contents is still in the $content property;
Added the DocBlock argument to all tag handlers.
2012-11-13 19:00:49 +02:00
Vasil Rangelov 1352ef56a6 Renamed LongDescription to Description, to better serve its new dual role as "holder for a place where inline tags can occur";
Removed Tag::setDocblock() in favor of an additional constructor argument that defaults to NULL;
Tag::createInstance() and Description's constructor now have a second argument, allowing the specification of an owning DocBlock;
Description::getParsedContents() assigns the Description's owning DocBlock object when creating tags.
2012-11-13 17:16:30 +02:00
Vasil Rangelov 6df31db139 Tweaked the "testInvalidTagBlock" test to appease PHPCS (though strictly speaking, this is a bug with PHPCS "NEWDOC" handling). 2012-11-13 16:43:36 +02:00
Vasil Rangelov 829a92e5aa Added reflections for @version, @since and @deprecated, which separate the version vector (if one is provided) from the description. 2012-11-13 15:28:17 +02:00
Vasil Rangelov 04936a7b39 @return now trims the content before splitting it;
Removed ThrowTag.php (unnecessary, given the map, which aliases "throw" to ThrowsTag.php);
Added tests for ThrowsTag, along with a few other minor test additions and fixes;
2012-11-11 19:51:04 +02:00
Vasil Rangelov ae82b8488f Applied multi line fixes to @param, analogous to those in @return. 2012-11-11 17:45:16 +02:00
Vasil Rangelov bae65d2afe Minor syntax and doc fixes at Tag::registerTagHandler();
Split the "testTagHandlerRegistration" test into several new ones, with appropriate @covers annotations added;
Although not required for single liners, class names at the built in tag handlers map are indented on a separate line for readability.
2012-11-11 15:20:59 +02:00
Vasil Rangelov 28df2a4cd6 Refactored Tag::createInstance() to use a simple tag-to-class map, that has the default tag handlers pre-registered. 2012-11-11 00:54:51 +02:00
Vasil Rangelov fedcd8cf49 Minor doc fixes. 2012-11-10 23:45:28 +02:00
Vasil Rangelov a868c60f8e Removed DocBlock::expandType() and associated tests, as previously advised by @mvriel;
Added tests for generic Tag objects, and a few others;
Increased total coverage by more appropriate use of @covers annotations.
2012-11-10 23:19:36 +02:00
Vasil Rangelov e6d2ec7c54 Inverted @param and @return hierarchy;
More fixes to tests and code coverage increase.
2012-11-10 20:27:57 +02:00
Vasil Rangelov f19dac185a Introduced role, description and space separated URIs to the author tag. 2012-11-10 16:50:39 +02:00
Vasil Rangelov 0ba0ad6b42 Updated tag doc comments. 2012-11-10 14:18:40 +02:00
Vasil Rangelov 8b9591a7c5 Made the Tag::createInstance() create generic tag objects when there are uppercase letters in the tag name
(this fixes phpDocumentor/phpDocumentor2#672).
2012-11-10 14:00:01 +02:00
Vasil Rangelov 082c9354d0 Increased unit test coverage of DocBlock;
Moved the tag block checks outside (and prior to) the tag line loop;
Doc and CS fixes.
2012-11-10 13:24:46 +02:00
Vasil Rangelov 233e4b3ff7 Merge pull request #9 from boenrobot/LongDescription
Nested inline tag parsing
2012-11-10 01:52:46 -08:00
Vasil Rangelov d788b51755 Merge branch 'LongDescription' of github.com:boenrobot/ReflectionDocBlock into LongDescription 2012-11-10 11:51:40 +02:00
Vasil Rangelov bbd5775f1f Improved performance, thanks to @nikic's new regex. 2012-11-10 11:49:23 +02:00
Vasil Rangelov 044ebd68c9 Added escape sequences that allow "literal" inline tags in descriptions. 2012-11-10 11:49:23 +02:00
Vasil Rangelov e0a5a75364 Implemented nested inline tag parsing;
Added unit tests for LongDescription.php;
Added the "src" folder as white listed for code coverage in the PHPUnit configuration;
Fixed the @covers annotation inside the CoversTagTest.php (isn't this ironic?).
2012-11-10 11:49:23 +02:00
Vasil Rangelov 607aa79601 Merge pull request #8 from boenrobot/CS
Coding standard fixes.
2012-11-10 01:40:09 -08:00
Vasil Rangelov a4107acb6d Restored indentation in multi-line tag descriptions, and applied them where they were previously missing. 2012-11-05 23:14:32 +02:00
Vasil Rangelov 34eabb7d11 Improved performance, thanks to @nikic's new regex. 2012-11-05 17:50:11 +02:00
Vasil Rangelov f07ab7eda0 Added escape sequences that allow "literal" inline tags in descriptions. 2012-11-04 23:45:55 +02:00
Vasil Rangelov d6119709ba Shortened some long variable names in the test suite, as advised by PHPMD's default settings. 2012-11-04 23:34:25 +02:00
Vasil Rangelov 21ec090933 Implemented nested inline tag parsing;
Added unit tests for LongDescription.php;
Added the "src" folder as white listed for code coverage in the PHPUnit configuration;
Fixed the @covers annotation inside the CoversTagTest.php (isn't this ironic?).
2012-11-04 22:29:38 +02:00
Vasil Rangelov ba1395e42d Updated comments with the namespaced notation, and added the "Tag" suffix where needed. 2012-11-04 22:19:18 +02:00
Vasil Rangelov 9a3c6f50ef Made PSR2 related fixes that are compatible with the PEAR coding standard. 2012-11-04 16:02:57 +02:00
Vasil Rangelov 009237bad2 Tons of coding standard fixes. 2012-11-04 15:16:37 +02:00
Mike van Riel 6b707f7166 Change behaviour of @param parsing
In issue report phpDocumentor/phpDocumentor2#620 @bobef reported that when he
used just a Type as content of the @param that it would be recognized as
description instead of the Type.

According to the unit tests this is correct behaviour but after reviewing the
pattern of the output his version is more consistent. As such I have altered
the behaviour to act as following:

If only one word is found after an @param (word means white-space bounded
series of characters) then interpret that as the type and not description.

During this item several issues in unit tests were fixed and a new 'Type'
Collection was introduced that is capable of expanding types based on a given
namespace and series of aliases.
This should be re-used in phpDocumentor's Transformer as a duplication exists
there with the expanding of the Types.

Please note: the suggested format by @bobef is not valid according to the
PHPDoc Standard but is provided for convenience.
2012-11-03 22:14:43 +01:00
Mike van Riel 5236694595 Merge branch 'patch-2' of https://github.com/boenrobot/ReflectionDocBlock into boenrobot-patch-2
Conflicts:
	src/phpDocumentor/Reflection/DocBlock/LongDescription.php
2012-11-01 18:56:36 +01:00
Vasil Rangelov ce57e5445f Restored the greedy-ness inversion. 2012-10-31 11:28:53 +02:00
Vasil Rangelov 37f5090d90 Removed LongDescription::getTags() and made parsing to occur only the first time it's requested. 2012-10-17 17:33:52 +03:00
Mike van Riel 5941846e99 Merge pull request #7 from boenrobot/patch-3
Reflection for the author tag.
2012-10-15 13:01:19 -07:00
Vasil Rangelov 95ad95d3be Added doc blocks to the new methods. 2012-10-15 13:17:51 +03:00
Mike van Riel aa61de9761 Merge branch 'master' of github.com:phpDocumentor/ReflectionDocBlock 2012-09-30 14:29:16 +02:00
Mike van Riel a935cbfff9 Fix @return type/description seperation
Per issue phpDocumentor/phpDocumentor2#623 should a newline directly behind the type
of a multiline @return tag be interpreted correctly. Currently seperation occurs
on the first space or tab but this is not sufficient.
2012-09-30 14:26:28 +02:00
Vasil Rangelov ee412932f1 Added Tag/AuthorTag.php. 2012-09-30 01:47:50 +03:00
Vasil Rangelov c8fe0e4e40 Added Tag::getParsedDescription();
Minor performance tweak at LongDescription.
2012-09-26 16:27:32 +03:00
Vasil Rangelov ad4e358fb0 Added doc block to getParsedContents(). 2012-09-22 05:56:37 +03:00
Vasil Rangelov 1b3acdce18 Added parsed inline tags. 2012-09-22 05:41:10 +03:00
Mike van Riel 4235beebfa Merge pull request #5 from boenrobot/patch-1
Fix for phpDocumentor2#562
2012-09-16 08:15:18 -07:00
Vasil Rangelov f3cca4b7c7 Ensured key consistency. 2012-08-12 23:53:31 +03:00
Vasil Rangelov e0d8988490 Fix for phpDocumentor2#562
Possible fix for phpDocumentor/phpDocumentor2#562.
2012-08-12 20:21:19 +03:00
50 changed files with 4492 additions and 924 deletions
+1
View File
@@ -1 +1,2 @@
.idea .idea
vendor
+23
View File
@@ -0,0 +1,23 @@
language: php
php:
- 5.3.3
- 5.3
- 5.4
script:
- vendor/phpunit/phpunit/composer/bin/phpunit
before_script:
- sudo apt-get -qq update > /dev/null
- phpenv rehash > /dev/null
- composer selfupdate --quiet
- composer install --dev
- vendor/phpunit/phpunit/composer/bin/phpunit
- composer update --dev
notifications:
irc: "irc.freenode.org#phpdocumentor"
email:
- [email protected]
- [email protected]
- [email protected]
+2 -2
View File
@@ -1,4 +1,4 @@
The ReflectionDocBlock Component The ReflectionDocBlock Component [![Build Status](https://secure.travis-ci.org/phpDocumentor/ReflectionDocBlock.png)](https://travis-ci.org/phpDocumentor/ReflectionDocBlock)
================================ ================================
Introduction Introduction
@@ -7,7 +7,7 @@ Introduction
The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser
that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest). that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest).
With this component can a library provide support for annotations via DocBlocks With this component, a library can provide support for annotations via DocBlocks
or otherwise retrieve information that is embedded in a DocBlock. or otherwise retrieve information that is embedded in a DocBlock.
> **Note**: *this is a core component of phpDocumentor and is constantly being > **Note**: *this is a core component of phpDocumentor and is constantly being
+5 -2
View File
@@ -6,10 +6,13 @@
{"name": "Mike van Riel", "email": "[email protected]"} {"name": "Mike van Riel", "email": "[email protected]"}
], ],
"require": { "require": {
"php": ">=5.3.2", "php": ">=5.3.3",
"dflydev/markdown": "1.0.*" "dflydev/markdown": "1.0.*"
}, },
"autoload": { "autoload": {
"psr-0": {"phpDocumentor\\Reflection": "src/"} "psr-0": {"phpDocumentor": ["src/"]}
},
"require-dev": {
"phpunit/phpunit": "3.7.*@stable"
} }
} }
Generated
+475
View File
@@ -0,0 +1,475 @@
{
"hash": "c6115c20a4a284f6ca14e676e788b4d3",
"packages": [
{
"name": "dflydev/markdown",
"version": "v1.0.2",
"source": {
"type": "git",
"url": "https://github.com/dflydev/dflydev-markdown.git",
"reference": "v1.0.2"
},
"dist": {
"type": "zip",
"url": "https://github.com/dflydev/dflydev-markdown/zipball/v1.0.2",
"reference": "v1.0.2",
"shasum": ""
},
"require": {
"php": ">=5.3"
},
"time": "2012-01-15 19:36:37",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-0": {
"dflydev\\markdown": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"New BSD License"
],
"authors": [
{
"name": "Dragonfly Development Inc.",
"email": "[email protected]",
"homepage": "http://dflydev.com"
},
{
"name": "Beau Simensen",
"email": "[email protected]",
"homepage": "http://beausimensen.com"
},
{
"name": "Michel Fortin",
"homepage": "http://michelf.com"
},
{
"name": "John Gruber",
"homepage": "http://daringfireball.net"
}
],
"description": "PHP Markdown & Extra",
"homepage": "http://github.com/dflydev/dflydev-markdown",
"keywords": [
"markdown"
]
}
],
"packages-dev": [
{
"name": "phpunit/php-code-coverage",
"version": "1.2.7",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "1.2.7"
},
"dist": {
"type": "zip",
"url": "https://github.com/sebastianbergmann/php-code-coverage/archive/1.2.7.zip",
"reference": "1.2.7",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
"phpunit/php-file-iterator": ">=1.3.0@stable",
"phpunit/php-token-stream": ">=1.1.3@stable",
"phpunit/php-text-template": ">=1.1.1@stable"
},
"suggest": {
"ext-dom": "*",
"ext-xdebug": ">=2.0.5"
},
"time": "2012-12-02 14:54:55",
"type": "library",
"installation-source": "dist",
"autoload": {
"classmap": [
"PHP/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "[email protected]",
"role": "lead"
}
],
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
"keywords": [
"testing",
"coverage",
"xunit"
]
},
{
"name": "phpunit/php-file-iterator",
"version": "1.3.3",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/php-file-iterator.git",
"reference": "1.3.3"
},
"dist": {
"type": "zip",
"url": "https://github.com/sebastianbergmann/php-file-iterator/zipball/1.3.3",
"reference": "1.3.3",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"time": "2012-10-11 04:44:38",
"type": "library",
"installation-source": "dist",
"autoload": {
"classmap": [
"File/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "[email protected]",
"role": "lead"
}
],
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
"homepage": "http://www.phpunit.de/",
"keywords": [
"filesystem",
"iterator"
]
},
{
"name": "phpunit/php-text-template",
"version": "1.1.4",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/php-text-template.git",
"reference": "1.1.4"
},
"dist": {
"type": "zip",
"url": "https://github.com/sebastianbergmann/php-text-template/zipball/1.1.4",
"reference": "1.1.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"time": "2012-10-31 11:15:28",
"type": "library",
"installation-source": "dist",
"autoload": {
"classmap": [
"Text/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "[email protected]",
"role": "lead"
}
],
"description": "Simple template engine.",
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
"keywords": [
"template"
]
},
{
"name": "phpunit/php-timer",
"version": "1.0.4",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/php-timer.git",
"reference": "1.0.4"
},
"dist": {
"type": "zip",
"url": "https://github.com/sebastianbergmann/php-timer/zipball/1.0.4",
"reference": "1.0.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"time": "2012-10-11 04:45:58",
"type": "library",
"installation-source": "dist",
"autoload": {
"classmap": [
"PHP/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "[email protected]",
"role": "lead"
}
],
"description": "Utility class for timing",
"homepage": "http://www.phpunit.de/",
"keywords": [
"timer"
]
},
{
"name": "phpunit/php-token-stream",
"version": "1.1.5",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/php-token-stream.git",
"reference": "1.1.5"
},
"dist": {
"type": "zip",
"url": "https://github.com/sebastianbergmann/php-token-stream/zipball/1.1.5",
"reference": "1.1.5",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=5.3.3"
},
"time": "2012-10-11 04:47:14",
"type": "library",
"installation-source": "dist",
"autoload": {
"classmap": [
"PHP/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "[email protected]",
"role": "lead"
}
],
"description": "Wrapper around PHP's tokenizer extension.",
"homepage": "http://www.phpunit.de/",
"keywords": [
"tokenizer"
]
},
{
"name": "phpunit/phpunit",
"version": "3.7.10",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/phpunit.git",
"reference": "3.7.10"
},
"dist": {
"type": "zip",
"url": "https://github.com/sebastianbergmann/phpunit/archive/3.7.10.zip",
"reference": "3.7.10",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
"phpunit/php-file-iterator": ">=1.3.1",
"phpunit/php-text-template": ">=1.1.1",
"phpunit/php-code-coverage": ">=1.2.1",
"phpunit/php-timer": ">=1.0.2",
"phpunit/phpunit-mock-objects": ">=1.2.0,<1.3.0",
"symfony/yaml": ">=2.1.0",
"ext-dom": "*",
"ext-pcre": "*",
"ext-reflection": "*",
"ext-spl": "*"
},
"suggest": {
"phpunit/php-invoker": ">=1.1.0",
"ext-json": "*",
"ext-simplexml": "*",
"ext-tokenizer": "*"
},
"time": "2012-12-02 14:56:55",
"bin": [
"composer/bin/phpunit"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.7.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"classmap": [
"PHPUnit/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
"",
"../../symfony/yaml/"
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "[email protected]",
"role": "lead"
}
],
"description": "The PHP Unit Testing framework.",
"homepage": "http://www.phpunit.de/",
"keywords": [
"testing",
"phpunit",
"xunit"
]
},
{
"name": "phpunit/phpunit-mock-objects",
"version": "1.2.2",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git",
"reference": "1.2.2"
},
"dist": {
"type": "zip",
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects/archive/1.2.2.zip",
"reference": "1.2.2",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
"phpunit/php-text-template": ">=1.1.1@stable"
},
"suggest": {
"ext-soap": "*"
},
"time": "2012-11-05 10:39:13",
"type": "library",
"installation-source": "dist",
"autoload": {
"classmap": [
"PHPUnit/"
]
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
""
],
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "[email protected]",
"role": "lead"
}
],
"description": "Mock Object library for PHPUnit",
"homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
"keywords": [
"mock",
"xunit"
]
},
{
"name": "symfony/yaml",
"version": "v2.1.4",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
"url": "https://github.com/symfony/Yaml",
"reference": "v2.1.4"
},
"dist": {
"type": "zip",
"url": "https://github.com/symfony/Yaml/archive/v2.1.4.zip",
"reference": "v2.1.4",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"time": "2012-11-08 09:51:48",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.1-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-0": {
"Symfony\\Component\\Yaml": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "[email protected]"
},
{
"name": "Symfony Community",
"homepage": "http://symfony.com/contributors"
}
],
"description": "Symfony Yaml Component",
"homepage": "http://symfony.com"
}
],
"aliases": [
],
"minimum-stability": "stable",
"stability-flags": {
"phpunit/phpunit": 0
}
}
+6 -1
View File
@@ -1,9 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<phpunit colors="true" strict="true"> <phpunit colors="true" strict="true" bootstrap="vendor/autoload.php">
<testsuites> <testsuites>
<testsuite name="phpDocumentor\Reflection\DocBlock"> <testsuite name="phpDocumentor\Reflection\DocBlock">
<directory>./tests/</directory> <directory>./tests/</directory>
</testsuite> </testsuite>
</testsuites> </testsuites>
<filter>
<whitelist>
<directory suffix=".php">./src/</directory>
</whitelist>
</filter>
</phpunit> </phpunit>
+89 -114
View File
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -12,6 +12,10 @@
namespace phpDocumentor\Reflection; namespace phpDocumentor\Reflection;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Context;
use phpDocumentor\Reflection\DocBlock\Location;
/** /**
* Parses the DocBlock for any structure. * Parses the DocBlock for any structure.
* *
@@ -25,46 +29,44 @@ class DocBlock implements \Reflector
protected $short_description = ''; protected $short_description = '';
/** /**
* @var \phpDocumentor\Reflection\DocBlock\LongDescription The actual description * @var DocBlock\Description The actual
* for this docblock. * description for this docblock.
*/ */
protected $long_description = null; protected $long_description = null;
/** /**
* @var \phpDocumentor\Reflection\DocBlock\Tags[] An array containing all the tags * @var Tag[] An array containing all
* in this docblock; except inline. * the tags in this docblock; except inline.
*/ */
protected $tags = array(); protected $tags = array();
/** @var string the current namespace */ /** @var Context Information about the context of this DocBlock. */
protected $namespace = '\\'; protected $context = null;
/** @var string[] List of namespace aliases => Fully Qualified Namespace */ /** @var Location Information about the location of this DocBlock. */
protected $namespace_aliases = array(); protected $location = null;
/** /**
* Parses the given docblock and populates the member fields. * Parses the given docblock and populates the member fields.
* *
* The constructor may also receive namespace information such as the * The constructor may also receive namespace information such as the
* current namespace and aliases. This information is used in the * current namespace and aliases. This information is used by some tags
* {@link expandType()} method to transform a relative Type into a FQCN. * (e.g. @return, @param, etc.) to turn a relative Type into a FQCN.
* *
* For example the param and return tags use this to expand their type * @param \Reflector|string $docblock A docblock comment (including
* information. * asterisks) or reflector supporting the getDocComment method.
* * @param Context $context The context in which the DocBlock
* @param \Reflector|string $docblock A docblock comment (including asterisks) * occurs.
* or reflector supporting the getDocComment method. * @param Location $location The location within the file that this
* @param string $namespace The namespace where this DocBlock resides in; * DocBlock occurs in.
* defaults to `\`.
* @param string[] $namespace_aliases a list of namespace aliases as
* provided by the `use` keyword; the key of the array is the alias name
* or last part of the alias array if no alias name is provided.
* *
* @throws \InvalidArgumentException if the given argument does not have the * @throws \InvalidArgumentException if the given argument does not have the
* getDocComment method. * getDocComment method.
*/ */
public function __construct( public function __construct(
$docblock, $namespace = '\\', $namespace_aliases = array() $docblock,
Context $context = null,
Location $location = null
) { ) {
if (is_object($docblock)) { if (is_object($docblock)) {
if (!method_exists($docblock, 'getDocComment')) { if (!method_exists($docblock, 'getDocComment')) {
@@ -81,11 +83,11 @@ class DocBlock implements \Reflector
list($short, $long, $tags) = $this->splitDocBlock($docblock); list($short, $long, $tags) = $this->splitDocBlock($docblock);
$this->short_description = $short; $this->short_description = $short;
$this->long_description = new DocBlock\LongDescription($long); $this->long_description = new DocBlock\Description($long, $this);
$this->parseTags($tags); $this->parseTags($tags);
$this->namespace = $namespace; $this->context = $context;
$this->namespace_aliases = $namespace_aliases; $this->location = $location;
} }
/** /**
@@ -99,7 +101,9 @@ class DocBlock implements \Reflector
{ {
$comment = trim( $comment = trim(
preg_replace( preg_replace(
'#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', '$1', $comment '#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u',
'$1',
$comment
) )
); );
@@ -121,7 +125,7 @@ class DocBlock implements \Reflector
* @param string $comment Comment to split into the sub-parts. * @param string $comment Comment to split into the sub-parts.
* *
* @author RichardJ Special thanks to RichardJ for the regex responsible * @author RichardJ Special thanks to RichardJ for the regex responsible
* for the split/ * for the split.
* *
* @return string[] containing the short-, long description and an element * @return string[] containing the short-, long description and an element
* containing the tags. * containing the tags.
@@ -133,7 +137,7 @@ class DocBlock implements \Reflector
} else { } else {
// clears all extra horizontal whitespace from the line endings // clears all extra horizontal whitespace from the line endings
// to prevent parsing issues // to prevent parsing issues
$comment = preg_replace('~(?m)\h*$~u', '', $comment); $comment = preg_replace('/\h*$/Sum', '', $comment);
/* /*
* Splits the docblock into a short description, long description and * Splits the docblock into a short description, long description and
@@ -150,7 +154,7 @@ class DocBlock implements \Reflector
* Big thanks to RichardJ for contributing this Regular Expression * Big thanks to RichardJ for contributing this Regular Expression
*/ */
preg_match( preg_match(
'/(?x) '/
\A ( \A (
[^\n.]+ [^\n.]+
(?: (?:
@@ -173,7 +177,9 @@ class DocBlock implements \Reflector
) )
)? )?
(\s+ [\s\S]*)? # everything that follows (\s+ [\s\S]*)? # everything that follows
/u', $comment, $matches /ux',
$comment,
$matches
); );
array_shift($matches); array_shift($matches);
} }
@@ -194,7 +200,15 @@ class DocBlock implements \Reflector
protected function parseTags($tags) protected function parseTags($tags)
{ {
$result = array(); $result = array();
foreach (explode("\n", trim($tags)) as $tag_line) { $tags = trim($tags);
if ('' !== $tags) {
if ('@' !== $tags[0]) {
throw new \LogicException(
'A tag block started with text instead of an actual tag,'
. ' this makes the tag block invalid: ' . $tags
);
}
foreach (explode("\n", $tags) as $tag_line) {
if (trim($tag_line) === '') { if (trim($tag_line) === '') {
continue; continue;
} }
@@ -202,22 +216,14 @@ class DocBlock implements \Reflector
if (isset($tag_line[0]) && ($tag_line[0] === '@')) { if (isset($tag_line[0]) && ($tag_line[0] === '@')) {
$result[] = $tag_line; $result[] = $tag_line;
} else { } else {
if (count($result) == 0) {
throw new \LogicException(
'A tag block started with text instead of an actual tag,'
. ' this makes the tag block invalid: ' . $tags
);
}
$result[count($result) - 1] .= PHP_EOL . $tag_line; $result[count($result) - 1] .= PHP_EOL . $tag_line;
} }
} }
// create proper Tag objects // create proper Tag objects
foreach ($result as $key => $tag_line) { foreach ($result as $key => $tag_line) {
$tag = DocBlock\Tag::createInstance($tag_line); $result[$key] = Tag::createInstance($tag_line, $this);
$tag->setDocBlock($this); }
$result[$key] = $tag;
} }
$this->tags = $result; $this->tags = $result;
@@ -236,17 +242,37 @@ class DocBlock implements \Reflector
/** /**
* Returns the full description or also known as long description. * Returns the full description or also known as long description.
* *
* @return \phpDocumentor\Reflection\DocBlock\LongDescription * @return DocBlock\Description
*/ */
public function getLongDescription() public function getLongDescription()
{ {
return $this->long_description; return $this->long_description;
} }
/**
* Returns the current context.
*
* @return Context
*/
public function getContext()
{
return $this->context;
}
/**
* Returns the current location.
*
* @return Location
*/
public function getLocation()
{
return $this->location;
}
/** /**
* Returns the tags for this DocBlock. * Returns the tags for this DocBlock.
* *
* @return \phpDocumentor\Reflection\DocBlock\Tag[] * @return Tag[]
*/ */
public function getTags() public function getTags()
{ {
@@ -254,18 +280,18 @@ class DocBlock implements \Reflector
} }
/** /**
* Returns an array of tags matching the given name; if no tags are found * Returns an array of tags matching the given name. If no tags are found
* an empty array is returned. * an empty array is returned.
* *
* @param string $name String to search by. * @param string $name String to search by.
* *
* @return \phpDocumentor\Reflection\DocBlock_Tag[] * @return Tag[]
*/ */
public function getTagsByName($name) public function getTagsByName($name)
{ {
$result = array(); $result = array();
/** @var \phpDocumentor\Reflection\DocBlock\Tag $tag */ /** @var Tag $tag */
foreach ($this->getTags() as $tag) { foreach ($this->getTags() as $tag) {
if ($tag->getName() != $name) { if ($tag->getName() != $name) {
continue; continue;
@@ -286,7 +312,7 @@ class DocBlock implements \Reflector
*/ */
public function hasTag($name) public function hasTag($name)
{ {
/** @var \phpDocumentor\Reflection\DocBlock\Tag $tag */ /** @var Tag $tag */
foreach ($this->getTags() as $tag) { foreach ($this->getTags() as $tag) {
if ($tag->getName() == $name) { if ($tag->getName() == $name) {
return true; return true;
@@ -297,81 +323,29 @@ class DocBlock implements \Reflector
} }
/** /**
* Tries to expand a type to it's full namespaced equivalent (FQCN). * Appends a tag at the end of the list of tags.
* *
* This method will take the given type and examine the current namespace * @param Tag $tag The tag to add.
* and namespace aliases to see whether it should expand it into a FQCN
* as defined by the rules in PHP.
* *
* @param string $type Type to expand into full namespaced * @return Tag The newly added tag.
* equivalent.
* @param string[] $ignore_keywords Whether to ignore given keywords, when
* null it will use the default keywords: 'string', 'int', 'integer',
* 'bool', 'boolean', 'float', 'double', 'object', 'mixed', 'array',
* 'resource', 'void', 'null', 'callback', 'false', 'true'.
* Default value for this parameter is null.
* *
* @return string * @throws \LogicException When the tag belongs to a different DocBlock.
*/ */
public function expandType($type, $ignore_keywords = null) public function appendTag(Tag $tag)
{ {
if ($type === null) { if (null === $tag->getDocBlock()) {
return null; $tag->setDocBlock($this);
} }
if ($ignore_keywords === null) { if ($tag->getDocBlock() === $this) {
$ignore_keywords = array( $this->tags[] = $tag;
'string', 'int', 'integer', 'bool', 'boolean', 'float', 'double', } else {
'object', 'mixed', 'array', 'resource', 'void', 'null', throw new \LogicException(
'callback', 'false', 'true', 'self', '$this', 'callable' 'This tag belongs to a different DocBlock object.'
); );
} }
$namespace = ''; return $tag;
if ($this->namespace != 'default' && $this->namespace != 'global') {
$namespace = rtrim($this->namespace, '\\') . '\\';
}
$type = explode('|', $type);
foreach ($type as &$item) {
$item = trim($item);
// add support for array notation
$is_array = false;
if (substr($item, -2) == '[]') {
$item = substr($item, 0, -2);
$is_array = true;
}
if ((substr($item, 0, 1) != '\\')
&& (!in_array(strtolower($item), $ignore_keywords))
) {
$type_parts = explode('\\', $item);
// if the first segment is an alias; replace with full name
if (isset($this->namespace_aliases[$type_parts[0]])) {
$type_parts[0] = $this->namespace_aliases[$type_parts[0]];
$item = implode('\\', $type_parts);
} else {
// otherwise prepend the current namespace
$item = $namespace . $item;
}
}
// full paths always start with a slash
if (isset($item[0]) && ($item[0] !== '\\')
&& (!in_array(strtolower($item), $ignore_keywords))
) {
$item = '\\' . $item;
}
// re-add the array notation markers
if ($is_array) {
$item .= '[]';
}
}
return implode('|', $type);
} }
/** /**
@@ -381,8 +355,9 @@ class DocBlock implements \Reflector
* implement it. * implement it.
* *
* @return string * @return string
* @codeCoverageIgnore Not yet implemented
*/ */
static public function export() public static function export()
{ {
throw new \Exception('Not yet implemented'); throw new \Exception('Not yet implemented');
} }
@@ -392,10 +367,10 @@ class DocBlock implements \Reflector
* BUT this throws an exception at this point). * BUT this throws an exception at this point).
* *
* @return string * @return string
* @codeCoverageIgnore Not yet implemented
*/ */
public function __toString() public function __toString()
{ {
return 'Not yet implemented'; return 'Not yet implemented';
} }
} }
@@ -0,0 +1,154 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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;
/**
* The context in which a DocBlock occurs.
*
* @author Vasil Rangelov <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class Context
{
/** @var string The current namespace. */
protected $namespace = '';
/** @var array List of namespace aliases => Fully Qualified Namespace. */
protected $namespace_aliases = array();
/** @var string Name of the structural element, within the namespace. */
protected $lsen = '';
/**
* Cteates a new context.
* @param string $namespace The namespace where this DocBlock
* resides in.
* @param array $namespace_aliases List of namespace aliases => Fully
* Qualified Namespace.
* @param string $lsen Name of the structural element, within
* the namespace.
*/
public function __construct(
$namespace = '',
array $namespace_aliases = array(),
$lsen = ''
) {
if (!empty($namespace)) {
$this->setNamespace($namespace);
}
$this->setNamespaceAliases($namespace_aliases);
$this->setLSEN($lsen);
}
/**
* @return string The namespace where this DocBlock resides in.
*/
public function getNamespace()
{
return $this->namespace;
}
/**
* @return array List of namespace aliases => Fully Qualified Namespace.
*/
public function getNamespaceAliases()
{
return $this->namespace_aliases;
}
/**
* Returns the Local Structural Element Name.
*
* @return string Name of the structural element, within the namespace.
*/
public function getLSEN()
{
return $this->lsen;
}
/**
* Sets a new namespace.
*
* Sets a new namespace for the context. Leading and trailing slashes are
* trimmed, and the keywords "global" and "default" are treated as aliases
* to no namespace.
*
* @param string $namespace The new namespace to set.
*
* @return $this
*/
public function setNamespace($namespace)
{
if ('global' !== $namespace
&& 'default' !== $namespace
) {
// Srip leading and trailing slash
$this->namespace = trim((string)$namespace, '\\');
} else {
$this->namespace = '';
}
return $this;
}
/**
* Sets the namespace aliases, replacing all previous ones.
*
* @param array $namespace_aliases List of namespace aliases => Fully
* Qualified Namespace.
*
* @return $this
*/
public function setNamespaceAliases(array $namespace_aliases)
{
$this->namespace_aliases = array();
foreach ($namespace_aliases as $alias => $fqnn) {
$this->setNamespaceAlias($alias, $fqnn);
}
return $this;
}
/**
* Adds a namespace alias to the context.
*
* @param string $alias The alias name (the part after "as", or the last
* part of the Fully Qualified Namespace Name) to add.
* @param string $fqnn The Fully Qualified Namespace Name for this alias.
* Any form of leading/trailing slashes are accepted, but what will be
* stored is a name, prefixed with a slash, and no trailing slash.
*
* @return $this
*/
public function setNamespaceAlias($alias, $fqnn)
{
$this->namespace_aliases[$alias] = '\\' . trim((string)$fqnn, '\\');
return $this;
}
/**
* Sets a new Local Structural Element Name.
*
* Sets a new Local Structural Element Name. A local name also contains
* punctuation determining the kind of structural element (e.g. trailing "("
* and ")" for functions and methods).
*
* @param string $lsen The new local name of a structural element.
*
* @return $this
*/
public function setLSEN($lsen)
{
$this->lsen = (string)$lsen;
return $this;
}
}
@@ -0,0 +1,222 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @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;
use phpDocumentor\Reflection\DocBlock;
/**
* Parses a Description of a DocBlock or tag.
*
* @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class Description implements \Reflector
{
/** @var string */
protected $contents = '';
/** @var array The contents, as an array of strings and Tag objects. */
protected $parsedContents = null;
/** @var DocBlock The DocBlock which this description belongs to. */
protected $docblock = null;
/**
* Populates the fields of a description.
*
* @param string $content The description's conetnts.
* @param DocBlock $docblock The DocBlock which this description belongs to.
*/
public function __construct($content, DocBlock $docblock = null)
{
$this->setContent($content)->setDocBlock($docblock);
}
/**
* Gets the text of this description.
*
* @return string
*/
public function getContents()
{
return $this->contents;
}
/**
* Sets the text of this description.
*
* @param string $content The new text of this description.
*
* @return $this
*/
public function setContent($content)
{
$this->contents = trim($content);
$this->parsedContents = null;
return $this;
}
/**
* Returns the parsed text of this description.
*
* @return array An array of strings and tag objects, in the order they
* occur within the description.
*/
public function getParsedContents()
{
if (null === $this->parsedContents) {
$this->parsedContents = preg_split(
'/\{
# "{@}" is not a valid inline tag. This ensures that
# we do not treat it as one, but treat it literally.
(?!@\})
# We want to capture the whole tag line, but without the
# inline tag delimiters.
(\@
# Match everything up to the next delimiter.
[^{}]*
# Nested inline tag content should not be captured, or
# it will appear in the result separately.
(?:
# Match nested inline tags.
(?:
# Because we did not catch the tag delimiters
# earlier, we must be explicit with them here.
# Notice that this also matches "{}", as a way
# to later introduce it as an escape sequence.
\{(?1)?\}
|
# Make sure we match hanging "{".
\{
)
# Match content after the nested inline tag.
[^{}]*
)* # If there are more inline tags, match them as well.
# We use "*" since there may not be any nested inline
# tags.
)
\}/Sux',
$this->contents,
null,
PREG_SPLIT_DELIM_CAPTURE
);
$count = count($this->parsedContents);
for ($i=1; $i<$count; $i += 2) {
$this->parsedContents[$i] = Tag::createInstance(
$this->parsedContents[$i],
$this->docblock
);
}
//In order to allow "literal" inline tags, the otherwise invalid
//sequence "{@}" is changed to "@", and "{}" is changed to "}".
//See unit tests for examples.
for ($i=0; $i<$count; $i += 2) {
$this->parsedContents[$i] = str_replace(
array('{@}', '{}'),
array('@', '}'),
$this->parsedContents[$i]
);
}
}
return $this->parsedContents;
}
/**
* 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.
*
* @codeCoverageIgnore Will be removed soon, in favor of adapters at
* PhpDocumentor itself that will process text in various formats.
*
* @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')) {
$markdown = new \dflydev\markdown\MarkdownExtraParser();
$result = $markdown->transformMarkdown($result);
}
return trim($result);
}
/**
* Gets the docblock this tag belongs to.
*
* @return DocBlock The docblock this description belongs to.
*/
public function getDocBlock()
{
return $this->docblock;
}
/**
* Sets the docblock this tag belongs to.
*
* @param DocBlock $docblock The new docblock this description belongs to.
* Setting NULL removes any association.
*
* @return $this
*/
public function setDocBlock(DocBlock $docblock = null)
{
$this->docblock = $docblock;
return $this;
}
/**
* Builds a string representation of this object.
*
* @todo determine the exact format as used by PHP Reflection
* and implement it.
*
* @return void
* @codeCoverageIgnore Not yet implemented
*/
public static 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
* @codeCoverageIgnore Not yet implemented
*/
public function __toString()
{
return 'Not yet implemented';
}
}
@@ -0,0 +1,76 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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;
/**
* The location a DocBlock occurs within a file.
*
* @author Vasil Rangelov <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class Location
{
/** @var int Line where the DocBlock text starts. */
protected $lineNumber = 0;
/** @var int Column where the DocBlock text starts. */
protected $columnNumber = 0;
public function __construct(
$lineNumber = 0,
$columnNumber = 0
) {
$this->setLineNumber($lineNumber)->setColumnNumber($columnNumber);
}
/**
* @return int Line where the DocBlock text starts.
*/
public function getLineNumber()
{
return $this->lineNumber;
}
/**
*
* @param type $lineNumber
* @return $this
*/
public function setLineNumber($lineNumber)
{
$this->lineNumber = (int)$lineNumber;
return $this;
}
/**
* @return int Column where the DocBlock text starts.
*/
public function getColumnNumber()
{
return $this->columnNumber;
}
/**
*
* @param int $columnNumber
* @return $this
*/
public function setColumnNumber($columnNumber)
{
$this->columnNumber = (int)$columnNumber;
return $this;
}
}
@@ -1,121 +0,0 @@
<?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('/\{\@(.+?)\}/u', $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';
}
}
+255 -47
View File
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -12,6 +12,8 @@
namespace phpDocumentor\Reflection\DocBlock; namespace phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock;
/** /**
* Parses a tag definition for a DocBlock. * Parses a tag definition for a DocBlock.
* *
@@ -21,68 +23,189 @@ namespace phpDocumentor\Reflection\DocBlock;
*/ */
class Tag implements \Reflector class Tag implements \Reflector
{ {
/**
* PCRE regular expression matching a tag name.
*/
const REGEX_TAGNAME = '[\w\-\_\\\\]+';
/** @var string Name of the tag */ /** @var string Name of the tag */
protected $tag = ''; protected $tag = '';
/** @var string content of the tag */ /**
* @var string|null Content of the tag.
* When set to NULL, it means it needs to be regenerated.
*/
protected $content = ''; protected $content = '';
/** @var string description of the content of this tag */ /** @var string Description of the content of this tag */
protected $description = ''; protected $description = '';
/** @var int line number of the tag */ /**
protected $line_number = 0; * @var array|null The description, as an array of strings and Tag objects.
* When set to NULL, it means it needs to be regenerated.
*/
protected $parsedDescription = null;
/** @var \phpDocumentor\Reflection\DocBlock docblock class */ /** @var Location Location of the tag. */
protected $docblock; protected $location = null;
/** @var DocBlock The DocBlock which this tag belongs to. */
protected $docblock = null;
/**
* @var array An array with a tag as a key, and an FQCN to a class that
* handles it as an array value. The class is expected to inherit this
* class.
*/
private static $tagHandlerMappings = array(
'author'
=> '\phpDocumentor\Reflection\DocBlock\Tag\AuthorTag',
'covers'
=> '\phpDocumentor\Reflection\DocBlock\Tag\CoversTag',
'deprecated'
=> '\phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag',
'example'
=> '\phpDocumentor\Reflection\DocBlock\Tag\ExampleTag',
'link'
=> '\phpDocumentor\Reflection\DocBlock\Tag\LinkTag',
'method'
=> '\phpDocumentor\Reflection\DocBlock\Tag\MethodTag',
'param'
=> '\phpDocumentor\Reflection\DocBlock\Tag\ParamTag',
'property-read'
=> '\phpDocumentor\Reflection\DocBlock\Tag\PropertyReadTag',
'property'
=> '\phpDocumentor\Reflection\DocBlock\Tag\PropertyTag',
'property-write'
=> '\phpDocumentor\Reflection\DocBlock\Tag\PropertyWriteTag',
'return'
=> '\phpDocumentor\Reflection\DocBlock\Tag\ReturnTag',
'see'
=> '\phpDocumentor\Reflection\DocBlock\Tag\SeeTag',
'since'
=> '\phpDocumentor\Reflection\DocBlock\Tag\SinceTag',
'source'
=> '\phpDocumentor\Reflection\DocBlock\Tag\SourceTag',
'throw'
=> '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
'throws'
=> '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
'uses'
=> '\phpDocumentor\Reflection\DocBlock\Tag\UsesTag',
'var'
=> '\phpDocumentor\Reflection\DocBlock\Tag\VarTag',
'version'
=> '\phpDocumentor\Reflection\DocBlock\Tag\VersionTag'
);
/** /**
* Factory method responsible for instantiating the correct sub type. * Factory method responsible for instantiating the correct sub type.
* *
* @param string $tag_line The text for this tag, including description. * @param string $tag_line The text for this tag, including description.
* @param DocBlock $docblock The DocBlock which this tag belongs to.
* @param Location $location Location of the tag.
* *
* @throws \InvalidArgumentException if an invalid tag line was presented. * @throws \InvalidArgumentException if an invalid tag line was presented.
* *
* @return \phpDocumentor\Reflection\DocBlock\Tag * @return static A new tag object.
*/ */
public static function createInstance($tag_line) final public static function createInstance(
{ $tag_line,
DocBlock $docblock = null,
Location $location = null
) {
if (!preg_match( if (!preg_match(
'/^@([\w\-\_\\\\]+)(?:\s*([^\s].*)|$)?/us', $tag_line, $matches '/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us',
$tag_line,
$matches
)) { )) {
throw new \InvalidArgumentException( throw new \InvalidArgumentException(
'Invalid tag_line detected: ' . $tag_line 'Invalid tag_line detected: ' . $tag_line
); );
} }
// support hypphen separated tag names $handler = __CLASS__;
$tag_name = str_replace( if (isset(self::$tagHandlerMappings[$matches[1]])) {
' ', '', ucwords(str_replace('-', ' ', $matches[1])) $handler = self::$tagHandlerMappings[$matches[1]];
).'Tag'; } elseif (isset($docblock)) {
$class_name = 'phpDocumentor\\Reflection\\DocBlock\\Tag\\' . $tag_name; $tagName = (string)new Type\Collection(
array($matches[1]),
$docblock->getContext()
);
return (@class_exists($class_name)) if (isset(self::$tagHandlerMappings[$tagName])) {
? new $class_name($matches[1], isset($matches[2]) ? $matches[2] : '') $handler = self::$tagHandlerMappings[$tagName];
: new self($matches[1], isset($matches[2]) ? $matches[2] : ''); }
}
return new $handler(
$matches[1],
isset($matches[2]) ? $matches[2] : '',
$docblock,
$location
);
}
/**
* Registers a handler for tags.
*
* Registers a handler for tags. The class specified is autoloaded if it's
* not available. It must inherit from this class.
*
* @param string $tag Name of tag to regiser a handler for. When
* registering a namespaced tag, the full name, along with a prefixing
* slash MUST be provided.
* @param string|null $handler FQCN of handler. Specifing NULL removes the
* handler for the specified tag, if any.
*
* @return bool TRUE on success, FALSE on failure.
*/
final public static function registerTagHandler($tag, $handler)
{
$tag = trim((string)$tag);
if (null === $handler) {
unset(self::$tagHandlerMappings[$tag]);
return true;
}
if ('' !== $tag
&& class_exists($handler, true)
&& is_subclass_of($handler, __CLASS__)
&& !strpos($tag, '\\') //Accept no slash, and 1st slash at offset 0.
) {
self::$tagHandlerMappings[$tag] = $handler;
return true;
}
return false;
} }
/** /**
* Parses a tag and populates the member variables. * Parses a tag and populates the member variables.
* *
* @param string $type Name of the tag. * @param string $name Name of the tag.
* @param string $content The contents of the given tag. * @param string $content The contents of the given tag.
* @param DocBlock $docblock The DocBlock which this tag belongs to.
* @param Location $location Location of the tag.
*/ */
public function __construct($type, $content) public function __construct(
{ $name,
$this->tag = $type; $content,
$this->content = $content; DocBlock $docblock = null,
$this->description = $content; Location $location = null
) {
$this
->setName($name)
->setContent($content)
->setDocBlock($docblock)
->setLocation($location);
} }
/** /**
* Returns the name of this tag. * Gets the name of this tag.
* *
* @return string * @return string The name of this tag.
*/ */
public function getName() public function getName()
{ {
@@ -90,17 +213,57 @@ class Tag implements \Reflector
} }
/** /**
* Returns the content of this tag. * Sets the name of this tag.
*
* @param string $name The new name of this tag.
*
* @return $this
* @throws \InvalidArgumentException When an invalid tag name is provided.
*/
public function setName($name)
{
if (!preg_match('/^' . self::REGEX_TAGNAME . '$/u', $name)) {
throw new \InvalidArgumentException(
'Invalid tag name supplied: ' . $name
);
}
$this->tag = $name;
return $this;
}
/**
* Gets the content of this tag.
* *
* @return string * @return string
*/ */
public function getContent() public function getContent()
{ {
if (null === $this->content) {
$this->content = $this->description;
}
return $this->content; return $this->content;
} }
/** /**
* Returns the description component of this tag. * Sets the content of this tag.
*
* @param string $content The new content of this tag.
*
* @return $this
*/
public function setContent($content)
{
$this->setDescription($content);
$this->content = $content;
return $this;
}
/**
* Gets the description component of this tag.
* *
* @return string * @return string
*/ */
@@ -110,39 +273,83 @@ class Tag implements \Reflector
} }
/** /**
* Set the tag line number * Sets the description component of this tag.
* *
* @param int $number the line number of the tag * @param string $description The new description component of this tag.
* *
* @return void * @return $this
*/ */
public function setLineNumber($number) public function setDescription($description)
{ {
$this->line_number = (int)$number; $this->content = null;
$this->parsedDescription = null;
$this->description = trim($description);
return $this;
} }
/** /**
* Get the line number of the tag * Gets the parsed text of this description.
* *
* @return int tag line number * @return array An array of strings and tag objects, in the order they
* occur within the description.
*/ */
public function getLineNumber() public function getParsedDescription()
{ {
return $this->line_number; if (null === $this->parsedDescription) {
$description = new Description($this->description, $this->docblock);
$this->parsedDescription = $description->getParsedContents();
}
return $this->parsedDescription;
} }
/** /**
* Inject the docblock class * Gets the docblock this tag belongs to.
* *
* This exposes some common functionality contained in the docblock abstract. * @return DocBlock The docblock this tag belongs to.
*
* @param object $docblock Object containing the DocBlock.
*
* @return void
*/ */
public function setDocBlock($docblock) public function getDocBlock()
{
return $this->docblock;
}
/**
* Sets the docblock this tag belongs to.
*
* @param DocBlock $docblock The new docblock this tag belongs to. Setting
* NULL removes any association.
*
* @return $this
*/
public function setDocBlock(DocBlock $docblock = null)
{ {
$this->docblock = $docblock; $this->docblock = $docblock;
return $this;
}
/**
* Gets the location of the tag.
*
* @return Location The tag's location.
*/
public function getLocation()
{
return $this->location;
}
/**
* Sets the location of the tag.
*
* @param Location $location The new location of the tag.
*
* @return $this
*/
public function setLocation(Location $location = null)
{
$this->location = $location;
return $this;
} }
/** /**
@@ -151,8 +358,9 @@ class Tag implements \Reflector
* @todo determine the exact format as used by PHP Reflection and implement it. * @todo determine the exact format as used by PHP Reflection and implement it.
* *
* @return void * @return void
* @codeCoverageIgnore Not yet implemented
*/ */
static public function export() public static function export()
{ {
throw new \Exception('Not yet implemented'); throw new \Exception('Not yet implemented');
} }
@@ -162,10 +370,10 @@ class Tag implements \Reflector
* BUT this throws an exception at this point). * BUT this throws an exception at this point).
* *
* @return string * @return string
* @codeCoverageIgnore Not yet implemented
*/ */
public function __toString() public function __toString()
{ {
return 'Not yet implemented'; return 'Not yet implemented';
} }
} }
@@ -0,0 +1,131 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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 an @author 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 AuthorTag extends Tag
{
/**
* PCRE regular expression matching any valid value for the name component.
*/
const REGEX_AUTHOR_NAME = '[^\<]*';
/**
* PCRE regular expression matching any valid value for the email component.
*/
const REGEX_AUTHOR_EMAIL = '[^\>]*';
/** @var string The name of the author */
protected $authorName = '';
/** @var string The email of the author */
protected $authorEmail = '';
public function getContent()
{
if (null === $this->content) {
$this->content = $this->authorName;
if ('' != $this->authorEmail) {
$this->content .= "<{$this->authorEmail}>";
}
}
return $this->content;
}
/**
* {@inheritdoc}
*/
public function setContent($content)
{
parent::setContent($content);
if (preg_match(
'/^(' . self::REGEX_AUTHOR_NAME .
')(\<(' . self::REGEX_AUTHOR_EMAIL .
')\>)?$/u',
$this->description,
$matches
)) {
$this->authorName = trim($matches[1]);
if (isset($matches[3])) {
$this->authorEmail = trim($matches[3]);
}
}
return $this;
}
/**
* Gets the author's name.
*
* @return string The author's name.
*/
public function getAuthorName()
{
return $this->authorName;
}
/**
* Sets the author's name.
*
* @param string $authorName The new author name.
* An invalid value will set an empty string.
*
* @return $this
*/
public function setAuthorName($authorName)
{
$this->content = null;
$this->authorName
= preg_match('/^' . self::REGEX_AUTHOR_NAME . '$/u', $authorName)
? $authorName : '';
return $this;
}
/**
* Gets the author's email.
*
* @return string The author's email.
*/
public function getAuthorEmail()
{
return $this->authorEmail;
}
/**
* Sets the author's email.
*
* @param string $authorEmail The new author email.
* An invalid value will set an empty string.
*
* @return $this
*/
public function setAuthorEmail($authorEmail)
{
$this->authorEmail
= preg_match('/^' . self::REGEX_AUTHOR_EMAIL . '$/u', $authorEmail)
? $authorEmail : '';
$this->content = null;
return $this;
}
}
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -21,5 +21,4 @@ namespace phpDocumentor\Reflection\DocBlock\Tag;
*/ */
class CoversTag extends SeeTag class CoversTag extends SeeTag
{ {
} }
@@ -0,0 +1,26 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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\VersionTag;
/**
* Reflection class for a @deprecated tag in a Docblock.
*
* @author Vasil Rangelov <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class DeprecatedTag extends VersionTag
{
}
@@ -0,0 +1,156 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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 @example tag in a Docblock.
*
* @author Vasil Rangelov <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class ExampleTag extends SourceTag
{
/**
* @var string Path to a file to use as an example.
* May also be an absolute URI.
*/
protected $filePath = '';
/**
* @var bool Whether the file path component represents an URI.
* This determines how the file portion appears at {@link getContent()}.
*/
protected $isURI = false;
/**
* {@inheritdoc}
*/
public function getContent()
{
if (null === $this->content) {
$filePath = '';
if ($this->isURI) {
if (false === strpos($this->filePath, ':')) {
$filePath = str_replace(
'%2F',
'/',
rawurlencode($this->filePath)
);
} else {
$filePath = $this->filePath;
}
} else {
$filePath = '"' . $this->filePath . '"';
}
$this->content = $filePath . ' ' . $this->getContent();
}
return $this->content;
}
/**
* {@inheritdoc}
*/
public function setContent($content)
{
Tag::setContent($content);
if (preg_match(
'/^
# File component
(?:
# File path in quotes
\"([^\"]+)\"
|
# File URI
(\S+)
)
# Remaining content (parsed by SourceTag)
(?:\s+(.*))?
$/sux',
$this->description,
$matches
)) {
if ('' !== $matches[1]) {
$this->setFilePath($matches[1]);
} else {
$this->setFileURI($matches[2]);
}
if (isset($matches[3])) {
parent::setContent($matches[3]);
} else {
$this->setDescription('');
}
$this->content = $content;
}
return $this;
}
/**
* Returns the file path.
*
* @return string Path to a file to use as an example.
* May also be an absolute URI.
*/
public function getFilePath()
{
return $this->filePath;
}
/**
* Sets the file path.
*
* @param string $filePath The new file path to use for the example.
*
* @return $this
*/
public function setFilePath($filePath)
{
$this->isURI = false;
$this->filePath = trim($filePath);
$this->content = null;
return $this;
}
/**
* Sets the file path as an URI.
*
* This function is equivalent to {@link setFilePath()}, except that it
* convers an URI to a file path before that.
*
* There is no getFileURI(), as {@link getFilePath()} is compatible.
*
* @param type $uri The new file URI to use as an example.
*/
public function setFileURI($uri)
{
$this->isURI = true;
if (false === strpos($uri, ':')) {
//Relative URL
$this->filePath = rawurldecode(
str_replace(array('/', '\\'), '%2F', $uri)
);
} else {
//Absolute URL or URI.
$this->filePath = $uri;
}
$this->content = null;
return $this;
}
}
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Ben Selby <[email protected]> * @author Ben Selby <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -11,6 +11,7 @@
*/ */
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tag;
/** /**
@@ -26,29 +27,35 @@ class LinkTag extends Tag
protected $link = ''; protected $link = '';
/** /**
* Parses a tag and populates the member variables. * {@inheritdoc}
*
* @param string $type Tag type
* @param string $content Content of the tag
*/ */
public function __construct($type, $content) public function getContent()
{ {
$this->tag = $type; if (null === $this->content) {
$pieces = explode(' ', $content); $this->content = "{$this->link} {$this->description}";
if (count($pieces) > 1) {
$this->link = array_shift($pieces);
$this->description = implode(' ', $pieces);
} else {
$this->link = $content;
$this->description = $content;
} }
$this->content = $content; return $this->content;
} }
/** /**
* Returns the link * {@inheritdoc}
*/
public function setContent($content)
{
parent::setContent($content);
$parts = preg_split('/\s+/Su', $this->description, 2);
$this->link = $parts[0];
$this->setDescription(isset($parts[1]) ? $parts[1] : $parts[0]);
$this->content = $content;
return $this;
}
/**
* Gets the link
* *
* @return string * @return string
*/ */
@@ -62,10 +69,13 @@ class LinkTag extends Tag
* *
* @param string $link The link * @param string $link The link
* *
* @return void * @return $this
*/ */
public function setLink($link) public function setLink($link)
{ {
$this->link = $link; $this->link = $link;
$this->content = null;
return $this;
} }
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -12,14 +12,16 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@method} in a Docblock. * Reflection class for a @method in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org * @link http://phpdoc.org
*/ */
class MethodTag extends ParamTag class MethodTag extends ReturnTag
{ {
/** @var string */ /** @var string */
@@ -29,17 +31,25 @@ class MethodTag extends ParamTag
protected $arguments = ''; protected $arguments = '';
/** /**
* Parses a tag and populates the member variables. * {@inheritdoc}
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/ */
public function __construct($type, $content) public function getContent()
{ {
$this->tag = $type; if (null === $this->content) {
$this->content = $content; $this->content = $this->type .
" {$this->method_name}({$this->arguments}) " .
$this->description;
}
$matches = array(); return $this;
}
/**
* {@inheritdoc}
*/
public function setContent($content)
{
Tag::setContent($content);
// 1. none or more whitespace // 1. none or more whitespace
// 2. optionally a word with underscores followed by whitespace : as // 2. optionally a word with underscores followed by whitespace : as
// type for the return value // type for the return value
@@ -49,9 +59,25 @@ class MethodTag extends ParamTag
// until a ) and whitespace : as method name with signature // until a ) and whitespace : as method name with signature
// 5. any remaining text : as description // 5. any remaining text : as description
if (preg_match( if (preg_match(
'/^[\s]*(?:([\w\|_\\\\]+)[\s]+)?(?:[\w_]+\(\)[\s]+)?([\w\|_\\\\]+)\(([^\)]*)\)' '/^
.'[\s]*(.*)/u', # Return type
$content, (?:
([\w\|_\\\\]+)
\s+
)?
# Legacy method name (not captured)
(?:
[\w_]+\(\)\s+
)?
# Method name
([\w\|_\\\\]+)
# Arguments
\(([^\)]*)\)
\s*
# Description
(.*)
$/sux',
$this->description,
$matches $matches
)) { )) {
list( list(
@@ -61,14 +87,16 @@ class MethodTag extends ParamTag
$this->arguments, $this->arguments,
$this->description $this->description
) = $matches; ) = $matches;
if (!$this->type) if (!$this->type) {
{
$this->type = 'void'; $this->type = 'void';
} }
$this->parsedDescription = null;
} else { } else {
echo date('c') . ' ERR (3): @method contained invalid contents: ' echo date('c') . ' ERR (3): @method contained invalid contents: '
. $this->content . PHP_EOL; . $this->content . PHP_EOL;
} }
return $this;
} }
/** /**
@@ -76,11 +104,14 @@ class MethodTag extends ParamTag
* *
* @param string $method_name The name of the method. * @param string $method_name The name of the method.
* *
* @return void * @return $this
*/ */
public function setMethodName($method_name) public function setMethodName($method_name)
{ {
$this->method_name = $method_name; $this->method_name = $method_name;
$this->content = null;
return $this;
} }
/** /**
@@ -103,6 +134,9 @@ class MethodTag extends ParamTag
public function setArguments($arguments) public function setArguments($arguments)
{ {
$this->arguments = $arguments; $this->arguments = $arguments;
$this->content = null;
return $this;
} }
/** /**
@@ -126,5 +160,4 @@ class MethodTag extends ParamTag
return $arguments; return $arguments;
} }
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -11,75 +11,69 @@
*/ */
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@param} tag in a Docblock. * Reflection class for a @param tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org * @link http://phpdoc.org
*/ */
class ParamTag extends Tag class ParamTag extends ReturnTag
{ {
/** @var string */
protected $type = null;
/** /**
* @var string * @var string
*/ */
protected $variableName = null; protected $variableName = '';
/** /**
* Parses a tag and populates the member variables. * {@inheritdoc}
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/ */
public function __construct($type, $content) public function getContent()
{ {
$this->tag = $type; if (null === $this->content) {
$this->content = $content; $this->content
$content = preg_split('/\s+/u', $content); = "{$this->type} {$this->variableName} {$this->description}";
}
return $this->content;
}
/**
* {@inheritdoc}
*/
public function setContent($content)
{
Tag::setContent($content);
$parts = preg_split(
'/(\s+)/Su',
$this->description,
3,
PREG_SPLIT_DELIM_CAPTURE
);
// if there is only 1, it is either a piece of content or a variable name // if the first item that is encountered is not a variable; it is a type
if (count($content) > 1) { if (isset($parts[0])
$this->type = array_shift($content); && (strlen($parts[0]) > 0)
&& ($parts[0][0] !== '$')
) {
$this->type = array_shift($parts);
array_shift($parts);
} }
// if the next item starts with a $ it must be the variable name // if the next item starts with a $ it must be the variable name
if ((strlen($content[0]) > 0) && ($content[0][0] == '$')) { if (isset($parts[0])
$this->variableName = array_shift($content); && (strlen($parts[0]) > 0)
&& ($parts[0][0] == '$')
) {
$this->variableName = array_shift($parts);
array_shift($parts);
} }
$this->description = implode(' ', $content); $this->setDescription(implode('', $parts));
}
/** $this->content = $content;
* Returns the unique types of the variable. return $this;
*
* @return string[]
*/
public function getTypes()
{
$types = explode('|', $this->type);
foreach ($types as &$type) {
$type = !empty($type) && $this->docblock
? $this->docblock->expandType($type)
: trim($type);
}
return $types;
}
/**
* Returns the type section of the variable.
*
* @return string
*/
public function getType()
{
return $this->docblock->expandType($this->type);
} }
/** /**
@@ -97,10 +91,13 @@ class ParamTag extends Tag
* *
* @param string $name The new name for this variable. * @param string $name The new name for this variable.
* *
* @return void * @return $this
*/ */
public function setVariableName($name) public function setVariableName($name)
{ {
$this->variableName = $name; $this->variableName = $name;
$this->content = null;
return $this;
} }
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -13,7 +13,7 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@property} tag in a Docblock. * Reflection class for a @property-read tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
@@ -21,5 +21,4 @@ namespace phpDocumentor\Reflection\DocBlock\Tag;
*/ */
class PropertyReadTag extends PropertyTag class PropertyReadTag extends PropertyTag
{ {
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -13,7 +13,7 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@property} tag in a Docblock. * Reflection class for a @property tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
@@ -21,5 +21,4 @@ namespace phpDocumentor\Reflection\DocBlock\Tag;
*/ */
class PropertyTag extends ParamTag class PropertyTag extends ParamTag
{ {
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -13,7 +13,7 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@property} tag in a Docblock. * Reflection class for a @property-write tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
@@ -21,5 +21,4 @@ namespace phpDocumentor\Reflection\DocBlock\Tag;
*/ */
class PropertyWriteTag extends PropertyTag class PropertyWriteTag extends PropertyTag
{ {
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -12,35 +12,87 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Type\Collection;
/** /**
* Reflection class for a {@return} tag in a Docblock. * Reflection class for a @return tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org * @link http://phpdoc.org
*/ */
class ReturnTag extends ParamTag class ReturnTag extends Tag
{ {
/** @var string */ /** @var string The raw type component. */
protected $type = null; protected $type = '';
/** @var Collection The parsed type component. */
protected $types = null;
/** /**
* Parses a tag and populates the member variables. * {@inheritdoc}
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/ */
public function __construct($type, $content) public function getCotnent()
{ {
$this->tag = $type; if (null === $this->content) {
$this->content = $content; $this->content = "{$this->type} {$this->description}";
}
$content = preg_split('/[\ \t]+/u', $content, 2); return $this->cotnent;
}
/**
* {@inheritdoc}
*/
public function setContent($content)
{
parent::setContent($content);
$parts = preg_split('/\s+/Su', $this->description, 2);
// any output is considered a type // any output is considered a type
$this->type = array_shift($content); $this->type = $parts[0];
$this->description = implode(' ', $content); $this->setDescription(isset($parts[1]) ? $parts[1] : '');
$this->content = $content;
return $this;
} }
/**
* Returns the unique types of the variable.
*
* @return string[]
*/
public function getTypes()
{
return $this->getTypesCollection()->getArrayCopy();
}
/**
* Returns the type section of the variable.
*
* @return string
*/
public function getType()
{
return (string) $this->getTypesCollection();
}
/**
* Returns the type collection.
*
* @return void
*/
protected function getTypesCollection()
{
if (null === $this->types) {
$this->types = new Collection(
array($this->type),
$this->docblock ? $this->docblock->getContext() : null
);
}
return $this->types;
}
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -11,10 +11,11 @@
*/ */
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@see} tag in a Docblock. * Reflection class for a @see tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
@@ -26,25 +27,35 @@ class SeeTag extends Tag
protected $refers = null; protected $refers = null;
/** /**
* Parses a tag and populates the member variables. * {@inheritdoc}
*
* @param string $type Tag identifier for this tag (should be 'return')
* @param string $content Contents for this tag.
*/ */
public function __construct($type, $content) public function getContent()
{ {
$this->tag = $type; if (null === $this->content) {
$this->content = $content; $this->content = "{$this->refers} {$this->description}";
$content = preg_split('/\s+/u', $content); }
return $this->content;
// any output is considered a type
$this->refers = array_shift($content);
$this->description = implode(' ', $content);
} }
/** /**
* Returns the type of the variable. * {@inheritdoc}
*/
public function setContent($content)
{
parent::setContent($content);
$parts = preg_split('/\s+/Su', $this->description, 2);
// any output is considered a type
$this->refers = $parts[0];
$this->setDescription(isset($parts[1]) ? $parts[1] : '');
$this->content = $content;
return $this;
}
/**
* Gets the structural element this tag refers to.
* *
* @return string * @return string
*/ */
@@ -53,4 +64,18 @@ class SeeTag extends Tag
return $this->refers; return $this->refers;
} }
/**
* Sets the structural element this tag refers to.
*
* @param string $refers The new type this tag refers to.
*
* @return $this
*/
public function setReference($refers)
{
$this->refers = $refers;
$this->content = null;
return $this;
}
} }
@@ -0,0 +1,26 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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\VersionTag;
/**
* Reflection class for a @since tag in a Docblock.
*
* @author Vasil Rangelov <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class SinceTag extends VersionTag
{
}
@@ -0,0 +1,137 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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 @source tag in a Docblock.
*
* @author Vasil Rangelov <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class SourceTag extends Tag
{
/**
* @var int The starting line, relative to the structural element's
* location.
*/
protected $startingLine = 1;
/**
* @var int|null The number of lines, relative to the starting line. NULL
* means "to the end".
*/
protected $lineCount = null;
/**
* {@inheritdoc}
*/
public function getContent()
{
if (null === $this->content) {
$this->content
= "{$this->startingLine} {$this->lineCount} {$this->description}";
}
return $this->content;
}
/**
* {@inheritdoc}
*/
public function setContent($content)
{
parent::setContent($content);
if (preg_match(
'/^
# Starting line
([1-9]\d*)
\s*
# Number of lines
(?:
((?1))
\s+
)?
# Description
(.*)
$/sux',
$this->description,
$matches
)) {
$this->startingLine = (int)$matches[1];
if (isset($matches[2]) && '' !== $matches[2]) {
$this->lineCount = (int)$matches[2];
}
$this->setDescription($matches[3]);
$this->content = $content;
}
return $this;
}
/**
* Gets the starting line.
*
* @return int The starting line, relative to the structural element's
* location.
*/
public function getStartingLine()
{
return $this->startingLine;
}
/**
* Sets the starting line.
*
* @param int $startingLine The new starting line, relative to the
* structural element's location.
*
* @return $this
*/
public function setStartingLine($startingLine)
{
$this->startingLine = $startingLine;
$this->content = null;
return $this;
}
/**
* Returns the number of lines.
*
* @return int|null The number of lines, relative to the starting line. NULL
* means "to the end".
*/
public function getLineCount()
{
return $this->lineCount;
}
/**
* Sets the number of lines.
*
* @param int|null $lineCount The new number of lines, relative to the
* starting line. NULL means "to the end".
*
* @return $this
*/
public function setLineCount($lineCount)
{
$this->lineCount = $lineCount;
$this->content = null;
return $this;
}
}
@@ -1,43 +0,0 @@
<?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);
}
}
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -13,7 +13,7 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@throws} tag in a Docblock. * Reflection class for a @throws tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
@@ -21,5 +21,4 @@ namespace phpDocumentor\Reflection\DocBlock\Tag;
*/ */
class ThrowsTag extends ReturnTag class ThrowsTag extends ReturnTag
{ {
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -13,7 +13,7 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@uses} tag in a Docblock. * Reflection class for a @uses tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
@@ -21,5 +21,4 @@ namespace phpDocumentor\Reflection\DocBlock\Tag;
*/ */
class UsesTag extends SeeTag class UsesTag extends SeeTag
{ {
} }
@@ -2,7 +2,7 @@
/** /**
* phpDocumentor * phpDocumentor
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
@@ -13,7 +13,7 @@
namespace phpDocumentor\Reflection\DocBlock\Tag; namespace phpDocumentor\Reflection\DocBlock\Tag;
/** /**
* Reflection class for a {@var} tag in a Docblock. * Reflection class for a @var tag in a Docblock.
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT * @license http://www.opensource.org/licenses/mit-license.php MIT
@@ -21,33 +21,4 @@ namespace phpDocumentor\Reflection\DocBlock\Tag;
*/ */
class VarTag extends ParamTag 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);
}
} }
@@ -0,0 +1,108 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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 @version tag in a Docblock.
*
* @author Vasil Rangelov <[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
class VersionTag extends Tag
{
/**
* PCRE regular expression matching a version vector.
* Assumes the "x" modifier.
*/
const REGEX_VECTOR = '(?:
# Normal release vectors.
\d\S*
|
# VCS version vectors. Per PHPCS, they are expected to
# follow the form of the VCS name, followed by ":", followed
# by the version vector itself.
# By convention, popular VCSes like CVS, SVN and GIT use "$"
# around the actual version vector.
[^\s\:]+\:\s*\$[^\$]+\$
)';
/** @var string The version vector. */
protected $version = '';
public function getContent()
{
if (null === $this->content) {
$this->content = "{$this->version} {$this->description}";
}
return $this->content;
}
/**
* {@inheritdoc}
*/
public function setContent($content)
{
parent::setContent($content);
if (preg_match(
'/^
# The version vector
(' . self::REGEX_VECTOR . ')
\s*
# The description
(.+)?
$/sux',
$this->description,
$matches
)) {
$this->version = $matches[1];
$this->setDescription(isset($matches[2]) ? $matches[2] : '');
$this->content = $content;
}
return $this;
}
/**
* Gets the version section of the tag.
*
* @return string The version section of the tag.
*/
public function getVersion()
{
return $this->version;
}
/**
* Sets the version section of the tag.
*
* @param string $version The new version section of the tag.
* An invalid value will set an empty string.
*
* @return $this
*/
public function setVersion($version)
{
$this->version
= preg_match('/^' . self::REGEX_VECTOR . '$/ux', $version)
? $version
: '';
$this->content = null;
return $this;
}
}
@@ -0,0 +1,221 @@
<?php
/**
* phpDocumentor
*
* PHP Version 5.3
*
* @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\Type;
use phpDocumentor\Reflection\DocBlock\Context;
/**
* Collection
*
* @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
*/
class Collection extends \ArrayObject
{
/** @var string Definition of the OR operator for types */
const OPERATOR_OR = '|';
/** @var string Definition of the ARRAY operator for types */
const OPERATOR_ARRAY = '[]';
/** @var string Definition of the NAMESPACE operator in PHP */
const OPERATOR_NAMESPACE = '\\';
/** @var string[] List of recognized keywords */
protected static $keywords = array(
'string', 'int', 'integer', 'bool', 'boolean', 'float', 'double',
'object', 'mixed', 'array', 'resource', 'void', 'null', 'scalar',
'callback', 'callable', 'false', 'true', 'self', '$this', 'static'
);
/**
* Current invoking location.
*
* This is used to prepend to type with a relative location.
* May also be 'default' or 'global', in which case they are ignored.
*
* @var Context
*/
protected $context = null;
/**
* Registers the namespace and aliases; uses that to add and expand the
* given types.
*
* @param string[] $types Array containing a list of types to add to this
* container.
* @param Context $location The current invoking location.
*/
public function __construct(
array $types = array(),
Context $context = null
) {
$this->context = null === $context ? new Context() : $context;
foreach ($types as $type) {
$this->add($type);
}
}
/**
* Returns the current invoking location.
*
* @return Context
*/
public function getContext()
{
return $this->context;
}
/**
* Adds a new type to the collection and expands it if it contains a
* relative namespace.
*
* If a class in the type contains a relative namespace than this collection
* will try to expand that into a FQCN.
*
* @param string $type A 'Type' as defined in the phpDocumentor
* documentation.
*
* @throws \InvalidArgumentException if a non-string argument is passed.
*
* @see http://phpdoc.org/docs/latest/for-users/types.html for the
* definition of a type.
*
* @return void
*/
public function add($type)
{
if (!is_string($type)) {
throw new \InvalidArgumentException(
'A type should be represented by a string, received: '
.var_export($type, true)
);
}
// separate the type by the OR operator
$type_parts = explode(self::OPERATOR_OR, $type);
foreach ($type_parts as $part) {
$expanded_type = $this->expand($part);
if ($expanded_type) {
$this[] = $expanded_type;
}
}
}
/**
* Returns a string representation of the collection.
*
* @return string The resolved types across the collection, separated with
* {@link self::OPERATOR_OR}.
*/
public function __toString()
{
return implode(self::OPERATOR_OR, $this->getArrayCopy());
}
/**
* Analyzes the given type and returns the FQCN variant.
*
* When a type is provided this method checks whether it is not a keyword or
* Fully Qualified Class Name. If so it will use the given namespace and
* aliases to expand the type to a FQCN representation.
*
* This method only works as expected if the namespace and aliases are set;
* no dynamic reflection is being performed here.
*
* @param string $type The relative or absolute type.
*
* @uses getNamespace to determine with what to prefix the type name.
* @uses getNamespaceAliases to check whether the first part of the relative
* type name should not be replaced with another namespace.
*
* @return string
*/
protected function expand($type)
{
$type = trim($type);
if (!$type) {
return '';
}
if ($this->isTypeAnArray($type)) {
return $this->expand(substr($type, 0, -2)) . self::OPERATOR_ARRAY;
}
if ($this->isRelativeType($type) && !$this->isTypeAKeyword($type)) {
$type_parts = explode(self::OPERATOR_NAMESPACE, $type, 2);
$namespace_aliases = $this->context->getNamespaceAliases();
// if the first segment is not an alias; prepend namespace name and
// return
if (!isset($namespace_aliases[$type_parts[0]])) {
$namespace = $this->context->getNamespace();
if ('' !== $namespace) {
$namespace .= self::OPERATOR_NAMESPACE;
}
return self::OPERATOR_NAMESPACE . $namespace . $type;
}
$type_parts[0] = $namespace_aliases[$type_parts[0]];
$type = implode(self::OPERATOR_NAMESPACE, $type_parts);
}
return $type;
}
/**
* Detects whether the given type represents an array.
*
* @param string $type A relative or absolute type as defined in the
* phpDocumentor documentation.
*
* @return bool
*/
protected function isTypeAnArray($type)
{
return substr($type, -2) === self::OPERATOR_ARRAY;
}
/**
* Detects whether the given type represents a PHPDoc keyword.
*
* @param string $type A relative or absolute type as defined in the
* phpDocumentor documentation.
*
* @return bool
*/
protected function isTypeAKeyword($type)
{
return in_array(strtolower($type), static::$keywords, true);
}
/**
* Detects whether the given type represents a relative or absolute path.
*
* This method will detect keywords as being absolute; even though they are
* not preceeded by a namespace separator.
*
* @param string $type A relative or absolute type as defined in the
* phpDocumentor documentation.
*
* @return bool
*/
protected function isRelativeType($type)
{
return ($type[0] !== self::OPERATOR_NAMESPACE)
|| $this->isTypeAKeyword($type);
}
}
@@ -0,0 +1,245 @@
<?php
/**
* phpDocumentor Description Test
*
* PHP Version 5.3
*
* @author Vasil Rangelov <[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;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Description
*
* @author Vasil Rangelov <[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
*/
class DescriptionTest extends \PHPUnit_Framework_TestCase
{
public function testConstruct()
{
$fixture = <<<LONGDESC
This is text for a description.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(1, $parsedContents);
$this->assertSame($fixture, $parsedContents[0]);
}
public function testInlineTagParsing()
{
$fixture = <<<LONGDESC
This is text for a {@link http://phpdoc.org/ description} that uses inline
tags.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(3, $parsedContents);
$this->assertSame('This is text for a ', $parsedContents[0]);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag\LinkTag',
$parsedContents[1]
);
$this->assertSame(
' that uses inline
tags.',
$parsedContents[2]
);
}
public function testInlineTagAtStartParsing()
{
$fixture = <<<LONGDESC
{@link http://phpdoc.org/ This} is text for a description that uses inline
tags.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(3, $parsedContents);
$this->assertSame('', $parsedContents[0]);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag\LinkTag',
$parsedContents[1]
);
$this->assertSame(
' is text for a description that uses inline
tags.',
$parsedContents[2]
);
}
public function testNestedInlineTagParsing()
{
$fixture = <<<LONGDESC
This is text for a description with {@internal inline tag with
{@link http://phpdoc.org another inline tag} in it}.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(3, $parsedContents);
$this->assertSame(
'This is text for a description with ',
$parsedContents[0]
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$parsedContents[1]
);
$this->assertSame('.', $parsedContents[2]);
$parsedDescription = $parsedContents[1]->getParsedDescription();
$this->assertCount(3, $parsedDescription);
$this->assertSame("inline tag with\n", $parsedDescription[0]);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag\LinkTag',
$parsedDescription[1]
);
$this->assertSame(' in it', $parsedDescription[2]);
}
public function testLiteralOpeningDelimiter()
{
$fixture = <<<LONGDESC
This is text for a description containing { that is literal.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(1, $parsedContents);
$this->assertSame($fixture, $parsedContents[0]);
}
public function testNestedLiteralOpeningDelimiter()
{
$fixture = <<<LONGDESC
This is text for a description containing {@internal inline tag that has { that
is literal}.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(3, $parsedContents);
$this->assertSame(
'This is text for a description containing ',
$parsedContents[0]
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$parsedContents[1]
);
$this->assertSame('.', $parsedContents[2]);
$this->assertSame(
array('inline tag that has { that
is literal'),
$parsedContents[1]->getParsedDescription()
);
}
public function testLiteralClosingDelimiter()
{
$fixture = <<<LONGDESC
This is text for a description with {} that is not a tag.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(1, $parsedContents);
$this->assertSame(
'This is text for a description with } that is not a tag.',
$parsedContents[0]
);
}
public function testNestedLiteralClosingDelimiter()
{
$fixture = <<<LONGDESC
This is text for a description with {@internal inline tag with {} that is not an
inline tag}.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(3, $parsedContents);
$this->assertSame(
'This is text for a description with ',
$parsedContents[0]
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$parsedContents[1]
);
$this->assertSame('.', $parsedContents[2]);
$this->assertSame(
array('inline tag with } that is not an
inline tag'),
$parsedContents[1]->getParsedDescription()
);
}
public function testInlineTagEscapingSequence()
{
$fixture = <<<LONGDESC
This is text for a description with literal {{@}link}.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(1, $parsedContents);
$this->assertSame(
'This is text for a description with literal {@link}.',
$parsedContents[0]
);
}
public function testNestedInlineTagEscapingSequence()
{
$fixture = <<<LONGDESC
This is text for a description with an {@internal inline tag with literal
{{@}link{} in it}.
LONGDESC;
$object = new Description($fixture);
$this->assertSame($fixture, $object->getContents());
$parsedContents = $object->getParsedContents();
$this->assertCount(3, $parsedContents);
$this->assertSame(
'This is text for a description with an ',
$parsedContents[0]
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$parsedContents[1]
);
$this->assertSame('.', $parsedContents[2]);
$this->assertSame(
array('inline tag with literal
{@link} in it'),
$parsedContents[1]->getParsedDescription()
);
}
}
@@ -2,54 +2,53 @@
/** /**
* phpDocumentor Covers Tag Test * phpDocumentor Covers Tag Test
* *
* PHP version 5.3
*
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__.'/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag.php';
require_once __DIR__.'/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php';
require_once __DIR__.'/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php';
/** /**
* Test class for phpDocumentor_Reflection_DocBlock_Tag_Covers * Test class for \phpDocumentor\Reflection\DocBlock\Tag\CoversTag
* *
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class CoversTagTest extends \PHPUnit_Framework_TestCase class CoversTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\Covers can create a link * Test that the \phpDocumentor\Reflection\DocBlock\Tag\CoversTag can create
* for the covers doc block * a link for the covers doc block.
* *
* @param string $type * @param string $type
* @param string $content * @param string $content
* @param string $exName
* @param string $exContent * @param string $exContent
* @param string $exReference * @param string $exReference
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\Covers::__construct * @covers \phpDocumentor\Reflection\DocBlock\Tag\CoversTag
* @dataProvider provideDataForConstuctor * @dataProvider provideDataForConstuctor
* *
* @return void * @return void
*/ */
public function testConstructorParesInputsIntoCorrectFields( public function testConstructorParesInputsIntoCorrectFields(
$type, $content, $exName, $exContent, $exDescription, $exReference $type,
) $content,
{ $exContent,
$exDescription,
$exReference
) {
$tag = new CoversTag($type, $content); $tag = new CoversTag($type, $content);
$actualName = $tag->getName(); $this->assertEquals($type, $tag->getName());
$actualContent = $tag->getContent(); $this->assertEquals($exContent, $tag->getContent());
$actualDescription = $tag->getDescription(); $this->assertEquals($exDescription, $tag->getDescription());
$actualReference = $tag->getReference(); $this->assertEquals($exReference, $tag->getReference());
$this->assertEquals($exName, $actualName);
$this->assertEquals($exContent, $actualContent);
$this->assertEquals($exDescription, $actualDescription);
$this->assertEquals($exReference, $actualReference);
} }
/** /**
@@ -59,28 +58,25 @@ class CoversTagTest extends \PHPUnit_Framework_TestCase
*/ */
public function provideDataForConstuctor() public function provideDataForConstuctor()
{ {
// $type, $content, $exName, $exContent, $exDescription, $exReference // $type, $content, $exContent, $exDescription, $exReference
return array( return array(
array( array(
'uses', 'covers',
'Foo::bar()', 'Foo::bar()',
'uses',
'Foo::bar()', 'Foo::bar()',
'', '',
'Foo::bar()' 'Foo::bar()'
), ),
array( array(
'uses', 'covers',
'Foo::bar() Testing', 'Foo::bar() Testing',
'uses',
'Foo::bar() Testing', 'Foo::bar() Testing',
'Testing', 'Testing',
'Foo::bar()', 'Foo::bar()',
), ),
array( array(
'uses', 'covers',
'Foo::bar() Testing comments', 'Foo::bar() Testing comments',
'uses',
'Foo::bar() Testing comments', 'Foo::bar() Testing comments',
'Testing comments', 'Testing comments',
'Foo::bar()', 'Foo::bar()',
@@ -0,0 +1,115 @@
<?php
/**
* phpDocumentor Deprecated Tag Test
*
* PHP version 5.3
*
* @author Vasil Rangelov <[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;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag
*
* @author Vasil Rangelov <[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
*/
class DeprecatedTagTest extends \PHPUnit_Framework_TestCase
{
/**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
* a link for the @deprecated doc block.
*
* @param string $type
* @param string $content
* @param string $exContent
* @param string $exDescription
* @param string $exVersion
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag
* @dataProvider provideDataForConstuctor
*
* @return void
*/
public function testConstructorParesInputsIntoCorrectFields(
$type,
$content,
$exContent,
$exDescription,
$exVersion
) {
$tag = new DeprecatedTag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($exContent, $tag->getContent());
$this->assertEquals($exDescription, $tag->getDescription());
$this->assertEquals($exVersion, $tag->getVersion());
}
/**
* Data provider for testConstructorParesInputsIntoCorrectFields
*
* @return array
*/
public function provideDataForConstuctor()
{
// $type, $content, $exContent, $exDescription, $exVersion
return array(
array(
'deprecated',
'1.0 First release.',
'1.0 First release.',
'First release.',
'1.0'
),
array(
'deprecated',
"1.0\nFirst release.",
"1.0\nFirst release.",
'First release.',
'1.0'
),
array(
'deprecated',
"1.0\nFirst\nrelease.",
"1.0\nFirst\nrelease.",
"First\nrelease.",
'1.0'
),
array(
'deprecated',
'Unfinished release',
'Unfinished release',
'Unfinished release',
''
),
array(
'deprecated',
'1.0',
'1.0',
'',
'1.0'
),
array(
'deprecated',
'GIT: $Id$',
'GIT: $Id$',
'',
'GIT: $Id$'
),
array(
'deprecated',
'GIT: $Id$ Dev build',
'GIT: $Id$ Dev build',
'Dev build',
'GIT: $Id$'
)
);
}
}
@@ -0,0 +1,203 @@
<?php
/**
* phpDocumentor Example Tag Test
*
* PHP version 5.3
*
* @author Vasil Rangelov <[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;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag
*
* @author Vasil Rangelov <[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
*/
class ExampleTagTest extends \PHPUnit_Framework_TestCase
{
/**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can
* understand the @source DocBlock.
*
* @param string $type
* @param string $content
* @param string $exContent
* @param string $exStartingLine
* @param string $exLineCount
* @param string $exFilepath
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag
* @dataProvider provideDataForConstuctor
*
* @return void
*/
public function testConstructorParesInputsIntoCorrectFields(
$type,
$content,
$exContent,
$exDescription,
$exStartingLine,
$exLineCount,
$exFilePath
) {
$tag = new ExampleTag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($exContent, $tag->getContent());
$this->assertEquals($exDescription, $tag->getDescription());
$this->assertEquals($exStartingLine, $tag->getStartingLine());
$this->assertEquals($exLineCount, $tag->getLineCount());
$this->assertEquals($exFilePath, $tag->getFilePath());
}
/**
* Data provider for testConstructorParesInputsIntoCorrectFields
*
* @return array
*/
public function provideDataForConstuctor()
{
// $type,
// $content,
// $exContent,
// $exDescription,
// $exStartingLine,
// $exLineCount,
// $exFilePath
return array(
array(
'example',
'file.php',
'file.php',
'',
1,
null,
'file.php'
),
array(
'example',
'Testing comments',
'Testing comments',
'comments',
1,
null,
'Testing'
),
array(
'example',
'file.php 2 Testing',
'file.php 2 Testing',
'Testing',
2,
null,
'file.php'
),
array(
'example',
'file.php 2 3 Testing comments',
'file.php 2 3 Testing comments',
'Testing comments',
2,
3,
'file.php'
),
array(
'example',
'file.php 2 -1 Testing comments',
'file.php 2 -1 Testing comments',
'-1 Testing comments',
2,
null,
'file.php'
),
array(
'example',
'file.php -1 1 Testing comments',
'file.php -1 1 Testing comments',
'-1 1 Testing comments',
1,
null,
'file.php'
),
array(
'example',
'"file with spaces.php" Testing comments',
'"file with spaces.php" Testing comments',
'Testing comments',
1,
null,
'file with spaces.php'
),
array(
'example',
'"file with spaces.php" 2 Testing comments',
'"file with spaces.php" 2 Testing comments',
'Testing comments',
2,
null,
'file with spaces.php'
),
array(
'example',
'"file with spaces.php" 2 3 Testing comments',
'"file with spaces.php" 2 3 Testing comments',
'Testing comments',
2,
3,
'file with spaces.php'
),
array(
'example',
'"file with spaces.php" 2 -3 Testing comments',
'"file with spaces.php" 2 -3 Testing comments',
'-3 Testing comments',
2,
null,
'file with spaces.php'
),
array(
'example',
'"file with spaces.php" -2 3 Testing comments',
'"file with spaces.php" -2 3 Testing comments',
'-2 3 Testing comments',
1,
null,
'file with spaces.php'
),
array(
'example',
'file%20with%20spaces.php Testing comments',
'file%20with%20spaces.php Testing comments',
'Testing comments',
1,
null,
'file with spaces.php'
),
array(
'example',
'folder/file%20with%20spaces.php Testing comments',
'folder/file%20with%20spaces.php Testing comments',
'Testing comments',
1,
null,
'folder/file with spaces.php'
),
array(
'example',
'http://example.com/file%20with%20spaces.php Testing comments',
'http://example.com/file%20with%20spaces.php Testing comments',
'Testing comments',
1,
null,
'http://example.com/file%20with%20spaces.php'
)
);
}
}
@@ -2,53 +2,54 @@
/** /**
* phpDocumentor Link Tag Test * phpDocumentor Link Tag Test
* *
* PHP version 5.3
*
* @author Ben Selby <[email protected]> * @author Ben Selby <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__ . '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php';
/** /**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\LinkTag * Test class for \phpDocumentor\Reflection\DocBlock\Tag\LinkTag
* *
* @author Ben Selby <[email protected]> * @author Ben Selby <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class LinkTagTest extends \PHPUnit_Framework_TestCase class LinkTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
* a link for the @link doc block * a link for the @link doc block.
* *
* @param string $type * @param string $type
* @param string $content * @param string $content
* @param string $exName
* @param string $exContent * @param string $exContent
* @param string $exDescription * @param string $exDescription
* @param string $exLink * @param string $exLink
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\LinkTag::__construct * @covers \phpDocumentor\Reflection\DocBlock\Tag\LinkTag
* @dataProvider provideDataForConstuctor * @dataProvider provideDataForConstuctor
* *
* @return void * @return void
*/ */
public function testConstructorParesInputsIntoCorrectFields( public function testConstructorParesInputsIntoCorrectFields(
$type, $content, $exName, $exContent, $exDescription, $exLink $type,
) $content,
{ $exContent,
$exDescription,
$exLink
) {
$tag = new LinkTag($type, $content); $tag = new LinkTag($type, $content);
$actualName = $tag->getName(); $this->assertEquals($type, $tag->getName());
$actualContent = $tag->getContent(); $this->assertEquals($exContent, $tag->getContent());
$actualDescription = $tag->getDescription(); $this->assertEquals($exDescription, $tag->getDescription());
$actualLink = $tag->getLink(); $this->assertEquals($exLink, $tag->getLink());
$this->assertEquals($exName, $actualName);
$this->assertEquals($exContent, $actualContent);
$this->assertEquals($exDescription, $actualDescription);
$this->assertEquals($exLink, $actualLink);
} }
/** /**
@@ -58,12 +59,11 @@ class LinkTagTest extends \PHPUnit_Framework_TestCase
*/ */
public function provideDataForConstuctor() public function provideDataForConstuctor()
{ {
// $type, $content, $exName, $exContent, $exDescription, $exLink // $type, $content, $exContent, $exDescription, $exLink
return array( return array(
array( array(
'link', 'link',
'http://www.phpdoc.org/', 'http://www.phpdoc.org/',
'link',
'http://www.phpdoc.org/', 'http://www.phpdoc.org/',
'http://www.phpdoc.org/', 'http://www.phpdoc.org/',
'http://www.phpdoc.org/' 'http://www.phpdoc.org/'
@@ -71,7 +71,6 @@ class LinkTagTest extends \PHPUnit_Framework_TestCase
array( array(
'link', 'link',
'http://www.phpdoc.org/ Testing', 'http://www.phpdoc.org/ Testing',
'link',
'http://www.phpdoc.org/ Testing', 'http://www.phpdoc.org/ Testing',
'Testing', 'Testing',
'http://www.phpdoc.org/' 'http://www.phpdoc.org/'
@@ -79,7 +78,6 @@ class LinkTagTest extends \PHPUnit_Framework_TestCase
array( array(
'link', 'link',
'http://www.phpdoc.org/ Testing comments', 'http://www.phpdoc.org/ Testing comments',
'link',
'http://www.phpdoc.org/ Testing comments', 'http://www.phpdoc.org/ Testing comments',
'Testing comments', 'Testing comments',
'http://www.phpdoc.org/' 'http://www.phpdoc.org/'
@@ -2,60 +2,69 @@
/** /**
* phpDocumentor Method Tag Test * phpDocumentor Method Tag Test
* *
* PHP version 5.3
*
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__ . '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php';
require_once __DIR__ . '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php';
/** /**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\MethodTag * Test class for \phpDocumentor\Reflection\DocBlock\Tag\MethodTag
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class MethodTagTest extends \PHPUnit_Framework_TestCase class MethodTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* @dataProvider getTestSignatures * @param string $signature The signature to test.
*
* @param string $signature The signature to test
* @param bool $valid Whether the given signature is expected to * @param bool $valid Whether the given signature is expected to
* be valid. * be valid.
* @param string $expected_name The method name that is expected from this * @param string $expected_name The method name that is expected from this
* signature * signature.
* @param string $expected_return The return type that is expected from this * @param string $expected_return The return type that is expected from this
* signature * signature.
* @param bool $has_params whether this signature features parameters. * @param bool $paramCount Number of parameters in the signature.
* @param string $description The short description mentioned in the * @param string $description The short description mentioned in the
* signature. * signature.
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\MethodTag
* @dataProvider getTestSignatures
*
* @return void * @return void
*/ */
public function testConstruct($signature, $valid, $expected_name, public function testConstruct(
$expected_return, $has_params, $description) $signature,
{ $valid,
$expected_name,
$expected_return,
$paramCount,
$description
) {
ob_start(); ob_start();
$tag = new MethodTag('method', $signature); $tag = new MethodTag('method', $signature);
$stdout = ob_get_clean(); $stdout = ob_get_clean();
$this->assertSame( $this->assertSame(
$valid, empty($stdout), $valid,
empty($stdout),
'No error should have been output if the signature is valid' 'No error should have been output if the signature is valid'
); );
if (!$valid) return; if (!$valid) {
return;
}
$this->assertEquals($expected_name, $tag->getMethodName()); $this->assertEquals($expected_name, $tag->getMethodName());
$this->assertEquals($expected_return, $tag->getType()); $this->assertEquals($expected_return, $tag->getType());
$this->assertEquals($description, $tag->getDescription()); $this->assertEquals($description, $tag->getDescription());
$this->assertSame( $this->assertCount($paramCount, $tag->getArguments());
$has_params, (bool)(count($tag->getArguments()) > 0),
'Number of found arguments should exceed 0'
);
} }
public function getTestSignatures() public function getTestSignatures()
@@ -63,55 +72,55 @@ class MethodTagTest extends \PHPUnit_Framework_TestCase
return array( return array(
array( array(
'foo', 'foo',
false, 'foo', '', false, '' false, 'foo', '', 0, ''
), ),
array( array(
'foo()', 'foo()',
true, 'foo', 'void', false, '' true, 'foo', 'void', 0, ''
), ),
array( array(
'foo() description', 'foo() description',
true, 'foo', 'void', false, 'description' true, 'foo', 'void', 0, 'description'
), ),
array( array(
'int foo()', 'int foo()',
true, 'foo', 'int', false, '' true, 'foo', 'int', 0, ''
), ),
array( array(
'int foo() description', 'int foo() description',
true, 'foo', 'int', false, 'description' true, 'foo', 'int', 0, 'description'
), ),
array( array(
'int foo($a, $b)', 'int foo($a, $b)',
true, 'foo', 'int', true, '' true, 'foo', 'int', 2, ''
), ),
array( array(
'int foo() foo(int $a, int $b)', 'int foo() foo(int $a, int $b)',
true, 'foo', 'int', true, '' true, 'foo', 'int', 2, ''
), ),
array( array(
'int foo(int $a, int $b)', 'int foo(int $a, int $b)',
true, 'foo', 'int', true, '' true, 'foo', 'int', 2, ''
), ),
array( array(
'null|int foo(int $a, int $b)', 'null|int foo(int $a, int $b)',
true, 'foo', 'null|int', true, '' true, 'foo', 'null|int', 2, ''
), ),
array( array(
'int foo(null|int $a, int $b)', 'int foo(null|int $a, int $b)',
true, 'foo', 'int', true, '' true, 'foo', 'int', 2, ''
), ),
array( array(
'\Exception foo() foo(Exception $a, Exception $b)', '\Exception foo() foo(Exception $a, Exception $b)',
true, 'foo', '\Exception', true, '' true, 'foo', '\Exception', 2, ''
), ),
array( array(
'int foo() foo(Exception $a, Exception $b) description', 'int foo() foo(Exception $a, Exception $b) description',
true, 'foo', 'int', true, 'description' true, 'foo', 'int', 2, 'description'
), ),
array( array(
'int foo() foo(\Exception $a, \Exception $b) description', 'int foo() foo(\Exception $a, \Exception $b) description',
true, 'foo', 'int', true, 'description' true, 'foo', 'int', 2, 'description'
), ),
); );
} }
@@ -2,68 +2,57 @@
/** /**
* phpDocumentor Param tag test. * phpDocumentor Param tag test.
* *
* PHP version 5.3
*
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__ . '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php';
/** /**
* Test class for phpDocumentor_Reflection_DocBlock_Param. * Test class for \phpDocumentor\Reflection\DocBlock\ParamTag
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class ParamTagTest extends \PHPUnit_Framework_TestCase class ParamTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\ParamTag can * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ParamTag can
* understand the param DocBlock. * understand the @param DocBlock.
* *
* @param string $type * @param string $type
* @param string $content * @param string $content
* @param string $extracted_type * @param string $extractedType
* @param string $extracted_variable_name * @param string $extractedTypes
* @param string $extracted_description * @param string $extractedVarName
* * @param string $extractedDescription
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ParamTag::__construct
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ParamTag
* @dataProvider provideDataForConstructor * @dataProvider provideDataForConstructor
* *
* @return void * @return void
*/ */
public function testConstructorParsesInputsIntoCorrectFields( public function testConstructorParsesInputsIntoCorrectFields(
$type, $content, $extracted_type, $extracted_variable_name, $type,
$extracted_description $content,
$extractedType,
$extractedTypes,
$extractedVarName,
$extractedDescription
) { ) {
$tag = new ParamTag($type, $content); $tag = new ParamTag($type, $content);
$this->assertEquals($extracted_type, $tag->getTypes()); $this->assertEquals($type, $tag->getName());
$this->assertEquals($extracted_variable_name, $tag->getVariableName()); $this->assertEquals($extractedType, $tag->getType());
$this->assertEquals($extracted_description, $tag->getDescription()); $this->assertEquals($extractedTypes, $tag->getTypes());
} $this->assertEquals($extractedVarName, $tag->getVariableName());
$this->assertEquals($extractedDescription, $tag->getDescription());
/**
* Tests whether the getTypes method correctly converts the given tags.
*
* @param string $type Type string to test
* @param string[] $expected Array of expected types
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ParamTag::getTypes()
*
* @dataProvider provideTypesToExpand
*/
public function testExpandTypeIntoCorrectFcqn($type, $expected)
{
$docblock = new \phpDocumentor\Reflection\DocBlock(
'', '\My\Namespace', array('Alias' => '\My\Namespace\Aliasing')
);
$tag = new ParamTag('param', $type.' $my_type');
$tag->setDocBlock($docblock);
$this->assertEquals($expected, $tag->getTypes());
} }
/** /**
@@ -74,45 +63,56 @@ class ParamTagTest extends \PHPUnit_Framework_TestCase
public function provideDataForConstructor() public function provideDataForConstructor()
{ {
return array( return array(
array('param', 'int', array(''), '', 'int'), array('param', 'int', 'int', array('int'), '', ''),
array('param', '$bob', array(''), '$bob', ''), array('param', '$bob', '', array(), '$bob', ''),
array( array(
'param', 'int Number of bobs', array('int'), '', 'param',
'int Number of bobs',
'int',
array('int'),
'',
'Number of bobs' 'Number of bobs'
), ),
array('param', 'int $bob', array('int'), '$bob', ''),
array( array(
'param', 'int $bob Number of bobs', array('int'), '$bob', 'param',
'int $bob',
'int',
array('int'),
'$bob',
''
),
array(
'param',
'int $bob Number of bobs',
'int',
array('int'),
'$bob',
'Number of bobs' 'Number of bobs'
), ),
);
}
/**
* Returns the types and their expected values to test the retrieval of
* types.
*
* @return string[]
*/
public function provideTypesToExpand()
{
return array(
array('', array('')),
array(' ', array('')),
array('int', array('int')),
array('int ', array('int')),
array('string', array('string')),
array('DocBlock', array('\My\Namespace\DocBlock')),
// array(' DocBlock ', array('\My\Namespace\DocBlock')), FIXME
array('Alias\DocBlock', array('\My\Namespace\Aliasing\DocBlock')),
array( array(
'DocBlock|Tag', 'param',
array('\My\Namespace\DocBlock', '\My\Namespace\Tag') "int Description \n on multiple lines",
'int',
array('int'),
'',
"Description \n on multiple lines"
), ),
array( array(
'DocBlock|null', 'param',
array('\My\Namespace\DocBlock', 'null') "int \n\$bob Variable name on a new line",
'int',
array('int'),
'$bob',
"Variable name on a new line"
), ),
array(
'param',
"\nint \$bob Type on a new line",
'int',
array('int'),
'$bob',
"Type on a new line"
)
); );
} }
} }
@@ -2,67 +2,54 @@
/** /**
* phpDocumentor Return tag test. * phpDocumentor Return tag test.
* *
* PHP version 5.3
*
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__
. '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php';
/** /**
* Test class for phpDocumentor_Reflection_DocBlock_ReturnTag. * Test class for \phpDocumentor\Reflection\DocBlock\ReturnTag
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class ReturnTagTest extends ParamTagTest class ReturnTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag can * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag can
* understand the Return DocBlock. * understand the @return DocBlock.
* *
* @param string $type
* @param string $content * @param string $content
* @param string $extracted_type * @param string $extractedType
* @param string $extracted_description * @param string $extractedTypes
* * @param string $extractedDescription
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag::__construct
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag
* @dataProvider provideDataForConstructor * @dataProvider provideDataForConstructor
* *
* @return void * @return void
*/ */
public function testConstructorParsesInputsIntoCorrectFields( public function testConstructorParsesInputsIntoCorrectFields(
$content, $extracted_type, $extracted_description $type,
$content,
$extractedType,
$extractedTypes,
$extractedDescription
) { ) {
$tag = new ReturnTag('return', $content); $tag = new ReturnTag($type, $content);
$this->assertEquals($extracted_type, $tag->getTypes()); $this->assertEquals($type, $tag->getName());
$this->assertEquals($extracted_description, $tag->getDescription()); $this->assertEquals($extractedType, $tag->getType());
} $this->assertEquals($extractedTypes, $tag->getTypes());
$this->assertEquals($extractedDescription, $tag->getDescription());
/**
* Tests whether the getTypes method correctly converts the given tags.
*
* @param string $type Type string to test
* @param string[] $expected Array of expected types
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag::getTypes()
*
* @dataProvider provideTypesToExpand
*
* @return void
*/
public function testExpandTypeIntoCorrectFcqn($type, $expected)
{
$docblock = new \phpDocumentor\Reflection\DocBlock(
'', '\My\Namespace', array('Alias' => '\My\Namespace\Aliasing')
);
$tag = new ReturnTag('return', $type);
$tag->setDocBlock($docblock);
$this->assertEquals($expected, $tag->getTypes());
} }
/** /**
@@ -73,9 +60,43 @@ class ReturnTagTest extends ParamTagTest
public function provideDataForConstructor() public function provideDataForConstructor()
{ {
return array( return array(
array('', array(''), ''), array('return', '', '', array(), ''),
array('int', array('int'), ''), array('return', 'int', 'int', array('int'), ''),
array('int Number of Bobs', array('int'), 'Number of Bobs'), array(
'return',
'int Number of Bobs',
'int',
array('int'),
'Number of Bobs'
),
array(
'return',
'int|double Number of Bobs',
'int|double',
array('int', 'double'),
'Number of Bobs'
),
array(
'return',
"int Number of \n Bobs",
'int',
array('int'),
"Number of \n Bobs"
),
array(
'return',
" int Number of Bobs",
'int',
array('int'),
"Number of Bobs"
),
array(
'return',
"int\nNumber of Bobs",
'int',
array('int'),
"Number of Bobs"
)
); );
} }
} }
@@ -2,52 +2,53 @@
/** /**
* phpDocumentor See Tag Test * phpDocumentor See Tag Test
* *
* PHP version 5.3
*
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__ . '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php';
/** /**
* Test class for phpDocumentor_Reflection_DocBlock_Tag_See * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SeeTag
* *
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class SeeTagTest extends \PHPUnit_Framework_TestCase class SeeTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* Test that the phpDocumentor_Reflection_DocBlock_Tag_See can create a link * Test that the phpDocumentor_Reflection_DocBlock_Tag_See can create a link
* for the @see doc block * for the @see doc block.
* *
* @param string $type * @param string $type
* @param string $content * @param string $content
* @param string $exName
* @param string $exContent * @param string $exContent
* @param string $exReference * @param string $exReference
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\SeeTag::__construct * @covers \phpDocumentor\Reflection\DocBlock\Tag\SeeTag
* @dataProvider provideDataForConstuctor * @dataProvider provideDataForConstuctor
* *
* @return void * @return void
*/ */
public function testConstructorParesInputsIntoCorrectFields( public function testConstructorParesInputsIntoCorrectFields(
$type, $content, $exName, $exContent, $exDescription, $exReference $type,
) $content,
{ $exContent,
$exDescription,
$exReference
) {
$tag = new SeeTag($type, $content); $tag = new SeeTag($type, $content);
$actualName = $tag->getName(); $this->assertEquals($type, $tag->getName());
$actualContent = $tag->getContent(); $this->assertEquals($exContent, $tag->getContent());
$actualDescription = $tag->getDescription(); $this->assertEquals($exDescription, $tag->getDescription());
$actualReference = $tag->getReference(); $this->assertEquals($exReference, $tag->getReference());
$this->assertEquals($exName, $actualName);
$this->assertEquals($exContent, $actualContent);
$this->assertEquals($exDescription, $actualDescription);
$this->assertEquals($exReference, $actualReference);
} }
/** /**
@@ -57,28 +58,25 @@ class SeeTagTest extends \PHPUnit_Framework_TestCase
*/ */
public function provideDataForConstuctor() public function provideDataForConstuctor()
{ {
// $type, $content, $exName, $exContent, $exDescription, $exReference // $type, $content, $exContent, $exDescription, $exReference
return array( return array(
array( array(
'uses', 'see',
'Foo::bar()', 'Foo::bar()',
'uses',
'Foo::bar()', 'Foo::bar()',
'', '',
'Foo::bar()' 'Foo::bar()'
), ),
array( array(
'uses', 'see',
'Foo::bar() Testing', 'Foo::bar() Testing',
'uses',
'Foo::bar() Testing', 'Foo::bar() Testing',
'Testing', 'Testing',
'Foo::bar()', 'Foo::bar()',
), ),
array( array(
'uses', 'see',
'Foo::bar() Testing comments', 'Foo::bar() Testing comments',
'uses',
'Foo::bar() Testing comments', 'Foo::bar() Testing comments',
'Testing comments', 'Testing comments',
'Foo::bar()', 'Foo::bar()',
@@ -0,0 +1,115 @@
<?php
/**
* phpDocumentor Since Tag Test
*
* PHP version 5.3
*
* @author Vasil Rangelov <[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;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\SinceTag
*
* @author Vasil Rangelov <[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
*/
class SinceTagTest extends \PHPUnit_Framework_TestCase
{
/**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
* a link for the @since doc block.
*
* @param string $type
* @param string $content
* @param string $exContent
* @param string $exDescription
* @param string $exVersion
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\SinceTag
* @dataProvider provideDataForConstuctor
*
* @return void
*/
public function testConstructorParesInputsIntoCorrectFields(
$type,
$content,
$exContent,
$exDescription,
$exVersion
) {
$tag = new SinceTag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($exContent, $tag->getContent());
$this->assertEquals($exDescription, $tag->getDescription());
$this->assertEquals($exVersion, $tag->getVersion());
}
/**
* Data provider for testConstructorParesInputsIntoCorrectFields
*
* @return array
*/
public function provideDataForConstuctor()
{
// $type, $content, $exContent, $exDescription, $exVersion
return array(
array(
'since',
'1.0 First release.',
'1.0 First release.',
'First release.',
'1.0'
),
array(
'since',
"1.0\nFirst release.",
"1.0\nFirst release.",
'First release.',
'1.0'
),
array(
'since',
"1.0\nFirst\nrelease.",
"1.0\nFirst\nrelease.",
"First\nrelease.",
'1.0'
),
array(
'since',
'Unfinished release',
'Unfinished release',
'Unfinished release',
''
),
array(
'since',
'1.0',
'1.0',
'',
'1.0'
),
array(
'since',
'GIT: $Id$',
'GIT: $Id$',
'',
'GIT: $Id$'
),
array(
'since',
'GIT: $Id$ Dev build',
'GIT: $Id$ Dev build',
'Dev build',
'GIT: $Id$'
)
);
}
}
@@ -0,0 +1,116 @@
<?php
/**
* phpDocumentor Source Tag Test
*
* PHP version 5.3
*
* @author Vasil Rangelov <[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;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\SourceTag
*
* @author Vasil Rangelov <[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
*/
class SourceTagTest extends \PHPUnit_Framework_TestCase
{
/**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can
* understand the @source DocBlock.
*
* @param string $type
* @param string $content
* @param string $exContent
* @param string $exStartingLine
* @param string $exLineCount
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\SourceTag
* @dataProvider provideDataForConstuctor
*
* @return void
*/
public function testConstructorParesInputsIntoCorrectFields(
$type,
$content,
$exContent,
$exDescription,
$exStartingLine,
$exLineCount
) {
$tag = new SourceTag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($exContent, $tag->getContent());
$this->assertEquals($exDescription, $tag->getDescription());
$this->assertEquals($exStartingLine, $tag->getStartingLine());
$this->assertEquals($exLineCount, $tag->getLineCount());
}
/**
* Data provider for testConstructorParesInputsIntoCorrectFields
*
* @return array
*/
public function provideDataForConstuctor()
{
// $type, $content, $exContent, $exDescription, $exStartingLine, $exLineCount
return array(
array(
'source',
'2',
'2',
'',
2,
null
),
array(
'source',
'Testing',
'Testing',
'Testing',
1,
null
),
array(
'source',
'2 Testing',
'2 Testing',
'Testing',
2,
null
),
array(
'source',
'2 3 Testing comments',
'2 3 Testing comments',
'Testing comments',
2,
3
),
array(
'source',
'2 -1 Testing comments',
'2 -1 Testing comments',
'-1 Testing comments',
2,
null
),
array(
'source',
'-1 1 Testing comments',
'-1 1 Testing comments',
'-1 1 Testing comments',
1,
null
)
);
}
}
@@ -0,0 +1,102 @@
<?php
/**
* phpDocumentor Throws tag test.
*
* PHP version 5.3
*
* @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;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\ThrowsTag
*
* @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
*/
class ThrowsTagTest extends \PHPUnit_Framework_TestCase
{
/**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag can
* understand the @throws DocBlock.
*
* @param string $type
* @param string $content
* @param string $extractedType
* @param string $extractedTypes
* @param string $extractedDescription
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag
* @dataProvider provideDataForConstructor
*
* @return void
*/
public function testConstructorParsesInputsIntoCorrectFields(
$type,
$content,
$extractedType,
$extractedTypes,
$extractedDescription
) {
$tag = new ThrowsTag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($extractedType, $tag->getType());
$this->assertEquals($extractedTypes, $tag->getTypes());
$this->assertEquals($extractedDescription, $tag->getDescription());
}
/**
* Data provider for testConstructorParsesInputsIntoCorrectFields()
*
* @return array
*/
public function provideDataForConstructor()
{
return array(
array('throws', '', '', array(), ''),
array('throws', 'int', 'int', array('int'), ''),
array(
'throws',
'int Number of Bobs',
'int',
array('int'),
'Number of Bobs'
),
array(
'throws',
'int|double Number of Bobs',
'int|double',
array('int', 'double'),
'Number of Bobs'
),
array(
'throws',
"int Number of \n Bobs",
'int',
array('int'),
"Number of \n Bobs"
),
array(
'throws',
" int Number of Bobs",
'int',
array('int'),
"Number of Bobs"
),
array(
'throws',
"int\nNumber of Bobs",
'int',
array('int'),
"Number of Bobs"
)
);
}
}
@@ -2,52 +2,53 @@
/** /**
* phpDocumentor Uses Tag Test * phpDocumentor Uses Tag Test
* *
* PHP version 5.3
*
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__ . '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php';
/** /**
* Test class for phpDocumentor_Reflection_DocBlock_Tag_Uses * Test class for \phpDocumentor\Reflection\DocBlock\Tag\UsesTag
* *
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class UsesTagTest extends \PHPUnit_Framework_TestCase class UsesTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\UsesTag can create * Test that the \phpDocumentor\Reflection\DocBlock\Tag\UsesTag can create
* a link for the @uses doc block * a link for the @uses doc block.
* *
* @param string $type * @param string $type
* @param string $content * @param string $content
* @param string $exName
* @param string $exContent * @param string $exContent
* @param string $exReference * @param string $exReference
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\UsesTag::__construct * @covers \phpDocumentor\Reflection\DocBlock\Tag\UsesTag
* @dataProvider provideDataForConstuctor * @dataProvider provideDataForConstuctor
* *
* @return void * @return void
*/ */
public function testConstructorParesInputsIntoCorrectFields( public function testConstructorParesInputsIntoCorrectFields(
$type, $content, $exName, $exContent, $exDescription, $exReference $type,
) $content,
{ $exContent,
$exDescription,
$exReference
) {
$tag = new UsesTag($type, $content); $tag = new UsesTag($type, $content);
$actualName = $tag->getName(); $this->assertEquals($type, $tag->getName());
$actualContent = $tag->getContent(); $this->assertEquals($exContent, $tag->getContent());
$actualDescription = $tag->getDescription(); $this->assertEquals($exDescription, $tag->getDescription());
$actualReference = $tag->getReference(); $this->assertEquals($exReference, $tag->getReference());
$this->assertEquals($exName, $actualName);
$this->assertEquals($exContent, $actualContent);
$this->assertEquals($exDescription, $actualDescription);
$this->assertEquals($exReference, $actualReference);
} }
/** /**
@@ -57,12 +58,11 @@ class UsesTagTest extends \PHPUnit_Framework_TestCase
*/ */
public function provideDataForConstuctor() public function provideDataForConstuctor()
{ {
// $type, $content, $exName, $exContent, $exDescription, $exReference // $type, $content, $exContent, $exDescription, $exReference
return array( return array(
array( array(
'uses', 'uses',
'Foo::bar()', 'Foo::bar()',
'uses',
'Foo::bar()', 'Foo::bar()',
'', '',
'Foo::bar()' 'Foo::bar()'
@@ -70,7 +70,6 @@ class UsesTagTest extends \PHPUnit_Framework_TestCase
array( array(
'uses', 'uses',
'Foo::bar() Testing', 'Foo::bar() Testing',
'uses',
'Foo::bar() Testing', 'Foo::bar() Testing',
'Testing', 'Testing',
'Foo::bar()', 'Foo::bar()',
@@ -78,7 +77,6 @@ class UsesTagTest extends \PHPUnit_Framework_TestCase
array( array(
'uses', 'uses',
'Foo::bar() Testing comments', 'Foo::bar() Testing comments',
'uses',
'Foo::bar() Testing comments', 'Foo::bar() Testing comments',
'Testing comments', 'Testing comments',
'Foo::bar()', 'Foo::bar()',
@@ -2,25 +2,29 @@
/** /**
* phpDocumentor Var Tag Test * phpDocumentor Var Tag Test
* *
* PHP version 5.3
*
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection\DocBlock\Tag;
require_once __DIR__ . '/../../../../../src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php';
/** /**
* Test class for phpDocumentor_Reflection_DocBlock_Tag_Link * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag
* *
* @author Daniel O'Connor <[email protected]> * @author Daniel O'Connor <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class VarTagTest extends \PHPUnit_Framework_TestCase class VarTagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can understand * Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can
* the @var doc block * understand the @var doc block.
* *
* @param string $type * @param string $type
* @param string $content * @param string $content
@@ -28,17 +32,21 @@ class VarTagTest extends \PHPUnit_Framework_TestCase
* @param string $exVariable * @param string $exVariable
* @param string $exDescription * @param string $exDescription
* *
* @covers \phpDocumentor\Reflection\DocBlock\Tag\VarTag::__construct * @covers \phpDocumentor\Reflection\DocBlock\Tag\VarTag
* @dataProvider provideDataForConstuctor * @dataProvider provideDataForConstuctor
* *
* @return void * @return void
*/ */
public function testConstructorParesInputsIntoCorrectFields( public function testConstructorParesInputsIntoCorrectFields(
$type, $content, $exType, $exVariable, $exDescription $type,
) $content,
{ $exType,
$exVariable,
$exDescription
) {
$tag = new VarTag($type, $content); $tag = new VarTag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($exType, $tag->getType()); $this->assertEquals($exType, $tag->getType());
$this->assertEquals($exVariable, $tag->getVariableName()); $this->assertEquals($exVariable, $tag->getVariableName());
$this->assertEquals($exDescription, $tag->getDescription()); $this->assertEquals($exDescription, $tag->getDescription());
@@ -51,7 +59,7 @@ class VarTagTest extends \PHPUnit_Framework_TestCase
*/ */
public function provideDataForConstuctor() public function provideDataForConstuctor()
{ {
// $type, $content // $type, $content, $exType, $exVariable, $exDescription
return array( return array(
array( array(
'var', 'var',
@@ -74,6 +82,13 @@ class VarTagTest extends \PHPUnit_Framework_TestCase
'$bob', '$bob',
'Number of bobs' 'Number of bobs'
), ),
array(
'var',
'',
'',
'',
''
),
); );
} }
} }
@@ -0,0 +1,115 @@
<?php
/**
* phpDocumentor Version Tag Test
*
* PHP version 5.3
*
* @author Vasil Rangelov <[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;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\VersionTag
*
* @author Vasil Rangelov <[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
*/
class VersionTagTest extends \PHPUnit_Framework_TestCase
{
/**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
* a link for the @version doc block.
*
* @param string $type
* @param string $content
* @param string $exContent
* @param string $exDescription
* @param string $exVersion
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag\VersionTag
* @dataProvider provideDataForConstuctor
*
* @return void
*/
public function testConstructorParesInputsIntoCorrectFields(
$type,
$content,
$exContent,
$exDescription,
$exVersion
) {
$tag = new VersionTag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($exContent, $tag->getContent());
$this->assertEquals($exDescription, $tag->getDescription());
$this->assertEquals($exVersion, $tag->getVersion());
}
/**
* Data provider for testConstructorParesInputsIntoCorrectFields
*
* @return array
*/
public function provideDataForConstuctor()
{
// $type, $content, $exContent, $exDescription, $exVersion
return array(
array(
'version',
'1.0 First release.',
'1.0 First release.',
'First release.',
'1.0'
),
array(
'version',
"1.0\nFirst release.",
"1.0\nFirst release.",
'First release.',
'1.0'
),
array(
'version',
"1.0\nFirst\nrelease.",
"1.0\nFirst\nrelease.",
"First\nrelease.",
'1.0'
),
array(
'version',
'Unfinished release',
'Unfinished release',
'Unfinished release',
''
),
array(
'version',
'1.0',
'1.0',
'',
'1.0'
),
array(
'version',
'GIT: $Id$',
'GIT: $Id$',
'',
'GIT: $Id$'
),
array(
'version',
'GIT: $Id$ Dev build',
'GIT: $Id$ Dev build',
'Dev build',
'GIT: $Id$'
)
);
}
}
@@ -0,0 +1,313 @@
<?php
/**
* phpDocumentor Var Tag Test
*
* PHP version 5.3
*
* @author Daniel O'Connor <[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;
use phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\Context;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag
*
* @author Daniel O'Connor <[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
*/
class TagTest extends \PHPUnit_Framework_TestCase
{
/**
* @expectedException \InvalidArgumentException
*
* @return void
*/
public function testInvalidTagLine()
{
Tag::createInstance('Invalid tag line');
}
/**
* @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
*
* @return void
*/
public function testTagHandlerUnregistration()
{
$currentHandler = __NAMESPACE__ . '\Tag\VarTag';
$tagPreUnreg = Tag::createInstance('@var mixed');
$this->assertInstanceOf(
$currentHandler,
$tagPreUnreg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPreUnreg
);
Tag::registerTagHandler('var', null);
$tagPostUnreg = Tag::createInstance('@var mixed');
$this->assertNotInstanceOf(
$currentHandler,
$tagPostUnreg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPostUnreg
);
Tag::registerTagHandler('var', $currentHandler);
}
/**
* @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
*
* @return void
*/
public function testTagHandlerCorrectRegistration()
{
if (0 == ini_get('allow_url_include')) {
$this->markTestSkipped('"data" URIs for includes are required.');
}
$currentHandler = __NAMESPACE__ . '\Tag\VarTag';
$tagPreReg = Tag::createInstance('@var mixed');
$this->assertInstanceOf(
$currentHandler,
$tagPreReg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPreReg
);
include 'data:text/plain;base64,'. base64_encode(
<<<TAG_HANDLER
<?php
class MyTagHandler extends \phpDocumentor\Reflection\DocBlock\Tag {}
TAG_HANDLER
);
$this->assertTrue(Tag::registerTagHandler('var', '\MyTagHandler'));
$tagPostReg = Tag::createInstance('@var mixed');
$this->assertNotInstanceOf(
$currentHandler,
$tagPostReg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPostReg
);
$this->assertInstanceOf(
'\MyTagHandler',
$tagPostReg
);
$this->assertTrue(Tag::registerTagHandler('var', $currentHandler));
}
/**
* @depends testTagHandlerCorrectRegistration
* @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
* @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance
*
* @return void
*/
public function testNamespacedTagHandlerCorrectRegistration()
{
$tagPreReg = Tag::createInstance('@T something');
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPreReg
);
$this->assertNotInstanceOf(
'\MyTagHandler',
$tagPreReg
);
$this->assertTrue(
Tag::registerTagHandler('\MyNamespace\MyTag', '\MyTagHandler')
);
$tagPostReg = Tag::createInstance(
'@T something',
new DocBlock(
'',
new Context('', array('T' => '\MyNamespace\MyTag'))
)
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPostReg
);
$this->assertInstanceOf(
'\MyTagHandler',
$tagPostReg
);
$this->assertTrue(
Tag::registerTagHandler('\MyNamespace\MyTag', null)
);
}
/**
* @depends testTagHandlerCorrectRegistration
* @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
* @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance
*
* @return void
*/
public function testNamespacedTagHandlerIncorrectRegistration()
{
$tagPreReg = Tag::createInstance('@T something');
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPreReg
);
$this->assertNotInstanceOf(
'\MyTagHandler',
$tagPreReg
);
$this->assertFalse(
Tag::registerTagHandler('MyNamespace\MyTag', '\MyTagHandler')
);
$tagPostReg = Tag::createInstance(
'@T something',
new DocBlock(
'',
new Context('', array('T' => '\MyNamespace\MyTag'))
)
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPostReg
);
$this->assertNotInstanceOf(
'\MyTagHandler',
$tagPostReg
);
}
/**
* @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
*
* @return void
*/
public function testNonExistentTagHandlerRegistration()
{
$currentHandler = __NAMESPACE__ . '\Tag\VarTag';
$tagPreReg = Tag::createInstance('@var mixed');
$this->assertInstanceOf(
$currentHandler,
$tagPreReg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPreReg
);
$this->assertFalse(Tag::registerTagHandler('var', 'Non existent'));
$tagPostReg = Tag::createInstance('@var mixed');
$this->assertInstanceOf(
$currentHandler,
$tagPostReg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPostReg
);
}
/**
* @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
*
* @return void
*/
public function testIncompatibleTagHandlerRegistration()
{
$currentHandler = __NAMESPACE__ . '\Tag\VarTag';
$tagPreReg = Tag::createInstance('@var mixed');
$this->assertInstanceOf(
$currentHandler,
$tagPreReg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPreReg
);
$this->assertFalse(
Tag::registerTagHandler('var', __NAMESPACE__ . '\TagTest')
);
$tagPostReg = Tag::createInstance('@var mixed');
$this->assertInstanceOf(
$currentHandler,
$tagPostReg
);
$this->assertInstanceOf(
__NAMESPACE__ . '\Tag',
$tagPostReg
);
}
/**
* Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can
* understand the @var doc block.
*
* @param string $type
* @param string $content
* @param string $exDescription
*
* @covers \phpDocumentor\Reflection\DocBlock\Tag
* @dataProvider provideDataForConstuctor
*
* @return void
*/
public function testConstructorParesInputsIntoCorrectFields(
$type,
$content,
$exDescription
) {
$tag = new Tag($type, $content);
$this->assertEquals($type, $tag->getName());
$this->assertEquals($content, $tag->getContent());
$this->assertEquals($exDescription, $tag->getDescription());
}
/**
* Data provider for testConstructorParesInputsIntoCorrectFields
*
* @return array
*/
public function provideDataForConstuctor()
{
// $type, $content, $exDescription
return array(
array(
'unknown',
'some content',
'some content',
),
array(
'unknown',
'',
'',
)
);
}
}
@@ -0,0 +1,195 @@
<?php
/**
* phpDocumentor Collection Test
*
* PHP version 5.3
*
* @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\Type;
use phpDocumentor\Reflection\DocBlock\Context;
/**
* Test class for \phpDocumentor\Reflection\DocBlock\Type\Collection
*
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection
*
* @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
*/
class CollectionTest extends \PHPUnit_Framework_TestCase
{
/**
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::getContext
*
* @return void
*/
public function testConstruct()
{
$collection = new Collection();
$this->assertCount(0, $collection);
$this->assertEquals('', $collection->getContext()->getNamespace());
$this->assertCount(0, $collection->getContext()->getNamespaceAliases());
}
/**
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
*
* @return void
*/
public function testConstructWithTypes()
{
$collection = new Collection(array('integer', 'string'));
$this->assertCount(2, $collection);
}
/**
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
*
* @return void
*/
public function testConstructWithNamespace()
{
$collection = new Collection(array(), new Context('\My\Space'));
$this->assertEquals('My\Space', $collection->getContext()->getNamespace());
$collection = new Collection(array(), new Context('My\Space'));
$this->assertEquals('My\Space', $collection->getContext()->getNamespace());
$collection = new Collection(array(), null);
$this->assertEquals('', $collection->getContext()->getNamespace());
}
/**
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
*
* @return void
*/
public function testConstructWithNamespaceAliases()
{
$fixture = array('a' => 'b');
$collection = new Collection(array(), new Context(null, $fixture));
$this->assertEquals(
array('a' => '\b'),
$collection->getContext()->getNamespaceAliases()
);
}
/**
* @param string $fixture
* @param array $expected
*
* @dataProvider provideTypesToExpand
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add
*
* @return void
*/
public function testAdd($fixture, $expected)
{
$collection = new Collection(
array(),
new Context('\My\Space', array('Alias' => '\My\Space\Aliasing'))
);
$collection->add($fixture);
$this->assertSame($expected, $collection->getArrayCopy());
}
/**
* @param string $fixture
* @param array $expected
*
* @dataProvider provideTypesToExpandWithoutNamespace
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add
*
* @return void
*/
public function testAddWithoutNamespace($fixture, $expected)
{
$collection = new Collection(
array(),
new Context(null, array('Alias' => '\My\Space\Aliasing'))
);
$collection->add($fixture);
$this->assertSame($expected, $collection->getArrayCopy());
}
/**
* @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add
* @expectedException InvalidArgumentException
*
* @return void
*/
public function testAddWithInvalidArgument()
{
$collection = new Collection();
$collection->add(array());
}
/**
* Returns the types and their expected values to test the retrieval of
* types.
*
* @param string $method Name of the method consuming this data provider.
* @param string $namespace Name of the namespace to user as basis.
*
* @return string[]
*/
public function provideTypesToExpand($method, $namespace = '\My\Space\\')
{
return array(
array('', array()),
array(' ', array()),
array('int', array('int')),
array('int ', array('int')),
array('string', array('string')),
array('DocBlock', array($namespace.'DocBlock')),
array('DocBlock[]', array($namespace.'DocBlock[]')),
array(' DocBlock ', array($namespace.'DocBlock')),
array('\My\Space\DocBlock', array('\My\Space\DocBlock')),
array('Alias\DocBlock', array('\My\Space\Aliasing\DocBlock')),
array(
'DocBlock|Tag',
array($namespace .'DocBlock', $namespace .'Tag')
),
array(
'DocBlock|null',
array($namespace.'DocBlock', 'null')
),
array(
'\My\Space\DocBlock|Tag',
array('\My\Space\DocBlock', $namespace.'Tag')
),
array(
'DocBlock[]|null',
array($namespace.'DocBlock[]', 'null')
),
array(
'DocBlock[]|int[]',
array($namespace.'DocBlock[]', 'int[]')
),
);
}
/**
* Returns the types and their expected values to test the retrieval of
* types when no namespace is available.
*
* @param string $method Name of the method consuming this data provider.
*
* @return string[]
*/
public function provideTypesToExpandWithoutNamespace($method)
{
return $this->provideTypesToExpand($method, '\\');
}
}
+216 -67
View File
@@ -2,26 +2,34 @@
/** /**
* phpDocumentor DocBlock Test * phpDocumentor DocBlock Test
* *
* PHP Version 5 * PHP Version 5.3
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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; namespace phpDocumentor\Reflection;
require_once __DIR__.'/../../../src/phpDocumentor/Reflection/DocBlock.php'; use phpDocumentor\Reflection\DocBlock\Context;
require_once __DIR__ use phpDocumentor\Reflection\DocBlock\Location;
.'/../../../src/phpDocumentor/Reflection/DocBlock/LongDescription.php';
/** /**
* Test class for phpDocumentor_Reflection_DocBlock * Test class for phpDocumentor\Reflection\DocBlock
* *
* @author Mike van Riel <[email protected]> * @author Mike van Riel <[email protected]>
* @copyright Copyright (c) 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) * @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
*/ */
class DocBlockTest extends \PHPUnit_Framework_TestCase class DocBlockTest extends \PHPUnit_Framework_TestCase
{ {
/**
* @covers \phpDocumentor\Reflection\DocBlock
*
* @return void
*/
public function testConstruct() public function testConstruct()
{ {
$fixture = <<<DOCBLOCK $fixture = <<<DOCBLOCK
@@ -34,17 +42,100 @@ class DocBlockTest extends \PHPUnit_Framework_TestCase
* @return void * @return void
*/ */
DOCBLOCK; DOCBLOCK;
$object = new DocBlock($fixture); $object = new DocBlock(
$fixture,
new Context('\MyNamespace', array('PHPDoc' => '\phpDocumentor')),
new Location(2)
);
$this->assertEquals( $this->assertEquals(
'This is a short description.', $object->getShortDescription() 'This is a short description.',
$object->getShortDescription()
); );
$this->assertEquals( $this->assertEquals(
'This is a long description.', 'This is a long description.',
$object->getLongDescription()->getContents() $object->getLongDescription()->getContents()
); );
$this->assertEquals(2, count($object->getTags())); $this->assertCount(2, $object->getTags());
$this->assertTrue($object->hasTag('see')); $this->assertTrue($object->hasTag('see'));
$this->assertTrue($object->hasTag('return')); $this->assertTrue($object->hasTag('return'));
$this->assertFalse($object->hasTag('category'));
$this->assertSame('MyNamespace', $object->getContext()->getNamespace());
$this->assertSame(
array('PHPDoc' => '\phpDocumentor'),
$object->getContext()->getNamespaceAliases()
);
$this->assertSame(2, $object->getLocation()->getLineNumber());
}
/**
* @covers \phpDocumentor\Reflection\DocBlock::splitDocBlock
*
* @return void
*/
public function testConstructWithTagsOnly()
{
$fixture = <<<DOCBLOCK
/**
* @see \MyClass
* @return void
*/
DOCBLOCK;
$object = new DocBlock($fixture);
$this->assertEquals('', $object->getShortDescription());
$this->assertEquals('', $object->getLongDescription()->getContents());
$this->assertCount(2, $object->getTags());
$this->assertTrue($object->hasTag('see'));
$this->assertTrue($object->hasTag('return'));
$this->assertFalse($object->hasTag('category'));
}
/**
* @covers \phpDocumentor\Reflection\DocBlock::cleanInput
*
* @return void
*/
public function testConstructOneLiner()
{
$fixture = '/** Short description and nothing more. */';
$object = new DocBlock($fixture);
$this->assertEquals(
'Short description and nothing more.',
$object->getShortDescription()
);
$this->assertEquals('', $object->getLongDescription()->getContents());
$this->assertCount(0, $object->getTags());
}
/**
* @covers \phpDocumentor\Reflection\DocBlock::__construct
*
* @return void
*/
public function testConstructFromReflector()
{
$object = new DocBlock(new \ReflectionClass($this));
$this->assertEquals(
'Test class for phpDocumentor\Reflection\DocBlock',
$object->getShortDescription()
);
$this->assertEquals('', $object->getLongDescription()->getContents());
$this->assertCount(4, $object->getTags());
$this->assertTrue($object->hasTag('author'));
$this->assertTrue($object->hasTag('copyright'));
$this->assertTrue($object->hasTag('license'));
$this->assertTrue($object->hasTag('link'));
$this->assertFalse($object->hasTag('category'));
}
/**
* @expectedException \InvalidArgumentException
*
* @return void
*/
public function testExceptionOnInvalidObject()
{
new DocBlock($this);
} }
public function testDotSeperation() public function testDotSeperation()
@@ -57,92 +148,150 @@ DOCBLOCK;
DOCBLOCK; DOCBLOCK;
$object = new DocBlock($fixture); $object = new DocBlock($fixture);
$this->assertEquals( $this->assertEquals(
'This is a short description.', $object->getShortDescription() 'This is a short description.',
$object->getShortDescription()
); );
$this->assertEquals( $this->assertEquals(
"This is a long description.\nThis is a continuation of the long " "This is a long description.\nThis is a continuation of the long "
."description.", $object->getLongDescription()->getContents() ."description.",
$object->getLongDescription()->getContents()
); );
} }
/** /**
* Tests whether a type is expanded with the given namespace and that a * @covers \phpDocumentor\Reflection\DocBlock::parseTags
* keyword is not expanded. * @expectedException \LogicException
*
* @covers \phpDocumentor\Reflection\DocBlock::expandType()
* *
* @return void * @return void
*/ */
public function testExpandTypeUsingNamespace() public function testInvalidTagBlock()
{ {
$docblock = new DocBlock('', '\My\Namespace'); if (0 == ini_get('allow_url_include')) {
$this->assertEquals('\My\Namespace\Mine', $docblock->expandType('Mine')); $this->markTestSkipped('"data" URIs for includes are required.');
} }
/** include 'data:text/plain;base64,'. base64_encode(
* Tests whether a type is expanded when no namespace is given. <<<DOCBLOCK_EXTENSION
* <?php
* @covers \phpDocumentor\Reflection\DocBlock::expandType() class MyReflectionDocBlock extends \phpDocumentor\Reflection\DocBlock {
* protected function splitDocBlock(\$comment) {
* @return void return array('', '', 'Invalid tag block');
*/
public function testExpandTypeWithoutNamespace()
{
$docblock = new DocBlock('');
$this->assertEquals('\Mine', $docblock->expandType('Mine'));
} }
}
/** DOCBLOCK_EXTENSION
* Tests whether a type is expanded with the given namespace when an alias
* is provided.
*
* @covers \phpDocumentor\Reflection\DocBlock::expandType()
*
* @return void
*/
public function testExpandTypeUsingNamespaceAlias()
{
$docblock = new DocBlock(
'', '\My\Namespace', array('Alias' => '\My\Namespace\Alias')
); );
new \MyReflectionDocBlock('');
// first try a normal resolution without alias }
public function testTagCaseSensitivity()
{
$fixture = <<<DOCBLOCK
/**
* This is a short description.
*
* This is a long description.
*
* @method null something()
* @Method({"GET", "POST"})
*/
DOCBLOCK;
$object = new DocBlock($fixture);
$this->assertEquals( $this->assertEquals(
'\My\Namespace\Al', $docblock->expandType('Al') 'This is a short description.',
$object->getShortDescription()
); );
// try to use the alias
$this->assertEquals( $this->assertEquals(
'\My\Namespace\Alias\Al', $docblock->expandType('Alias\Al') 'This is a long description.',
$object->getLongDescription()->getContents()
);
$tags = $object->getTags();
$this->assertCount(2, $tags);
$this->assertTrue($object->hasTag('method'));
$this->assertTrue($object->hasTag('Method'));
$this->assertInstanceOf(
__NAMESPACE__ . '\DocBlock\Tag\MethodTag',
$tags[0]
);
$this->assertInstanceOf(
__NAMESPACE__ . '\DocBlock\Tag',
$tags[1]
);
$this->assertNotInstanceOf(
__NAMESPACE__ . '\DocBlock\Tag\MethodTag',
$tags[1]
); );
} }
/** /**
* Tests whether the keywords that should not be converted are not converted. * @depends testConstructFromReflector
* * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName
* @param string $keyword The keyword that is to be tested; this is provided
* by the dataprovider.
*
* @covers \phpDocumentor\Reflection\DocBlock::expandType()
*
* @dataProvider getNonExpandableKeywordsForExpandType
* *
* @return void * @return void
*/ */
public function testThatExpandTypeDoesNotExpandAllKeywords($keyword) public function testGetTagsByNameZeroAndOneMatch()
{ {
$docblock = new DocBlock('', '\My\Namespace'); $object = new DocBlock(new \ReflectionClass($this));
$this->assertEquals($keyword, $docblock->expandType($keyword)); $this->assertEmpty($object->getTagsByName('category'));
$this->assertCount(1, $object->getTagsByName('author'));
} }
public function getNonExpandableKeywordsForExpandType() /**
* @depends testConstructWithTagsOnly
* @covers \phpDocumentor\Reflection\DocBlock::parseTags
*
* @return void
*/
public function testParseMultilineTag()
{ {
return array( $fixture = <<<DOCBLOCK
array('string'), array('int'), array('integer'), array('bool'), /**
array('boolean'), array('float'), array('double'), array('object'), * @return void Content on
array('mixed'), array('array'), array('resource'), array('void'), * multiple lines.
array('null'), array('callback'), array('false'), array('true') */
); DOCBLOCK;
} $object = new DocBlock($fixture);
$this->assertCount(1, $object->getTags());
} }
/**
* @depends testConstructWithTagsOnly
* @covers \phpDocumentor\Reflection\DocBlock::parseTags
*
* @return void
*/
public function testParseMultilineTagWithLineBreaks()
{
$fixture = <<<DOCBLOCK
/**
* @return void Content on
* multiple lines.
*
* One more, after the break.
*/
DOCBLOCK;
$object = new DocBlock($fixture);
$this->assertCount(1, $object->getTags());
}
/**
* @depends testConstructWithTagsOnly
* @covers \phpDocumentor\Reflection\DocBlock::getTagsByName
*
* @return void
*/
public function testGetTagsByNameMultipleMatch()
{
$fixture = <<<DOCBLOCK
/**
* @param string
* @param int
* @return void
*/
DOCBLOCK;
$object = new DocBlock($fixture);
$this->assertEmpty($object->getTagsByName('category'));
$this->assertCount(1, $object->getTagsByName('return'));
$this->assertCount(2, $object->getTagsByName('param'));
}
}