Augmentation vers version 3.3.0

This commit is contained in:
Gauvain Boiché
2020-03-31 15:31:03 +02:00
parent d926806907
commit a1864c0414
2618 changed files with 406015 additions and 31377 deletions

View File

@@ -0,0 +1,509 @@
# Changelog
All notable changes to this project will be documented in this file, in reverse chronological order by release.
## 3.4.1 - 2019-12-10
### Added
- [#180](https://github.com/zendframework/zend-code/pull/180) adds support for PHP 7.4.
### Changed
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#179](https://github.com/zendframework/zend-code/pull/179) fixes exception message when invalid value provided in `Zend\Code\Generator\ValueGenerator`.
- [#180](https://github.com/zendframework/zend-code/pull/190) fixes PHP 7.4 compatibility.
## 3.4.0 - 2019-10-06
### Added
- [#170](https://github.com/zendframework/zend-code/pull/170) adds class constant visibility modifiers support.
- [#169](https://github.com/zendframework/zend-code/pull/169) adds the ability to define declare statements.
- [#167](https://github.com/zendframework/zend-code/pull/167) adds the ability to remove doc block of a member.
### Changed
- [#166](https://github.com/zendframework/zend-code/pull/166) changes omitting default property value if it is null.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#172](https://github.com/zendframework/zend-code/pull/172) fixes PHP 7.4 compatibility.
## 3.3.2 - 2019-08-31
### Added
- [#162](https://github.com/zendframework/zend-code/pull/162) adds support for PHP 7.3.
### Changed
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#171](https://github.com/zendframework/zend-code/pull/171) changes
curly braces in array and string offset access to square brackets
in order to prevent issues under the upcoming PHP 7.4 release.
- [#164](https://github.com/zendframework/zend-code/pull/164) fixes indentation in multi-level arrays generated by `ValueGenerator`.
## 3.3.1 - 2018-08-13
### Added
- Nothing.
### Changed
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#158](https://github.com/zendframework/zend-code/pull/158) updates several `switch` cases to use `break` instead of `continue`
in order to prevent issues under the upcoming PHP 7.3 release.
- [#147](https://github.com/zendframework/zend-code/pull/147) fixes the regular expression used for `@var` annotations to
allow omission of the variable name.
- [#146](https://github.com/zendframework/zend-code/pull/146) updates all `@return` annotations to reflect the correct types returned by each method.
- [#144](https://github.com/zendframework/zend-code/pull/144) fixes the class generator such that it now resolves
`setExtendedClass()` arguments to aliases provided to the generator.
- [#140](https://github.com/zendframework/zend-code/pull/140) fixes `MethodScanner::setVisibility()` such that it no longer
casts the provided visibility token to lower case; this fix is necessary, as
the method is supposed to expect only the appropriate
`T_(PUBLIC|PROTECTED|PRIVATE)` token values, which are integers.
- [#140](https://github.com/zendframework/zend-code/pull/140) updates the `MethodScanner::setVisibility()` method to raise
a package-specific `InvalidArgumentException` instead of the non-existent
package `Exception` class when an invalid visibility is provided.
## 3.3.0 - 2017-10-20
### Added
- [#131](https://github.com/zendframework/zend-code/pull/131) added the
ability to omit a parameter type declaration
- [#132](https://github.com/zendframework/zend-code/pull/132) added a
lightweight `MethodGenerator::copyMethodSignature()` constructor that
only copies the method declaration with no body nor docblock.
- [#134](https://github.com/zendframework/zend-code/pull/134) short array
notation is now used by default for generated array values
- [#136](https://github.com/zendframework/zend-code/pull/136) added the
ability to specify an `omitdefaultvalue` key when using
`ParameterGenerator::fromArray()`
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#130](https://github.com/zendframework/zend-code/pull/130) Updated
links to the documentation
- [#133](https://github.com/zendframework/zend-code/pull/133) The default
value of a `ParameterGenerator` is always a `ValueGenerator`
## 3.2.0 - 2017-07-23
### Added
- [#112](https://github.com/zendframework/zend-code/pull/112)
[#110](https://github.com/zendframework/zend-code/pull/110) Introduced
support for the PHP `7.2` `object` type-hint
- [#41](https://github.com/zendframework/zend-code/pull/41) Added `VarTag`
support to the docblock generators and reflectors: allows generating
and parsing `@var` tags.
- [#113](https://github.com/zendframework/zend-code/pull/113) Added
PHP `7.2` to the build matrix
- [#114](https://github.com/zendframework/zend-code/pull/114) Increased
minimum supported PHP version to `^7.1.0`
- [#114](https://github.com/zendframework/zend-code/pull/114) Upgraded
PHPUnit dependency to `^6.2.2`
- [#121](https://github.com/zendframework/zend-code/pull/121) Imported
global functions via `use` statements (experimenting with OpCache
OPCODE inlining optimisations)
### Deprecated
- Nothing.
### Removed
- [#113](https://github.com/zendframework/zend-code/pull/113)
[#118](https://github.com/zendframework/zend-code/pull/118) Removed
HHVM support
- [#122](https://github.com/zendframework/zend-code/pull/122) Removed
IRC notifications for pushes/build statuses
### Fixed
- [#101](https://github.com/zendframework/zend-code/pull/101) avoid
calling `isInternalPhpType` twice in the `TypeGenerator`
- [#115](https://github.com/zendframework/zend-code/pull/115) Replaced
assertions in the test suite with their static counterparts where
applicable
- [#120](https://github.com/zendframework/zend-code/pull/120)
[#109](https://github.com/zendframework/zend-code/pull/109)
[#100](https://github.com/zendframework/zend-code/pull/100) Applied
ZendFramework coding standard to the library code
- [#119](https://github.com/zendframework/zend-code/pull/119) Corrected
test suite errors caused by mismatching parameter order
- [#106](https://github.com/zendframework/zend-code/pull/106)
- [#107](https://github.com/zendframework/zend-code/pull/107) Minor
typing error corrections in documentation and error messages
## 3.1.0 - 2016-10-24
### Added
- [#87](https://github.com/zendframework/zend-code/pull/87) support for
PHP 7.1's `void` return type declaration.
- [#87](https://github.com/zendframework/zend-code/pull/87) support for
PHP 7.1's nullable type declarations.
- [#87](https://github.com/zendframework/zend-code/pull/87) support for
PHP 7.1's `iterable` type declaration.
- [#62](https://github.com/zendframework/zend-code/pull/62) added
`Zend\Code\Generator\MethodGenerator#getReturnType()` accessor.
- [#68](https://github.com/zendframework/zend-code/pull/68)
[#26](https://github.com/zendframework/zend-code/pull/26) added mutators
to allow removing/checking for existence of methods, properties, constants,
parameters and type declarations across all the code generator API.
- [#65](https://github.com/zendframework/zend-code/pull/65) continuous
integration testing now checks locked, newest and oldest dependency
sets.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- Nothing.
## 3.0.5 - 2016-10-24
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#92](https://github.com/zendframework/zend-code/pull/92) corrected
`Zend\Code\Scanner\ClassScanner` to detect multiple interface inheritance.
- [#95](https://github.com/zendframework/zend-code/pull/95) corrected
`Zend\Code\Generator\ParameterGenerator` to allow copying parameter signatures
for non-optional parameters that are still nullable via a default `= null`
value.
- [#94](https://github.com/zendframework/zend-code/pull/94) corrected
`Zend\Code\Generator\ValueGenerator` so that class constants can now
be generated with arrays as default value (supported since PHP 5.6).
## 3.0.4 - 2016-06-30
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#59](https://github.com/zendframework/zend-code/pull/59) fixes an issue with
detection of multiple trait `use` statements.
- [#75](https://github.com/zendframework/zend-code/pull/75) provides a patch to
ensure that `extends` statements qualify the parent class based on the current
namespace and/or import statements.
## 3.0.3 - 2016-06-27
### Added
- [#66](https://github.com/zendframework/zend-code/pull/66) publishes the
documentation to https://docs.zendframework.com/zend-code/.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#61](https://github.com/zendframework/zend-code/pull/61) fixes an issue with
how parameter typehints were generated; previously, fully-qualified class
names were not being generated with the leading backslash, causing them to
attempt to resolve as if they were relative to the current namespace.
- [#69](https://github.com/zendframework/zend-code/pull/69) fixes an issue with
how class names under the same namespace are generated when generating
typehints, extends, and implements values; they now strip the
common namespace from the class name.
- [#72](https://github.com/zendframework/zend-code/pull/72) fixes an issue
within the `TokenArrayScanner` when scanning closures.
## 3.0.2 - 2016-04-20
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#52](https://github.com/zendframework/zend-code/pull/52) updates several
dependency constraints:
- zend-stdlib now allows either the 2.7 or 3.0 series, as the APIs consumed by
zend-code are compatible across versions.
- PHP now excludes the 7.0.5 release, as it has known issues in its tokenizer
implementation that make the zend-code token scanner unusable.
- [#46](https://github.com/zendframework/zend-code/pull/46) updates all
generators to use `\n` for line endings in generated code, vs `PHP_EOL`,
ensuring cross-platform consistency.
## 3.0.1 - 2016-01-26
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#34](https://github.com/zendframework/zend-code/pull/34) method name cannot be optional when adding a method
to a class generator.
- [#38](https://github.com/zendframework/zend-code/pull/38) PHP_CodeSniffer was moved to dev dependencies
## 3.0.0 - 2016-01-13
### Changed
- [#140](https://github.com/zendframework/zend-code/pull/140) updates the `MethodScanner::setVisibility()` method to raise a package-specific `InvalidArgumentException` instead of
the non-existent package `Exception` class when an invalid visibility is provided.
This section refers to breaking changes: please refer to
[docs/book/migration.md](docs/book/migration.md) for migration instructions.
- Types `string`, `int`, `float`, `bool` passed to `Zend\Code\Generator\ParameterGenerator#setType()`
are no longer ignored in generated code [#30](https://github.com/zendframework/zend-code/pull/30)
- Types declared in DocBlocks are now ignored when creating a `Zend\Code\Generator\ParameterGenerator` via
`Zend\Code\Generator\ParameterGenerator::fromReflection()`. [#30](https://github.com/zendframework/zend-code/pull/30)
- Type strings are now validated: passing an invalid type to any method in the generator API
may lead to a `Zend\Code\Generator\InvalidArgumentException` being thrown.
[#30](https://github.com/zendframework/zend-code/pull/30)
- `Zend\Code\Generator\ParameterGenerator::$simple` was removed. [#30](https://github.com/zendframework/zend-code/pull/30)
- `Zend\Code\Generator\ParameterGenerator#$type` is now a `null|Zend\Code\Generator\TypeGenerator`: was a
`string` before. [#30](https://github.com/zendframework/zend-code/pull/30)
- `Zend\Code\Generator` type-hints are now always prefixed with the namespace separator `\`.
[#30](https://github.com/zendframework/zend-code/pull/30)
- `Zend\Code\Reflection\ParameterReflection#getType()` was renamed
to `Zend\Code\Reflection\ParameterReflection#detectType()` in order to not override the inherited
`ReflectionParameter#getType()`, introduced in PHP 7. [#30](https://github.com/zendframework/zend-code/pull/30)
### Added
- PHP 7 return type hints generation support via `Zend\Code\Generator\MethodGenerator#setReturnType()`.
[#30](https://github.com/zendframework/zend-code/pull/30)
- PHP 7 scalar type hints generation support via `Zend\Code\Generator\ParameterGenerator#setType()` and
`Zend\Code\Generator\ParameterGenerator#getType()`. [#30](https://github.com/zendframework/zend-code/pull/30)
- PHP 5.6 variadic arguments support via `Zend\Code\Generator\ParameterGenerator#setVariadic()` and
`Zend\Code\Generator\ParameterGenerator#getVariadic()`. [#30](https://github.com/zendframework/zend-code/pull/30)
- Generation of methods returning by reference is supported via `Zend\Code\Generator\ParameterGenerator#setReturnsReference()`.
[#30](https://github.com/zendframework/zend-code/pull/30)
### Deprecated
- Nothing.
### Removed
- `Zend\Code\ParameterGenerator::$simple` was removed. [#30](https://github.com/zendframework/zend-code/pull/30)
### Fixed
- Nothing.
## 2.6.2 - 2015-01-05
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#31](https://github.com/zendframework/zend-code/pull/31) updated license year.
## 2.6.2 - 2015-01-05
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#31](https://github.com/zendframework/zend-code/pull/31) updated license year.
## 2.6.1 - 2015-11-24
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#25](https://github.com/zendframework/zend-code/pull/25) changes the
`doctrine/common` suggestion/dev-dependency to the more specific
`doctrine/annotations` package (which is what is actually consumed).
## 2.6.0 - 2015-11-18
### Added
- [#12](https://github.com/zendframework/zend-code/pull/12) adds the ability to
generate arrays using either long/standard syntax (`array(...)`) or short
syntax (`[...]`). This can be accomplished by setting the value type to
`ValueGenerator::TYPE_ARRAY_SHORT` instead of using `TYPE_ARRAY`.
Additionally, you can use `TYPE_ARRAY_LONG` instead of `TYPE_ARRAY`; the two
constants are synonyms.
- [#11](https://github.com/zendframework/zend-code/pull/11) adds the ability to
generate interfaces via the new class `Zend\Code\Generator\InterfaceGenerator`.
### Deprecated
- Nothing.
### Removed
- Nothing.
### Fixed
- [#20](https://github.com/zendframework/zend-code/pull/20) updates
the zend-eventmanager dependency to `^2.6|^3.0`, and changes its
internal usage to use the `triggerEventUntil()` signature.
## 2.5.3 - 2015-11-18
### Added
- Nothing.
### Deprecated
- Nothing.
### Removed
- [#10](https://github.com/zendframework/zend-code/pull/10) removes a
development dependency on zendframework/zend-version.
- [#23](https://github.com/zendframework/zend-code/pull/23) removes a
requirement on zendframework/zend-stdlib. This results in a slight change in
`Zend\Code\Generator\ValueGenerator`: `setConstants()` and `getConstants()`
can now receive/emit *either* an SPL `ArrayObject` or
`Zend\Stdlib\ArrayObject`. Since these are functionally equivalent, however,
you will experience no change in behavior.
### Fixed
- Nothing.

View File

@@ -1,16 +1,15 @@
Copyright (c) 2005-2015, Zend Technologies USA, Inc.
Copyright (c) 2005-2019, Zend Technologies USA, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
- Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
- Neither the name of Zend Technologies USA, Inc. nor the names of its
contributors may be used to endorse or promote products derived from this

View File

@@ -1,43 +1,66 @@
{
"name": "zendframework/zend-code",
"description": "provides facilities to generate arbitrary code using an object oriented interface",
"description": "Extensions to the PHP Reflection API, static code scanning, and code generation",
"license": "BSD-3-Clause",
"keywords": [
"zf2",
"zf",
"zendframework",
"code"
],
"homepage": "https://github.com/zendframework/zend-code",
"support": {
"docs": "https://docs.zendframework.com/zend-code/",
"issues": "https://github.com/zendframework/zend-code/issues",
"source": "https://github.com/zendframework/zend-code",
"rss": "https://github.com/zendframework/zend-code/releases.atom",
"chat": "https://zendframework-slack.herokuapp.com",
"forum": "https://discourse.zendframework.com/c/questions/components"
},
"require": {
"php": "^7.1",
"zendframework/zend-eventmanager": "^2.6 || ^3.0"
},
"require-dev": {
"ext-phar": "*",
"doctrine/annotations": "^1.7",
"phpunit/phpunit": "^7.5.16 || ^8.4",
"zendframework/zend-coding-standard": "^1.0",
"zendframework/zend-stdlib": "^2.7 || ^3.0"
},
"conflict": {
"phpspec/prophecy": "<1.9.0"
},
"suggest": {
"doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
"zendframework/zend-stdlib": "Zend\\Stdlib component"
},
"autoload": {
"psr-4": {
"Zend\\Code\\": "src/"
}
},
"require": {
"php": ">=5.3.23",
"zendframework/zend-eventmanager": "~2.5"
},
"require-dev": {
"doctrine/common": ">=2.1",
"zendframework/zend-stdlib": "~2.5",
"zendframework/zend-version": "~2.5",
"fabpot/php-cs-fixer": "1.7.*",
"phpunit/PHPUnit": "~4.0"
},
"suggest": {
"doctrine/common": "Doctrine\\Common >=2.1 for annotation features",
"zendframework/zend-stdlib": "Zend\\Stdlib component"
},
"minimum-stability": "dev",
"prefer-stable": true,
"extra": {
"branch-alias": {
"dev-master": "2.5-dev",
"dev-develop": "2.6-dev"
}
},
"autoload-dev": {
"psr-4": {
"ZendTest\\Code\\": "test/"
}
},
"config": {
"sort-packages": true
},
"extra": {
"branch-alias": {
"dev-master": "3.4.x-dev",
"dev-develop": "3.5.x-dev",
"dev-dev-4.0": "4.0.x-dev"
}
},
"scripts": {
"check": [
"@cs-check",
"@test"
],
"cs-check": "phpcs",
"cs-fix": "phpcbf",
"test": "phpunit --colors=always",
"test-coverage": "phpunit --colors=always --coverage-clover clover.xml"
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,8 @@ namespace Zend\Code\Annotation;
use ArrayObject;
use function get_class;
class AnnotationCollection extends ArrayObject
{
/**

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -15,6 +15,9 @@ use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
use Zend\EventManager\EventManagerInterface;
use function get_class;
use function is_object;
/**
* Pluggable annotation manager
*
@@ -41,10 +44,10 @@ class AnnotationManager implements EventManagerAwareInterface
*/
public function setEventManager(EventManagerInterface $events)
{
$events->setIdentifiers(array(
$events->setIdentifiers([
__CLASS__,
get_class($this),
));
]);
$this->events = $events;
return $this;
@@ -75,7 +78,7 @@ class AnnotationManager implements EventManagerAwareInterface
public function attach(ParserInterface $parser)
{
$this->getEventManager()
->attach(self::EVENT_CREATE_ANNOTATION, array($parser, 'onCreateAnnotation'));
->attach(self::EVENT_CREATE_ANNOTATION, [$parser, 'onCreateAnnotation']);
return $this;
}
@@ -91,19 +94,19 @@ class AnnotationManager implements EventManagerAwareInterface
$event = new Event();
$event->setName(self::EVENT_CREATE_ANNOTATION);
$event->setTarget($this);
$event->setParams(array(
$event->setParams([
'class' => $annotationData[0],
'content' => $annotationData[1],
'raw' => $annotationData[2],
));
]);
$eventManager = $this->getEventManager();
$results = $eventManager->trigger($event, function ($r) {
return (is_object($r));
});
$results = $eventManager->triggerEventUntil(function ($r) {
return is_object($r);
}, $event);
$annotation = $results->last();
return (is_object($annotation) ? $annotation : false);
return is_object($annotation) ? $annotation : false;
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -15,6 +15,15 @@ use Traversable;
use Zend\Code\Exception;
use Zend\EventManager\EventInterface;
use function array_shift;
use function class_exists;
use function get_class;
use function gettype;
use function is_array;
use function is_object;
use function preg_replace;
use function sprintf;
/**
* A parser for docblock annotations that utilizes the annotation parser from
* Doctrine\Common.
@@ -29,7 +38,7 @@ class DoctrineAnnotationParser implements ParserInterface
/**
* @var array Annotation classes we support on this iteration
*/
protected $allowedAnnotations = array();
protected $allowedAnnotations = [];
/**
* @var DocParser
@@ -65,7 +74,7 @@ class DoctrineAnnotationParser implements ParserInterface
*/
public function getDocParser()
{
if (!$this->docParser instanceof DocParser) {
if (! $this->docParser instanceof DocParser) {
$this->setDocParser(new DocParser());
}
@@ -81,16 +90,16 @@ class DoctrineAnnotationParser implements ParserInterface
public function onCreateAnnotation(EventInterface $e)
{
$annotationClass = $e->getParam('class', false);
if (!$annotationClass) {
if (! $annotationClass) {
return false;
}
if (!isset($this->allowedAnnotations[$annotationClass])) {
if (! isset($this->allowedAnnotations[$annotationClass])) {
return false;
}
$annotationString = $e->getParam('raw', false);
if (!$annotationString) {
if (! $annotationString) {
return false;
}
@@ -107,7 +116,7 @@ class DoctrineAnnotationParser implements ParserInterface
}
$annotation = array_shift($annotations);
if (!is_object($annotation)) {
if (! is_object($annotation)) {
return false;
}
@@ -136,11 +145,11 @@ class DoctrineAnnotationParser implements ParserInterface
*/
public function registerAnnotations($annotations)
{
if (!is_array($annotations) && !$annotations instanceof Traversable) {
if (! is_array($annotations) && ! $annotations instanceof Traversable) {
throw new Exception\InvalidArgumentException(sprintf(
'%s: expects an array or Traversable; received "%s"',
__METHOD__,
(is_object($annotations) ? get_class($annotations) : gettype($annotations))
is_object($annotations) ? get_class($annotations) : gettype($annotations)
));
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -14,6 +14,19 @@ use Zend\Code\Annotation\AnnotationInterface;
use Zend\Code\Exception;
use Zend\EventManager\EventInterface;
use function array_search;
use function class_exists;
use function get_class;
use function gettype;
use function in_array;
use function is_array;
use function is_object;
use function is_string;
use function sprintf;
use function str_replace;
use function strtolower;
use function trim;
/**
* Generic annotation parser
*
@@ -26,17 +39,17 @@ class GenericAnnotationParser implements ParserInterface
/**
* @var array
*/
protected $aliases = array();
protected $aliases = [];
/**
* @var array
*/
protected $annotationNames = array();
protected $annotationNames = [];
/**
* @var AnnotationInterface[]
*/
protected $annotations = array();
protected $annotations = [];
/**
* Listen to onCreateAnnotation, and attempt to return an annotation object
@@ -53,7 +66,7 @@ class GenericAnnotationParser implements ParserInterface
public function onCreateAnnotation(EventInterface $e)
{
$class = $e->getParam('class', false);
if (!$class || !$this->hasAnnotation($class)) {
if (! $class || ! $this->hasAnnotation($class)) {
return false;
}
@@ -80,7 +93,7 @@ class GenericAnnotationParser implements ParserInterface
*
* @param string|AnnotationInterface $annotation String class name of an
* AnnotationInterface implementation, or actual instance
* @return GenericAnnotationParser
* @return void
* @throws Exception\InvalidArgumentException
*/
public function registerAnnotation($annotation)
@@ -91,12 +104,12 @@ class GenericAnnotationParser implements ParserInterface
$annotation = new $annotation();
}
if (!$annotation instanceof AnnotationInterface) {
if (! $annotation instanceof AnnotationInterface) {
throw new Exception\InvalidArgumentException(sprintf(
'%s: expects an instance of %s\AnnotationInterface; received "%s"',
__METHOD__,
__NAMESPACE__,
(is_object($annotation) ? get_class($annotation) : gettype($annotation))
is_object($annotation) ? get_class($annotation) : gettype($annotation)
));
}
@@ -122,11 +135,11 @@ class GenericAnnotationParser implements ParserInterface
*/
public function registerAnnotations($annotations)
{
if (!is_array($annotations) && !$annotations instanceof Traversable) {
if (! is_array($annotations) && ! $annotations instanceof Traversable) {
throw new Exception\InvalidArgumentException(sprintf(
'%s: expects an array or Traversable; received "%s"',
__METHOD__,
(is_object($annotations) ? get_class($annotations) : gettype($annotations))
is_object($annotations) ? get_class($annotations) : gettype($annotations)
));
}
@@ -166,7 +179,7 @@ class GenericAnnotationParser implements ParserInterface
*/
public function setAlias($alias, $class)
{
if (!in_array($class, $this->annotationNames) && !$this->hasAlias($class)) {
if (! in_array($class, $this->annotationNames) && ! $this->hasAlias($class)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s: Cannot alias "%s" to "%s", as class "%s" is not currently a registered annotation or alias',
__METHOD__,
@@ -190,7 +203,7 @@ class GenericAnnotationParser implements ParserInterface
*/
protected function normalizeAlias($alias)
{
return strtolower(str_replace(array('-', '_', ' ', '\\', '/'), '', $alias));
return strtolower(str_replace(['-', '_', ' ', '\\', '/'], '', $alias));
}
/**
@@ -203,7 +216,7 @@ class GenericAnnotationParser implements ParserInterface
{
$alias = $this->normalizeAlias($alias);
return (isset($this->aliases[$alias]));
return isset($this->aliases[$alias]);
}
/**

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -0,0 +1,116 @@
<?php
namespace Zend\Code;
use Zend\Code\Exception\InvalidArgumentException;
class DeclareStatement
{
public const TICKS = 'ticks';
public const STRICT_TYPES = 'strict_types';
public const ENCODING = 'encoding';
private const ALLOWED = [
self::TICKS => 'integer',
self::STRICT_TYPES => 'integer',
self::ENCODING => 'string',
];
/**
* @var string
*/
protected $directive;
/**
* @var int|string
*/
protected $value;
private function __construct(string $directive, $value)
{
$this->directive = $directive;
$this->value = $value;
}
/**
* @return string
*/
public function getDirective(): string
{
return $this->directive;
}
/**
* @return int|string
*/
public function getValue()
{
return $this->value;
}
/**
* @param int $value
* @return self
*/
public static function ticks(int $value): self
{
return new self(self::TICKS, $value);
}
/**
* @param int $value
* @return self
*/
public static function strictTypes(int $value): self
{
return new self(self::STRICT_TYPES, $value);
}
/**
* @param string $value
* @return self
*/
public static function encoding(string $value): self
{
return new self(self::ENCODING, $value);
}
public static function fromArray(array $config): self
{
$directive = key($config);
$value = $config[$directive];
if (! isset(self::ALLOWED[$directive])) {
throw new InvalidArgumentException(
sprintf(
'Declare directive must be one of: %s.',
implode(', ', array_keys(self::ALLOWED))
)
);
}
if (gettype($value) !== self::ALLOWED[$directive]) {
throw new InvalidArgumentException(
sprintf(
'Declare value invalid. Expected %s, got %s.',
self::ALLOWED[$directive],
gettype($value)
)
);
}
$method = str_replace('_', '', lcfirst(ucwords($directive, '_')));
return self::{$method}($value);
}
/**
* @return string
*/
public function getStatement(): string
{
$value = is_string($this->value) ? '\'' . $this->value . '\'' : $this->value;
return sprintf('declare(%s=%s);', $this->directive, $value);
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,13 @@ namespace Zend\Code\Generator;
use Traversable;
use function get_class;
use function gettype;
use function is_array;
use function is_object;
use function method_exists;
use function sprintf;
abstract class AbstractGenerator implements GeneratorInterface
{
/**
@@ -31,12 +38,12 @@ abstract class AbstractGenerator implements GeneratorInterface
/**
* @var string
*/
protected $sourceContent = null;
protected $sourceContent;
/**
* @param array $options
*/
public function __construct($options = array())
public function __construct($options = [])
{
if ($options) {
$this->setOptions($options);
@@ -104,11 +111,11 @@ abstract class AbstractGenerator implements GeneratorInterface
*/
public function setOptions($options)
{
if (!is_array($options) && !$options instanceof Traversable) {
if (! is_array($options) && ! $options instanceof Traversable) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects an array or Traversable object; received "%s"',
__METHOD__,
(is_object($options) ? get_class($options) : gettype($options))
is_object($options) ? get_class($options) : gettype($options)
));
}

View File

@@ -3,12 +3,16 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use function is_array;
use function is_string;
use function sprintf;
abstract class AbstractMemberGenerator extends AbstractGenerator
{
/**#@+
@@ -17,6 +21,7 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
const FLAG_ABSTRACT = 0x01;
const FLAG_FINAL = 0x02;
const FLAG_STATIC = 0x04;
const FLAG_INTERFACE = 0x08;
const FLAG_PUBLIC = 0x10;
const FLAG_PROTECTED = 0x20;
const FLAG_PRIVATE = 0x40;
@@ -31,14 +36,14 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
/**#@-*/
/**
* @var DocBlockGenerator
* @var DocBlockGenerator|null
*/
protected $docBlock = null;
protected $docBlock;
/**
* @var string
*/
protected $name = null;
protected $name;
/**
* @var int
@@ -90,7 +95,7 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
*/
public function setAbstract($isAbstract)
{
return (($isAbstract) ? $this->addFlag(self::FLAG_ABSTRACT) : $this->removeFlag(self::FLAG_ABSTRACT));
return $isAbstract ? $this->addFlag(self::FLAG_ABSTRACT) : $this->removeFlag(self::FLAG_ABSTRACT);
}
/**
@@ -101,13 +106,30 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
return (bool) ($this->flags & self::FLAG_ABSTRACT);
}
/**
* @param bool $isInterface
* @return AbstractMemberGenerator
*/
public function setInterface($isInterface)
{
return $isInterface ? $this->addFlag(self::FLAG_INTERFACE) : $this->removeFlag(self::FLAG_INTERFACE);
}
/**
* @return bool
*/
public function isInterface()
{
return (bool) ($this->flags & self::FLAG_INTERFACE);
}
/**
* @param bool $isFinal
* @return AbstractMemberGenerator
*/
public function setFinal($isFinal)
{
return (($isFinal) ? $this->addFlag(self::FLAG_FINAL) : $this->removeFlag(self::FLAG_FINAL));
return $isFinal ? $this->addFlag(self::FLAG_FINAL) : $this->removeFlag(self::FLAG_FINAL);
}
/**
@@ -124,7 +146,7 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
*/
public function setStatic($isStatic)
{
return (($isStatic) ? $this->addFlag(self::FLAG_STATIC) : $this->removeFlag(self::FLAG_STATIC));
return $isStatic ? $this->addFlag(self::FLAG_STATIC) : $this->removeFlag(self::FLAG_STATIC);
}
/**
@@ -165,9 +187,9 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
public function getVisibility()
{
switch (true) {
case ($this->flags & self::FLAG_PROTECTED):
case $this->flags & self::FLAG_PROTECTED:
return self::VISIBILITY_PROTECTED;
case ($this->flags & self::FLAG_PRIVATE):
case $this->flags & self::FLAG_PRIVATE:
return self::VISIBILITY_PRIVATE;
default:
return self::VISIBILITY_PUBLIC;
@@ -201,7 +223,7 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
{
if (is_string($docBlock)) {
$docBlock = new DocBlockGenerator($docBlock);
} elseif (!$docBlock instanceof DocBlockGenerator) {
} elseif (! $docBlock instanceof DocBlockGenerator) {
throw new Exception\InvalidArgumentException(sprintf(
'%s is expecting either a string, array or an instance of %s\DocBlockGenerator',
__METHOD__,
@@ -214,8 +236,13 @@ abstract class AbstractMemberGenerator extends AbstractGenerator
return $this;
}
public function removeDocBlock(): void
{
$this->docBlock = null;
}
/**
* @return DocBlockGenerator
* @return DocBlockGenerator|null
*/
public function getDocBlock()
{

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -14,7 +14,7 @@ class BodyGenerator extends AbstractGenerator
/**
* @var string
*/
protected $content = null;
protected $content;
/**
* @param string $content

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,9 +11,33 @@ namespace Zend\Code\Generator;
use Zend\Code\Reflection\ClassReflection;
class ClassGenerator extends AbstractGenerator
use function array_diff;
use function array_map;
use function array_pop;
use function array_search;
use function array_values;
use function array_walk;
use function explode;
use function get_class;
use function gettype;
use function implode;
use function in_array;
use function is_array;
use function is_scalar;
use function is_string;
use function ltrim;
use function sprintf;
use function str_replace;
use function strpos;
use function strrpos;
use function strstr;
use function strtolower;
use function substr;
class ClassGenerator extends AbstractGenerator implements TraitUsageInterface
{
const OBJECT_TYPE = "class";
const OBJECT_TYPE = 'class';
const IMPLEMENTS_KEYWORD = 'implements';
const FLAG_ABSTRACT = 0x01;
const FLAG_FINAL = 0x02;
@@ -21,22 +45,22 @@ class ClassGenerator extends AbstractGenerator
/**
* @var FileGenerator
*/
protected $containingFileGenerator = null;
protected $containingFileGenerator;
/**
* @var string
*/
protected $namespaceName = null;
protected $namespaceName;
/**
* @var DocBlockGenerator
*/
protected $docBlock = null;
protected $docBlock;
/**
* @var string
*/
protected $name = null;
protected $name;
/**
* @var bool
@@ -46,27 +70,27 @@ class ClassGenerator extends AbstractGenerator
/**
* @var string
*/
protected $extendedClass = null;
protected $extendedClass;
/**
* @var array Array of string names
*/
protected $implementedInterfaces = array();
protected $implementedInterfaces = [];
/**
* @var PropertyGenerator[] Array of properties
*/
protected $properties = array();
protected $properties = [];
/**
* @var PropertyGenerator[] Array of constants
*/
protected $constants = array();
protected $constants = [];
/**
* @var MethodGenerator[] Array of methods
*/
protected $methods = array();
protected $methods = [];
/**
* @var TraitUsageGenerator Object to encapsulate trait usage logic
@@ -77,7 +101,7 @@ class ClassGenerator extends AbstractGenerator
* Build a Code Generation Php Object from a Class Reflection
*
* @param ClassReflection $classReflection
* @return ClassGenerator
* @return self
*/
public static function fromReflection(ClassReflection $classReflection)
{
@@ -107,7 +131,7 @@ class ClassGenerator extends AbstractGenerator
$interfaces = array_diff($interfaces, $parentClass->getInterfaces());
}
$interfaceNames = array();
$interfaceNames = [];
foreach ($interfaces as $interface) {
/* @var \Zend\Code\Reflection\ClassReflection $interface */
$interfaceNames[] = $interface->getName();
@@ -115,7 +139,7 @@ class ClassGenerator extends AbstractGenerator
$cg->setImplementedInterfaces($interfaceNames);
$properties = array();
$properties = [];
foreach ($classReflection->getProperties() as $reflectionProperty) {
if ($reflectionProperty->getDeclaringClass()->getName() == $classReflection->getName()) {
@@ -125,21 +149,21 @@ class ClassGenerator extends AbstractGenerator
$cg->addProperties($properties);
$constants = array();
$constants = [];
foreach ($classReflection->getConstants() as $name => $value) {
$constants[] = array(
$constants[] = [
'name' => $name,
'value' => $value
);
'value' => $value,
];
}
$cg->addConstants($constants);
$methods = array();
$methods = [];
foreach ($classReflection->getMethods() as $reflectionMethod) {
$className = ($cg->getNamespaceName()) ? $cg->getNamespaceName() . "\\" . $cg->getName() : $cg->getName();
$className = $cg->getNamespaceName() ? $cg->getNamespaceName() . '\\' . $cg->getName() : $cg->getName();
if ($reflectionMethod->getDeclaringClass()->getName() == $className) {
$methods[] = MethodGenerator::fromReflection($reflectionMethod);
@@ -166,11 +190,11 @@ class ClassGenerator extends AbstractGenerator
*
* @throws Exception\InvalidArgumentException
* @param array $array
* @return ClassGenerator
* @return self
*/
public static function fromArray(array $array)
{
if (!isset($array['name'])) {
if (! isset($array['name'])) {
throw new Exception\InvalidArgumentException(
'Class generator requires that a name is provided for this object'
);
@@ -179,7 +203,7 @@ class ClassGenerator extends AbstractGenerator
$cg = new static($array['name']);
foreach ($array as $name => $value) {
// normalize key
switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'containingfile':
$cg->setContainingFileGenerator($value);
break;
@@ -187,7 +211,7 @@ class ClassGenerator extends AbstractGenerator
$cg->setNamespaceName($value);
break;
case 'docblock':
$docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
$docBlock = $value instanceof DocBlockGenerator ? $value : DocBlockGenerator::fromArray($value);
$cg->setDocBlock($docBlock);
break;
case 'flags':
@@ -226,9 +250,9 @@ class ClassGenerator extends AbstractGenerator
$namespaceName = null,
$flags = null,
$extends = null,
$interfaces = array(),
$properties = array(),
$methods = array(),
$interfaces = [],
$properties = [],
$methods = [],
$docBlock = null
) {
$this->traitUsageGenerator = new TraitUsageGenerator($this);
@@ -242,7 +266,7 @@ class ClassGenerator extends AbstractGenerator
if ($flags !== null) {
$this->setFlags($flags);
}
if ($properties !== array()) {
if ($properties !== []) {
$this->addProperties($properties);
}
if ($extends !== null) {
@@ -251,7 +275,7 @@ class ClassGenerator extends AbstractGenerator
if (is_array($interfaces)) {
$this->setImplementedInterfaces($interfaces);
}
if ($methods !== array()) {
if ($methods !== []) {
$this->addMethods($methods);
}
if ($docBlock !== null) {
@@ -261,11 +285,11 @@ class ClassGenerator extends AbstractGenerator
/**
* @param string $name
* @return ClassGenerator
* @return self
*/
public function setName($name)
{
if (strstr($name, '\\')) {
if (false !== strpos($name, '\\')) {
$namespace = substr($name, 0, strrpos($name, '\\'));
$name = substr($name, strrpos($name, '\\') + 1);
$this->setNamespaceName($namespace);
@@ -285,7 +309,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param string $namespaceName
* @return ClassGenerator
* @return self
*/
public function setNamespaceName($namespaceName)
{
@@ -303,7 +327,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param FileGenerator $fileGenerator
* @return ClassGenerator
* @return self
*/
public function setContainingFileGenerator(FileGenerator $fileGenerator)
{
@@ -321,7 +345,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param DocBlockGenerator $docBlock
* @return ClassGenerator
* @return self
*/
public function setDocBlock(DocBlockGenerator $docBlock)
{
@@ -339,7 +363,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param array|string $flags
* @return ClassGenerator
* @return self
*/
public function setFlags($flags)
{
@@ -358,7 +382,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param string $flag
* @return ClassGenerator
* @return self
*/
public function addFlag($flag)
{
@@ -368,7 +392,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param string $flag
* @return ClassGenerator
* @return self
*/
public function removeFlag($flag)
{
@@ -378,11 +402,11 @@ class ClassGenerator extends AbstractGenerator
/**
* @param bool $isAbstract
* @return ClassGenerator
* @return self
*/
public function setAbstract($isAbstract)
{
return (($isAbstract) ? $this->addFlag(self::FLAG_ABSTRACT) : $this->removeFlag(self::FLAG_ABSTRACT));
return $isAbstract ? $this->addFlag(self::FLAG_ABSTRACT) : $this->removeFlag(self::FLAG_ABSTRACT);
}
/**
@@ -395,11 +419,11 @@ class ClassGenerator extends AbstractGenerator
/**
* @param bool $isFinal
* @return ClassGenerator
* @return self
*/
public function setFinal($isFinal)
{
return (($isFinal) ? $this->addFlag(self::FLAG_FINAL) : $this->removeFlag(self::FLAG_FINAL));
return $isFinal ? $this->addFlag(self::FLAG_FINAL) : $this->removeFlag(self::FLAG_FINAL);
}
/**
@@ -407,12 +431,12 @@ class ClassGenerator extends AbstractGenerator
*/
public function isFinal()
{
return ($this->flags & self::FLAG_FINAL);
return $this->flags & self::FLAG_FINAL;
}
/**
* @param string $extendedClass
* @return ClassGenerator
* @return self
*/
public function setExtendedClass($extendedClass)
{
@@ -428,12 +452,33 @@ class ClassGenerator extends AbstractGenerator
return $this->extendedClass;
}
/**
* @return bool
*/
public function hasExtentedClass()
{
return ! empty($this->extendedClass);
}
/**
* @return self
*/
public function removeExtentedClass()
{
$this->setExtendedClass(null);
return $this;
}
/**
* @param array $implementedInterfaces
* @return ClassGenerator
* @return self
*/
public function setImplementedInterfaces(array $implementedInterfaces)
{
array_map(function ($implementedInterface) {
return (string) TypeGenerator::fromTypeString($implementedInterface);
}, $implementedInterfaces);
$this->implementedInterfaces = $implementedInterfaces;
return $this;
}
@@ -446,9 +491,29 @@ class ClassGenerator extends AbstractGenerator
return $this->implementedInterfaces;
}
/**
* @param string $implementedInterface
* @return bool
*/
public function hasImplementedInterface($implementedInterface)
{
$implementedInterface = (string) TypeGenerator::fromTypeString($implementedInterface);
return in_array($implementedInterface, $this->implementedInterfaces);
}
/**
* @param string $implementedInterface
* @return self
*/
public function removeImplementedInterface($implementedInterface)
{
$implementedInterface = (string) TypeGenerator::fromTypeString($implementedInterface);
unset($this->implementedInterfaces[array_search($implementedInterface, $this->implementedInterfaces)]);
return $this;
}
/**
* @param string $constantName
*
* @return PropertyGenerator|false
*/
public function getConstant($constantName)
@@ -468,6 +533,17 @@ class ClassGenerator extends AbstractGenerator
return $this->constants;
}
/**
* @param string $constantName
* @return self
*/
public function removeConstant($constantName)
{
unset($this->constants[$constantName]);
return $this;
}
/**
* @param string $constantName
* @return bool
@@ -482,7 +558,7 @@ class ClassGenerator extends AbstractGenerator
*
* @param PropertyGenerator $constant
* @throws Exception\InvalidArgumentException
* @return ClassGenerator
* @return self
*/
public function addConstantFromGenerator(PropertyGenerator $constant)
{
@@ -510,34 +586,33 @@ class ClassGenerator extends AbstractGenerator
/**
* Add Constant
*
* @param string $name
* @param string $value
* @param string $name Non-empty string
* @param string|int|null|float|array $value Scalar
*
* @throws Exception\InvalidArgumentException
* @return ClassGenerator
*
* @return self
*/
public function addConstant($name, $value)
{
if (!is_string($name)) {
if (empty($name) || ! is_string($name)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects string for name',
__METHOD__
));
}
if (empty($value) || !is_string($value)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects value for constant, value must be a string',
__METHOD__
));
}
$this->validateConstantValue($value);
return $this->addConstantFromGenerator(new PropertyGenerator($name, $value, PropertyGenerator::FLAG_CONSTANT));
return $this->addConstantFromGenerator(
new PropertyGenerator($name, new PropertyValueGenerator($value), PropertyGenerator::FLAG_CONSTANT)
);
}
/**
* @param PropertyGenerator[]|array[] $constants
*
* @return ClassGenerator
* @return self
*/
public function addConstants(array $constants)
{
@@ -546,7 +621,7 @@ class ClassGenerator extends AbstractGenerator
$this->addPropertyFromGenerator($constant);
} else {
if (is_array($constant)) {
call_user_func_array(array($this, 'addConstant'), $constant);
$this->addConstant(...array_values($constant));
}
}
}
@@ -556,7 +631,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param array $properties
* @return ClassGenerator
* @return self
*/
public function addProperties(array $properties)
{
@@ -567,7 +642,7 @@ class ClassGenerator extends AbstractGenerator
if (is_string($property)) {
$this->addProperty($property);
} elseif (is_array($property)) {
call_user_func_array(array($this, 'addProperty'), $property);
$this->addProperty(...array_values($property));
}
}
}
@@ -582,11 +657,11 @@ class ClassGenerator extends AbstractGenerator
* @param string|array $defaultValue
* @param int $flags
* @throws Exception\InvalidArgumentException
* @return ClassGenerator
* @return self
*/
public function addProperty($name, $defaultValue = null, $flags = PropertyGenerator::FLAG_PUBLIC)
{
if (!is_string($name)) {
if (! is_string($name)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s::%s expects string for name',
get_class($this),
@@ -608,7 +683,7 @@ class ClassGenerator extends AbstractGenerator
*
* @param PropertyGenerator $property
* @throws Exception\InvalidArgumentException
* @return ClassGenerator
* @return self
*/
public function addPropertyFromGenerator(PropertyGenerator $property)
{
@@ -659,7 +734,7 @@ class ClassGenerator extends AbstractGenerator
*
* @param string $use
* @param string|null $useAlias
* @return ClassGenerator
* @return self
*/
public function addUse($use, $useAlias = null)
{
@@ -667,6 +742,44 @@ class ClassGenerator extends AbstractGenerator
return $this;
}
/**
* @param string $use
* @return bool
*/
public function hasUse($use)
{
return $this->traitUsageGenerator->hasUse($use);
}
/**
* @param string $use
* @return self
*/
public function removeUse($use)
{
$this->traitUsageGenerator->removeUse($use);
return $this;
}
/**
* @param string $use
* @return bool
*/
public function hasUseAlias($use)
{
return $this->traitUsageGenerator->hasUseAlias($use);
}
/**
* @param string $use
* @return self
*/
public function removeUseAlias($use)
{
$this->traitUsageGenerator->removeUseAlias($use);
return $this;
}
/**
* Returns the "use" classes
*
@@ -677,6 +790,17 @@ class ClassGenerator extends AbstractGenerator
return $this->traitUsageGenerator->getUses();
}
/**
* @param string $propertyName
* @return self
*/
public function removeProperty($propertyName)
{
unset($this->properties[$propertyName]);
return $this;
}
/**
* @param string $propertyName
* @return bool
@@ -688,7 +812,7 @@ class ClassGenerator extends AbstractGenerator
/**
* @param array $methods
* @return ClassGenerator
* @return self
*/
public function addMethods(array $methods)
{
@@ -699,7 +823,7 @@ class ClassGenerator extends AbstractGenerator
if (is_string($method)) {
$this->addMethod($method);
} elseif (is_array($method)) {
call_user_func_array(array($this, 'addMethod'), $method);
$this->addMethod(...array_values($method));
}
}
}
@@ -716,16 +840,16 @@ class ClassGenerator extends AbstractGenerator
* @param string $body
* @param string $docBlock
* @throws Exception\InvalidArgumentException
* @return ClassGenerator
* @return self
*/
public function addMethod(
$name = null,
array $parameters = array(),
$name,
array $parameters = [],
$flags = MethodGenerator::FLAG_PUBLIC,
$body = null,
$docBlock = null
) {
if (!is_string($name)) {
if (! is_string($name)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s::%s expects string for name',
get_class($this),
@@ -741,7 +865,7 @@ class ClassGenerator extends AbstractGenerator
*
* @param MethodGenerator $method
* @throws Exception\InvalidArgumentException
* @return ClassGenerator
* @return self
*/
public function addMethodFromGenerator(MethodGenerator $method)
{
@@ -777,13 +901,11 @@ class ClassGenerator extends AbstractGenerator
/**
* @param string $methodName
* @return ClassGenerator
* @return self
*/
public function removeMethod($methodName)
{
if ($this->hasMethod($methodName)) {
unset($this->methods[strtolower($methodName)]);
}
unset($this->methods[strtolower($methodName)]);
return $this;
}
@@ -798,7 +920,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addTrait($trait)
{
@@ -807,7 +929,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addTraits(array $traits)
{
@@ -816,7 +938,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function hasTrait($traitName)
{
@@ -824,7 +946,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function getTraits()
{
@@ -832,7 +954,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function removeTrait($traitName)
{
@@ -840,7 +962,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addTraitAlias($method, $alias, $visibility = null)
{
@@ -849,7 +971,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function getTraitAliases()
{
@@ -857,7 +979,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addTraitOverride($method, $traitsToReplace)
{
@@ -866,7 +988,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function removeTraitOverride($method, $overridesToRemove = null)
{
@@ -876,7 +998,7 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function getTraitOverrides()
{
@@ -908,13 +1030,13 @@ class ClassGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\GeneratorInterface
* @inheritDoc
*/
public function generate()
{
if (!$this->isSourceDirty()) {
if (! $this->isSourceDirty()) {
$output = $this->getSourceContent();
if (!empty($output)) {
if (! empty($output)) {
return $output;
}
}
@@ -928,7 +1050,7 @@ class ClassGenerator extends AbstractGenerator
$uses = $this->getUses();
if (!empty($uses)) {
if (! empty($uses)) {
foreach ($uses as $use) {
$output .= 'use ' . $use . ';' . self::LINE_FEED;
}
@@ -949,14 +1071,15 @@ class ClassGenerator extends AbstractGenerator
$output .= static::OBJECT_TYPE . ' ' . $this->getName();
if (!empty($this->extendedClass)) {
$output .= ' extends ' . $this->extendedClass;
if (! empty($this->extendedClass)) {
$output .= ' extends ' . $this->generateShortOrCompleteClassname($this->extendedClass);
}
$implemented = $this->getImplementedInterfaces();
if (!empty($implemented)) {
$output .= ' implements ' . implode(', ', $implemented);
if (! empty($implemented)) {
$implemented = array_map([$this, 'generateShortOrCompleteClassname'], $implemented);
$output .= ' ' . static::IMPLEMENTS_KEYWORD . ' ' . implode(', ', $implemented);
}
$output .= self::LINE_FEED . '{' . self::LINE_FEED . self::LINE_FEED;
@@ -984,4 +1107,63 @@ class ClassGenerator extends AbstractGenerator
return $output;
}
/**
* @param mixed $value
*
* @return void
*
* @throws Exception\InvalidArgumentException
*/
private function validateConstantValue($value)
{
if (null === $value || is_scalar($value)) {
return;
}
if (is_array($value)) {
array_walk($value, [$this, 'validateConstantValue']);
return;
}
throw new Exception\InvalidArgumentException(sprintf(
'Expected value for constant, value must be a "scalar" or "null", "%s" found',
gettype($value)
));
}
/**
* @param string $fqnClassName
*
* @return string
*/
private function generateShortOrCompleteClassname($fqnClassName)
{
$fqnClassName = ltrim($fqnClassName, '\\');
$parts = explode('\\', $fqnClassName);
$className = array_pop($parts);
$classNamespace = implode('\\', $parts);
$currentNamespace = (string) $this->getNamespaceName();
if ($this->hasUseAlias($fqnClassName)) {
return $this->traitUsageGenerator->getUseAlias($fqnClassName);
}
if ($this->hasUseAlias($classNamespace)) {
$namespaceAlias = $this->traitUsageGenerator->getUseAlias($classNamespace);
return $namespaceAlias . '\\' . $className;
}
if ($this->traitUsageGenerator->isUseAlias($fqnClassName)) {
return $fqnClassName;
}
if ($this->traitUsageGenerator->isUseAlias($classNamespace)) {
return $fqnClassName;
}
if ($classNamespace === $currentNamespace || in_array($fqnClassName, $this->getUses())) {
return $className;
}
return '\\' . $fqnClassName;
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,9 +11,14 @@ namespace Zend\Code\Generator\DocBlock\Tag;
use Zend\Code\Generator\AbstractGenerator;
use function explode;
use function implode;
use function is_string;
/**
* This abstract class can be used as parent for all tags
* that use a type part in their content.
*
* @see http://www.phpdoc.org/docs/latest/for-users/phpdoc/types.html
*/
abstract class AbstractTypeableTag extends AbstractGenerator
@@ -21,31 +26,31 @@ abstract class AbstractTypeableTag extends AbstractGenerator
/**
* @var string
*/
protected $description = null;
protected $description;
/**
* @var array
*/
protected $types = array();
protected $types = [];
/**
* @param array $types
* @param string $description
* @param string|string[] $types
* @param string $description
*/
public function __construct($types = array(), $description = null)
public function __construct($types = [], $description = null)
{
if (!empty($types)) {
if (! empty($types)) {
$this->setTypes($types);
}
if (!empty($description)) {
if (! empty($description)) {
$this->setDescription($description);
}
}
/**
* @param string $description
* @return ReturnTag
* @return AbstractTypeableTag
*/
public function setDescription($description)
{
@@ -66,7 +71,7 @@ abstract class AbstractTypeableTag extends AbstractGenerator
* e.g. array('int', 'null') or "int|null"
*
* @param array|string $types
* @return ReturnTag
* @return AbstractTypeableTag
*/
public function setTypes($types)
{

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -18,12 +18,12 @@ class AuthorTag extends AbstractGenerator implements TagInterface
/**
* @var string
*/
protected $authorName = null;
protected $authorName;
/**
* @var string
*/
protected $authorEmail = null;
protected $authorEmail;
/**
* @param string $authorName
@@ -31,18 +31,18 @@ class AuthorTag extends AbstractGenerator implements TagInterface
*/
public function __construct($authorName = null, $authorEmail = null)
{
if (!empty($authorName)) {
if (! empty($authorName)) {
$this->setAuthorName($authorName);
}
if (!empty($authorEmail)) {
if (! empty($authorEmail)) {
$this->setAuthorEmail($authorEmail);
}
}
/**
* @param ReflectionTagInterface $reflectionTag
* @return ReturnTag
* @return AuthorTag
* @deprecated Deprecated in 2.3. Use TagManager::createTagFromReflection() instead
*/
public static function fromReflection(ReflectionTagInterface $reflectionTag)
@@ -102,8 +102,8 @@ class AuthorTag extends AbstractGenerator implements TagInterface
public function generate()
{
$output = '@author'
. ((!empty($this->authorName)) ? ' ' . $this->authorName : '')
. ((!empty($this->authorEmail)) ? ' <' . $this->authorEmail . '>' : '');
. (! empty($this->authorName) ? ' ' . $this->authorName : '')
. (! empty($this->authorEmail) ? ' <' . $this->authorEmail . '>' : '');
return $output;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -12,17 +12,19 @@ namespace Zend\Code\Generator\DocBlock\Tag;
use Zend\Code\Generator\AbstractGenerator;
use Zend\Code\Generic\Prototype\PrototypeGenericInterface;
use function ltrim;
class GenericTag extends AbstractGenerator implements TagInterface, PrototypeGenericInterface
{
/**
* @var string
*/
protected $name = null;
protected $name;
/**
* @var string
*/
protected $content = null;
protected $content;
/**
* @param string $name
@@ -30,11 +32,11 @@ class GenericTag extends AbstractGenerator implements TagInterface, PrototypeGen
*/
public function __construct($name = null, $content = null)
{
if (!empty($name)) {
if (! empty($name)) {
$this->setName($name);
}
if (!empty($content)) {
if (! empty($content)) {
$this->setContent($content);
}
}
@@ -81,7 +83,7 @@ class GenericTag extends AbstractGenerator implements TagInterface, PrototypeGen
public function generate()
{
$output = '@' . $this->name
. ((!empty($this->content)) ? ' ' . $this->content : '');
. (! empty($this->content) ? ' ' . $this->content : '');
return $output;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -18,12 +18,12 @@ class LicenseTag extends AbstractGenerator implements TagInterface
/**
* @var string
*/
protected $url = null;
protected $url;
/**
* @var string
*/
protected $licenseName = null;
protected $licenseName;
/**
* @param string $url
@@ -31,11 +31,11 @@ class LicenseTag extends AbstractGenerator implements TagInterface
*/
public function __construct($url = null, $licenseName = null)
{
if (!empty($url)) {
if (! empty($url)) {
$this->setUrl($url);
}
if (!empty($licenseName)) {
if (! empty($licenseName)) {
$this->setLicenseName($licenseName);
}
}
@@ -102,8 +102,8 @@ class LicenseTag extends AbstractGenerator implements TagInterface
public function generate()
{
$output = '@license'
. ((!empty($this->url)) ? ' ' . $this->url : '')
. ((!empty($this->licenseName)) ? ' ' . $this->licenseName : '');
. (! empty($this->url) ? ' ' . $this->url : '')
. (! empty($this->licenseName) ? ' ' . $this->licenseName : '');
return $output;
}

View File

@@ -3,18 +3,20 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator\DocBlock\Tag;
use function rtrim;
class MethodTag extends AbstractTypeableTag implements TagInterface
{
/**
* @var string
*/
protected $methodName = null;
protected $methodName;
/**
* @var bool
@@ -27,9 +29,9 @@ class MethodTag extends AbstractTypeableTag implements TagInterface
* @param string $description
* @param bool $isStatic
*/
public function __construct($methodName = null, $types = array(), $description = null, $isStatic = false)
public function __construct($methodName = null, $types = [], $description = null, $isStatic = false)
{
if (!empty($methodName)) {
if (! empty($methodName)) {
$this->setMethodName($methodName);
}
@@ -47,7 +49,7 @@ class MethodTag extends AbstractTypeableTag implements TagInterface
}
/**
* @param boolean $isStatic
* @param bool $isStatic
* @return MethodTag
*/
public function setIsStatic($isStatic)
@@ -57,7 +59,7 @@ class MethodTag extends AbstractTypeableTag implements TagInterface
}
/**
* @return boolean
* @return bool
*/
public function isStatic()
{
@@ -88,10 +90,10 @@ class MethodTag extends AbstractTypeableTag implements TagInterface
public function generate()
{
$output = '@method'
. (($this->isStatic) ? ' static' : '')
. ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
. ((!empty($this->methodName)) ? ' ' . $this->methodName . '()' : '')
. ((!empty($this->description)) ? ' ' . $this->description : '');
. ($this->isStatic ? ' static' : '')
. (! empty($this->types) ? ' ' . $this->getTypesAsString() : '')
. (! empty($this->methodName) ? ' ' . $this->methodName . '()' : '')
. (! empty($this->description) ? ' ' . $this->description : '');
return $output;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -12,21 +12,23 @@ namespace Zend\Code\Generator\DocBlock\Tag;
use Zend\Code\Generator\DocBlock\TagManager;
use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
use function ltrim;
class ParamTag extends AbstractTypeableTag implements TagInterface
{
/**
* @var string
*/
protected $variableName = null;
protected $variableName;
/**
* @param string $variableName
* @param array $types
* @param string $description
*/
public function __construct($variableName = null, $types = array(), $description = null)
public function __construct($variableName = null, $types = [], $description = null)
{
if (!empty($variableName)) {
if (! empty($variableName)) {
$this->setVariableName($variableName);
}
@@ -35,7 +37,7 @@ class ParamTag extends AbstractTypeableTag implements TagInterface
/**
* @param ReflectionTagInterface $reflectionTag
* @return ReturnTag
* @return ParamTag
* @deprecated Deprecated in 2.3. Use TagManager::createTagFromReflection() instead
*/
public static function fromReflection(ReflectionTagInterface $reflectionTag)
@@ -73,7 +75,7 @@ class ParamTag extends AbstractTypeableTag implements TagInterface
/**
* @param string $datatype
* @return ReturnTag
* @return ParamTag
* @deprecated Deprecated in 2.3. Use setTypes() instead
*/
public function setDatatype($datatype)
@@ -115,9 +117,9 @@ class ParamTag extends AbstractTypeableTag implements TagInterface
public function generate()
{
$output = '@param'
. ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
. ((!empty($this->variableName)) ? ' $' . $this->variableName : '')
. ((!empty($this->description)) ? ' ' . $this->description : '');
. (! empty($this->types) ? ' ' . $this->getTypesAsString() : '')
. (! empty($this->variableName) ? ' $' . $this->variableName : '')
. (! empty($this->description) ? ' ' . $this->description : '');
return $output;
}

View File

@@ -3,27 +3,29 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator\DocBlock\Tag;
use function ltrim;
class PropertyTag extends AbstractTypeableTag implements TagInterface
{
/**
* @var string
*/
protected $propertyName = null;
protected $propertyName;
/**
* @param string $propertyName
* @param array $types
* @param string $description
*/
public function __construct($propertyName = null, $types = array(), $description = null)
public function __construct($propertyName = null, $types = [], $description = null)
{
if (!empty($propertyName)) {
if (! empty($propertyName)) {
$this->setPropertyName($propertyName);
}
@@ -62,9 +64,9 @@ class PropertyTag extends AbstractTypeableTag implements TagInterface
public function generate()
{
$output = '@property'
. ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
. ((!empty($this->propertyName)) ? ' $' . $this->propertyName : '')
. ((!empty($this->description)) ? ' ' . $this->description : '');
. (! empty($this->types) ? ' ' . $this->getTypesAsString() : '')
. (! empty($this->propertyName) ? ' $' . $this->propertyName : '')
. (! empty($this->description) ? ' ' . $this->description : '');
return $output;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -60,7 +60,7 @@ class ReturnTag extends AbstractTypeableTag implements TagInterface
{
$output = '@return '
. $this->getTypesAsString()
. ((!empty($this->description)) ? ' ' . $this->description : '');
. (! empty($this->description) ? ' ' . $this->description : '');
return $output;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -25,8 +25,8 @@ class ThrowsTag extends AbstractTypeableTag implements TagInterface
public function generate()
{
$output = '@throws'
. ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
. ((!empty($this->description)) ? ' ' . $this->description : '');
. (! empty($this->types) ? ' ' . $this->getTypesAsString() : '')
. (! empty($this->description) ? ' ' . $this->description : '');
return $output;
}

View File

@@ -0,0 +1,68 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator\DocBlock\Tag;
class VarTag extends AbstractTypeableTag implements TagInterface
{
/**
* @var string|null
*/
private $variableName;
/**
* @param string|null $variableName
* @param string|string[] $types
* @param string|null $description
*/
public function __construct(?string $variableName = null, $types = [], ?string $description = null)
{
if (null !== $variableName) {
$this->variableName = ltrim($variableName, '$');
}
parent::__construct($types, $description);
}
/**
* {@inheritDoc}
*/
public function getName() : string
{
return 'var';
}
/**
* @internal this code is only public for compatibility with the
* @see \Zend\Code\Generator\DocBlock\TagManager, which
* uses setters
*/
public function setVariableName(?string $variableName) : void
{
if (null !== $variableName) {
$this->variableName = ltrim($variableName, '$');
}
}
public function getVariableName() : ?string
{
return $this->variableName;
}
/**
* {@inheritDoc}
*/
public function generate() : string
{
return '@var'
. ((! empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
. (null !== $this->variableName ? ' $' . $this->variableName : '')
. ((! empty($this->description)) ? ' ' . $this->description : '');
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,6 +13,11 @@ use Zend\Code\Generator\DocBlock\Tag\TagInterface;
use Zend\Code\Generic\Prototype\PrototypeClassFactory;
use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
use function method_exists;
use function substr;
use function strpos;
use function ucfirst;
/**
* This class is used in DocBlockGenerator and creates the needed
* Tag classes depending on the tag. So for example an @author tag
@@ -35,6 +40,7 @@ class TagManager extends PrototypeClassFactory
$this->addPrototype(new Tag\AuthorTag());
$this->addPrototype(new Tag\LicenseTag());
$this->addPrototype(new Tag\ThrowsTag());
$this->addPrototype(new Tag\VarTag());
$this->setGenericPrototype(new Tag\GenericTag());
}
@@ -52,12 +58,12 @@ class TagManager extends PrototypeClassFactory
// transport any properties via accessors and mutators from reflection to codegen object
$reflectionClass = new \ReflectionClass($reflectionTag);
foreach ($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
if (substr($method->getName(), 0, 3) == 'get') {
if (0 === strpos($method->getName(), 'get')) {
$propertyName = substr($method->getName(), 3);
if (method_exists($newTag, 'set' . $propertyName)) {
$newTag->{'set' . $propertyName}($reflectionTag->{'get' . $propertyName}());
}
} elseif (substr($method->getName(), 0, 2) == 'is') {
} elseif (0 === strpos($method->getName(), 'is')) {
$propertyName = ucfirst($method->getName());
if (method_exists($newTag, 'set' . $propertyName)) {
$newTag->{'set' . $propertyName}($reflectionTag->{$method->getName()}());

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -14,22 +14,30 @@ use Zend\Code\Generator\DocBlock\Tag\TagInterface;
use Zend\Code\Generator\DocBlock\TagManager;
use Zend\Code\Reflection\DocBlockReflection;
use function explode;
use function is_array;
use function sprintf;
use function str_replace;
use function strtolower;
use function trim;
use function wordwrap;
class DocBlockGenerator extends AbstractGenerator
{
/**
* @var string
*/
protected $shortDescription = null;
protected $shortDescription;
/**
* @var string
*/
protected $longDescription = null;
protected $longDescription;
/**
* @var array
*/
protected $tags = array();
protected $tags = [];
/**
* @var string
@@ -41,6 +49,9 @@ class DocBlockGenerator extends AbstractGenerator
*/
protected $wordwrap = true;
/**
* @var TagManager
*/
protected static $tagManager;
/**
@@ -83,7 +94,7 @@ class DocBlockGenerator extends AbstractGenerator
foreach ($array as $name => $value) {
// normalize key
switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'shortdescription':
$docBlock->setShortDescription($value);
break;
@@ -99,9 +110,12 @@ class DocBlockGenerator extends AbstractGenerator
return $docBlock;
}
/**
* @return TagManager
*/
protected static function getTagManager()
{
if (!isset(static::$tagManager)) {
if (! isset(static::$tagManager)) {
static::$tagManager = new TagManager();
static::$tagManager->initializeDefaultTags();
}
@@ -113,7 +127,7 @@ class DocBlockGenerator extends AbstractGenerator
* @param string $longDescription
* @param array $tags
*/
public function __construct($shortDescription = null, $longDescription = null, array $tags = array())
public function __construct($shortDescription = null, $longDescription = null, array $tags = [])
{
if ($shortDescription) {
$this->setShortDescription($shortDescription);
@@ -183,11 +197,11 @@ class DocBlockGenerator extends AbstractGenerator
public function setTag($tag)
{
if (is_array($tag)) {
// use deprecated Tag class for backward compatiblity to old array-keys
// use deprecated Tag class for backward compatibility to old array-keys
$genericTag = new Tag();
$genericTag->setOptions($tag);
$tag = $genericTag;
} elseif (!$tag instanceof TagInterface) {
} elseif (! $tag instanceof TagInterface) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects either an array of method options or an instance of %s\DocBlock\Tag\TagInterface',
__METHOD__,
@@ -230,7 +244,7 @@ class DocBlockGenerator extends AbstractGenerator
*/
public function generate()
{
if (!$this->isSourceDirty()) {
if (! $this->isSourceDirty()) {
return $this->docCommentize(trim($this->getSourceContent()));
}
@@ -263,7 +277,7 @@ class DocBlockGenerator extends AbstractGenerator
foreach ($lines as $line) {
$output .= $indent . ' *';
if ($line) {
$output .= " $line";
$output .= ' ' . $line;
}
$output .= self::LINE_FEED;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,51 +3,81 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use Zend\Code\DeclareStatement;
use Zend\Code\Exception\InvalidArgumentException;
use Zend\Code\Reflection\Exception as ReflectionException;
use Zend\Code\Reflection\FileReflection;
use function array_key_exists;
use function array_merge;
use function count;
use function current;
use function dirname;
use function file_put_contents;
use function in_array;
use function is_array;
use function is_string;
use function is_writable;
use function method_exists;
use function preg_match;
use function preg_replace;
use function property_exists;
use function reset;
use function sprintf;
use function str_repeat;
use function str_replace;
use function strrpos;
use function strtolower;
use function substr;
use function token_get_all;
class FileGenerator extends AbstractGenerator
{
/**
* @var string
*/
protected $filename = null;
protected $filename;
/**
* @var DocBlockGenerator
*/
protected $docBlock = null;
protected $docBlock;
/**
* @var array
*/
protected $requiredFiles = array();
protected $requiredFiles = [];
/**
* @var string
*/
protected $namespace = null;
protected $namespace;
/**
* @var array
*/
protected $uses = array();
protected $uses = [];
/**
* @var array
*/
protected $classes = array();
protected $classes = [];
/**
* @var string
*/
protected $body = null;
protected $body;
/**
* @var DeclareStatement[]
*/
protected $declares = [];
/**
* Passes $options to {@link setOptions()}.
@@ -113,7 +143,7 @@ class FileGenerator extends AbstractGenerator
$file->setUses($uses);
}
if (($fileReflection->getDocComment() != '')) {
if ($fileReflection->getDocComment() != '') {
$docBlock = $fileReflection->getDocBlock();
$file->setDocBlock(DocBlockGenerator::fromReflection($docBlock));
}
@@ -127,18 +157,27 @@ class FileGenerator extends AbstractGenerator
*/
public static function fromArray(array $values)
{
$fileGenerator = new static;
$fileGenerator = new static();
foreach ($values as $name => $value) {
switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'filename':
$fileGenerator->setFilename($value);
continue;
break;
case 'class':
$fileGenerator->setClass(($value instanceof ClassGenerator) ? $value : ClassGenerator::fromArray($value));
continue;
$fileGenerator->setClass(
$value instanceof ClassGenerator
? $value
: ClassGenerator::fromArray($value)
);
break;
case 'requiredfiles':
$fileGenerator->setRequiredFiles($value);
continue;
break;
case 'declares':
$fileGenerator->setDeclares(array_map(static function ($directive, $value) {
return DeclareStatement::fromArray([$directive => $value]);
}, array_keys($value), $value));
break;
default:
if (property_exists($fileGenerator, $name)) {
$fileGenerator->{$name} = $value;
@@ -159,12 +198,12 @@ class FileGenerator extends AbstractGenerator
public function setDocBlock($docBlock)
{
if (is_string($docBlock)) {
$docBlock = array('shortDescription' => $docBlock);
$docBlock = ['shortDescription' => $docBlock];
}
if (is_array($docBlock)) {
$docBlock = new DocBlockGenerator($docBlock);
} elseif (!$docBlock instanceof DocBlockGenerator) {
} elseif (! $docBlock instanceof DocBlockGenerator) {
throw new Exception\InvalidArgumentException(sprintf(
'%s is expecting either a string, array or an instance of %s\DocBlockGenerator',
__METHOD__,
@@ -277,8 +316,8 @@ class FileGenerator extends AbstractGenerator
*/
public function setUse($use, $as = null)
{
if (!in_array(array($use, $as), $this->uses)) {
$this->uses[] = array($use, $as);
if (! in_array([$use, $as], $this->uses)) {
$this->uses[] = [$use, $as];
}
return $this;
}
@@ -322,7 +361,7 @@ class FileGenerator extends AbstractGenerator
$class = ClassGenerator::fromArray($class);
} elseif (is_string($class)) {
$class = new ClassGenerator($class);
} elseif (!$class instanceof ClassGenerator) {
} elseif (! $class instanceof ClassGenerator) {
throw new Exception\InvalidArgumentException(sprintf(
'%s is expecting either a string, array or an instance of %s\ClassGenerator',
__METHOD__,
@@ -381,6 +420,25 @@ class FileGenerator extends AbstractGenerator
return $this->body;
}
public function setDeclares(array $declares)
{
foreach ($declares as $declare) {
if (! $declare instanceof DeclareStatement) {
throw new InvalidArgumentException(sprintf(
'%s is expecting an array of %s objects',
__METHOD__,
DeclareStatement::class
));
}
if (! array_key_exists($declare->getDirective(), $this->declares)) {
$this->declares[$declare->getDirective()] = $declare;
}
}
return $this;
}
/**
* @return bool
*/
@@ -425,8 +483,7 @@ class FileGenerator extends AbstractGenerator
if (preg_match('#/\* Zend_Code_Generator_Php_File-(.*?)Marker:#m', $body)) {
$tokens = token_get_all($body);
foreach ($tokens as $token) {
if (is_array($token) && in_array($token[0], array(T_OPEN_TAG, T_COMMENT, T_DOC_COMMENT, T_WHITESPACE))
) {
if (is_array($token) && in_array($token[0], [T_OPEN_TAG, T_COMMENT, T_DOC_COMMENT, T_WHITESPACE])) {
$output .= $token[1];
}
}
@@ -438,7 +495,9 @@ class FileGenerator extends AbstractGenerator
$docBlock->setIndentation('');
if (preg_match('#/\* Zend_Code_Generator_FileGenerator-DocBlockMarker \*/#m', $output)) {
// @codingStandardsIgnoreStart
$output = preg_replace('#/\* Zend_Code_Generator_FileGenerator-DocBlockMarker \*/#m', $docBlock->generate(), $output, 1);
// @codingStandardsIgnoreEnd
} else {
$output .= $docBlock->generate() . self::LINE_FEED;
}
@@ -463,10 +522,32 @@ class FileGenerator extends AbstractGenerator
}
}
// declares, if any
if ($this->declares) {
$declareStatements = '';
foreach ($this->declares as $declare) {
$declareStatements .= $declare->getStatement() . self::LINE_FEED;
}
if (preg_match('#/\* Zend_Code_Generator_FileGenerator-DeclaresMarker \*/#m', $output)) {
$output = preg_replace(
'#/\* Zend_Code_Generator_FileGenerator-DeclaresMarker \*/#m',
$declareStatements,
$output,
1
);
} else {
$output .= $declareStatements;
}
$output .= self::LINE_FEED;
}
// process required files
// @todo marker replacement for required files
$requiredFiles = $this->getRequiredFiles();
if (!empty($requiredFiles)) {
if (! empty($requiredFiles)) {
foreach ($requiredFiles as $requiredFile) {
$output .= 'require_once \'' . $requiredFile . '\';' . self::LINE_FEED;
}
@@ -475,19 +556,19 @@ class FileGenerator extends AbstractGenerator
}
$classes = $this->getClasses();
$classUses = array();
$classUses = [];
//build uses array
foreach ($classes as $class) {
//check for duplicate use statements
$uses = $class->getUses();
if (!empty($uses) && is_array($uses)) {
if (! empty($uses) && is_array($uses)) {
$classUses = array_merge($classUses, $uses);
}
}
// process import statements
$uses = $this->getUses();
if (!empty($uses)) {
if (! empty($uses)) {
$useOutput = '';
foreach ($uses as $use) {
@@ -499,8 +580,8 @@ class FileGenerator extends AbstractGenerator
}
//don't duplicate use statements
if (!in_array($tempOutput, $classUses)) {
$useOutput .= "use ". $tempOutput .";";
if (! in_array($tempOutput, $classUses)) {
$useOutput .= 'use ' . $tempOutput . ';';
$useOutput .= self::LINE_FEED;
}
}
@@ -519,9 +600,11 @@ class FileGenerator extends AbstractGenerator
}
// process classes
if (!empty($classes)) {
if (! empty($classes)) {
foreach ($classes as $class) {
// @codingStandardsIgnoreStart
$regex = str_replace('&', $class->getName(), '/\* Zend_Code_Generator_Php_File-ClassMarker: \{[A-Za-z0-9\\\]+?&\} \*/');
// @codingStandardsIgnoreEnd
if (preg_match('#' . $regex . '#m', $output)) {
$output = preg_replace('#' . $regex . '#', $class->generate(), $output, 1);
} else {
@@ -533,9 +616,9 @@ class FileGenerator extends AbstractGenerator
}
}
if (!empty($body)) {
if (! empty($body)) {
// add an extra space between classes and
if (!empty($classes)) {
if (! empty($classes)) {
$output .= self::LINE_FEED;
}
@@ -551,7 +634,7 @@ class FileGenerator extends AbstractGenerator
*/
public function write()
{
if ($this->filename == '' || !is_writable(dirname($this->filename))) {
if ($this->filename == '' || ! is_writable(dirname($this->filename))) {
throw new Exception\RuntimeException('This code generator object is not writable.');
}
file_put_contents($this->filename, $this->generate());

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,12 +11,14 @@ namespace Zend\Code\Generator;
use Zend\Code\Generator\Exception\RuntimeException;
use function str_replace;
class FileGeneratorRegistry
{
/**
* @var array $fileCodeGenerators
*/
private static $fileCodeGenerators = array();
private static $fileCodeGenerators = [];
/**
* Registry for the Zend\Code package.
@@ -37,7 +39,7 @@ class FileGeneratorRegistry
// cannot use realpath since the file might not exist, but we do need to have the index
// in the same DIRECTORY_SEPARATOR that realpath would use:
$fileName = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $fileName);
$fileName = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $fileName);
static::$fileCodeGenerators[$fileName] = $fileCodeGenerator;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -0,0 +1,154 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use Zend\Code\Reflection\ClassReflection;
use function sprintf;
use function str_replace;
use function strtolower;
class InterfaceGenerator extends ClassGenerator
{
const OBJECT_TYPE = 'interface';
const IMPLEMENTS_KEYWORD = 'extends';
/**
* Build a Code Generation Php Object from a Class Reflection
*
* @param ClassReflection $classReflection
* @return InterfaceGenerator
*/
public static function fromReflection(ClassReflection $classReflection)
{
if (! $classReflection->isInterface()) {
throw new Exception\InvalidArgumentException(sprintf(
'Class %s is not a interface',
$classReflection->getName()
));
}
// class generator
$cg = new static($classReflection->getName());
$methods = [];
$cg->setSourceContent($cg->getSourceContent());
$cg->setSourceDirty(false);
if ($classReflection->getDocComment() != '') {
$cg->setDocBlock(DocBlockGenerator::fromReflection($classReflection->getDocBlock()));
}
// set the namespace
if ($classReflection->inNamespace()) {
$cg->setNamespaceName($classReflection->getNamespaceName());
}
foreach ($classReflection->getMethods() as $reflectionMethod) {
$className = $cg->getNamespaceName()
? $cg->getNamespaceName() . '\\' . $cg->getName()
: $cg->getName();
if ($reflectionMethod->getDeclaringClass()->getName() == $className) {
$methods[] = MethodGenerator::fromReflection($reflectionMethod);
}
}
foreach ($classReflection->getConstants() as $name => $value) {
$cg->addConstant($name, $value);
}
$cg->addMethods($methods);
return $cg;
}
/**
* Generate from array
*
* @configkey name string [required] Class Name
* @configkey filegenerator FileGenerator File generator that holds this class
* @configkey namespacename string The namespace for this class
* @configkey docblock string The docblock information
* @configkey constants
* @configkey methods
*
* @throws Exception\InvalidArgumentException
* @param array $array
* @return InterfaceGenerator
*/
public static function fromArray(array $array)
{
if (! isset($array['name'])) {
throw new Exception\InvalidArgumentException(
'Class generator requires that a name is provided for this object'
);
}
$cg = new static($array['name']);
foreach ($array as $name => $value) {
// normalize key
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'containingfile':
$cg->setContainingFileGenerator($value);
break;
case 'namespacename':
$cg->setNamespaceName($value);
break;
case 'docblock':
$docBlock = $value instanceof DocBlockGenerator ? $value : DocBlockGenerator::fromArray($value);
$cg->setDocBlock($docBlock);
break;
case 'methods':
$cg->addMethods($value);
break;
case 'constants':
$cg->addConstants($value);
break;
}
}
return $cg;
}
/**
* {@inheritDoc}
*/
public function addPropertyFromGenerator(PropertyGenerator $property)
{
return $this;
}
/**
* {@inheritDoc}
*/
public function addMethodFromGenerator(MethodGenerator $method)
{
$method->setInterface(true);
return parent::addMethodFromGenerator($method);
}
/**
* {@inheritDoc}
*/
public function setExtendedClass($extendedClass)
{
return $this;
}
/**
* {@inheritDoc}
*/
public function setAbstract($isAbstract)
{
return $this;
}
}

View File

@@ -3,30 +3,54 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use ReflectionMethod;
use Zend\Code\Reflection\MethodReflection;
use function explode;
use function implode;
use function is_array;
use function is_string;
use function method_exists;
use function preg_replace;
use function sprintf;
use function str_replace;
use function strlen;
use function strtolower;
use function substr;
use function trim;
class MethodGenerator extends AbstractMemberGenerator
{
/**
* @var DocBlockGenerator
*/
protected $docBlock = null;
protected $docBlock;
/**
* @var ParameterGenerator[]
*/
protected $parameters = array();
protected $parameters = [];
/**
* @var string
*/
protected $body = null;
protected $body;
/**
* @var null|TypeGenerator
*/
private $returnType;
/**
* @var bool
*/
private $returnsReference = false;
/**
* @param MethodReflection $reflectionMethod
@@ -34,7 +58,7 @@ class MethodGenerator extends AbstractMemberGenerator
*/
public static function fromReflection(MethodReflection $reflectionMethod)
{
$method = new static();
$method = static::copyMethodSignature($reflectionMethod);
$method->setSourceContent($reflectionMethod->getContents(false));
$method->setSourceDirty(false);
@@ -43,6 +67,23 @@ class MethodGenerator extends AbstractMemberGenerator
$method->setDocBlock(DocBlockGenerator::fromReflection($reflectionMethod->getDocBlock()));
}
$method->setBody(static::clearBodyIndention($reflectionMethod->getBody()));
return $method;
}
/**
* Returns a MethodGenerator based on a MethodReflection with only the signature copied.
*
* This is similar to fromReflection() but without the method body and phpdoc as this is quite heavy to copy.
* It's for example useful when creating proxies where you normally change the method body anyway.
*/
public static function copyMethodSignature(MethodReflection $reflectionMethod): MethodGenerator
{
$method = new static();
$declaringClass = $reflectionMethod->getDeclaringClass();
$method->setReturnType(self::extractReturnTypeFromMethodReflection($reflectionMethod));
$method->setFinal($reflectionMethod->isFinal());
if ($reflectionMethod->isPrivate()) {
@@ -53,16 +94,15 @@ class MethodGenerator extends AbstractMemberGenerator
$method->setVisibility(self::VISIBILITY_PUBLIC);
}
$method->setInterface($declaringClass->isInterface());
$method->setStatic($reflectionMethod->isStatic());
$method->setReturnsReference($reflectionMethod->returnsReference());
$method->setName($reflectionMethod->getName());
foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
$method->setParameter(ParameterGenerator::fromReflection($reflectionParameter));
}
$method->setBody(static::clearBodyIndention($reflectionMethod->getBody()));
return $method;
}
@@ -80,7 +120,7 @@ class MethodGenerator extends AbstractMemberGenerator
return $body;
}
$lines = explode(PHP_EOL, $body);
$lines = explode("\n", $body);
$indention = str_replace(trim($lines[1]), '', $lines[1]);
@@ -90,7 +130,7 @@ class MethodGenerator extends AbstractMemberGenerator
}
}
$body = implode(PHP_EOL, $lines);
$body = implode("\n", $lines);
return $body;
}
@@ -114,7 +154,7 @@ class MethodGenerator extends AbstractMemberGenerator
*/
public static function fromArray(array $array)
{
if (!isset($array['name'])) {
if (! isset($array['name'])) {
throw new Exception\InvalidArgumentException(
'Method generator requires that a name is provided for this object'
);
@@ -123,9 +163,9 @@ class MethodGenerator extends AbstractMemberGenerator
$method = new static($array['name']);
foreach ($array as $name => $value) {
// normalize key
switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'docblock':
$docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
$docBlock = $value instanceof DocBlockGenerator ? $value : DocBlockGenerator::fromArray($value);
$method->setDocBlock($docBlock);
break;
case 'flags':
@@ -143,12 +183,18 @@ class MethodGenerator extends AbstractMemberGenerator
case 'final':
$method->setFinal($value);
break;
case 'interface':
$method->setInterface($value);
break;
case 'static':
$method->setStatic($value);
break;
case 'visibility':
$method->setVisibility($value);
break;
case 'returntype':
$method->setReturnType($value);
break;
}
}
@@ -164,7 +210,7 @@ class MethodGenerator extends AbstractMemberGenerator
*/
public function __construct(
$name = null,
array $parameters = array(),
array $parameters = [],
$flags = self::FLAG_PUBLIC,
$body = null,
$docBlock = null
@@ -214,7 +260,7 @@ class MethodGenerator extends AbstractMemberGenerator
$parameter = ParameterGenerator::fromArray($parameter);
}
if (!$parameter instanceof ParameterGenerator) {
if (! $parameter instanceof ParameterGenerator) {
throw new Exception\InvalidArgumentException(sprintf(
'%s is expecting either a string, array or an instance of %s\ParameterGenerator',
__METHOD__,
@@ -253,6 +299,40 @@ class MethodGenerator extends AbstractMemberGenerator
return $this->body;
}
/**
* @param string|null $returnType
*
* @return MethodGenerator
*/
public function setReturnType($returnType = null)
{
$this->returnType = null === $returnType
? null
: TypeGenerator::fromTypeString($returnType);
return $this;
}
/**
* @return TypeGenerator|null
*/
public function getReturnType()
{
return $this->returnType;
}
/**
* @param bool $returnsReference
*
* @return MethodGenerator
*/
public function setReturnsReference($returnsReference)
{
$this->returnsReference = (bool) $returnsReference;
return $this;
}
/**
* @return string
*/
@@ -272,15 +352,17 @@ class MethodGenerator extends AbstractMemberGenerator
if ($this->isAbstract()) {
$output .= 'abstract ';
} else {
$output .= (($this->isFinal()) ? 'final ' : '');
$output .= $this->isFinal() ? 'final ' : '';
}
$output .= $this->getVisibility()
. (($this->isStatic()) ? ' static' : '')
. ' function ' . $this->getName() . '(';
. ($this->isStatic() ? ' static' : '')
. ' function '
. ($this->returnsReference ? '& ' : '')
. $this->getName() . '(';
$parameters = $this->getParameters();
if (!empty($parameters)) {
if (! empty($parameters)) {
foreach ($parameters as $parameter) {
$parameterOutput[] = $parameter->generate();
}
@@ -290,10 +372,18 @@ class MethodGenerator extends AbstractMemberGenerator
$output .= ')';
if ($this->returnType) {
$output .= ' : ' . $this->returnType->generate();
}
if ($this->isAbstract()) {
return $output . ';';
}
if ($this->isInterface()) {
return $output . ';';
}
$output .= self::LINE_FEED . $indent . '{' . self::LINE_FEED;
if ($this->body) {
@@ -310,4 +400,46 @@ class MethodGenerator extends AbstractMemberGenerator
{
return $this->generate();
}
/**
* @param MethodReflection $methodReflection
*
* @return null|string
*/
private static function extractReturnTypeFromMethodReflection(MethodReflection $methodReflection)
{
$returnType = method_exists($methodReflection, 'getReturnType')
? $methodReflection->getReturnType()
: null;
if (! $returnType) {
return null;
}
if (! method_exists($returnType, 'getName')) {
return self::expandLiteralType((string) $returnType, $methodReflection);
}
return ($returnType->allowsNull() ? '?' : '')
. self::expandLiteralType($returnType->getName(), $methodReflection);
}
/**
* @param string $literalReturnType
* @param ReflectionMethod $methodReflection
*
* @return string
*/
private static function expandLiteralType($literalReturnType, ReflectionMethod $methodReflection)
{
if ('self' === strtolower($literalReturnType)) {
return $methodReflection->getDeclaringClass()->getName();
}
if ('parent' === strtolower($literalReturnType)) {
return $methodReflection->getDeclaringClass()->getParentClass()->getName();
}
return $literalReturnType;
}
}

View File

@@ -3,35 +3,41 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use ReflectionParameter;
use Zend\Code\Reflection\ParameterReflection;
use function is_string;
use function method_exists;
use function str_replace;
use function strtolower;
class ParameterGenerator extends AbstractGenerator
{
/**
* @var string
*/
protected $name = null;
protected $name;
/**
* @var string
* @var TypeGenerator|null
*/
protected $type = null;
protected $type;
/**
* @var string|ValueGenerator
* @var ValueGenerator
*/
protected $defaultValue = null;
protected $defaultValue;
/**
* @var int
*/
protected $position = null;
protected $position;
/**
* @var bool
@@ -39,9 +45,14 @@ class ParameterGenerator extends AbstractGenerator
protected $passedByReference = false;
/**
* @var array
* @var bool
*/
protected static $simple = array('int', 'bool', 'string', 'float', 'resource', 'mixed', 'object');
private $variadic = false;
/**
* @var bool
*/
private $omitDefaultValue = false;
/**
* @param ParameterReflection $reflectionParameter
@@ -50,33 +61,27 @@ class ParameterGenerator extends AbstractGenerator
public static function fromReflection(ParameterReflection $reflectionParameter)
{
$param = new ParameterGenerator();
$param->setName($reflectionParameter->getName());
if ($reflectionParameter->isArray()) {
$param->setType('array');
} elseif (method_exists($reflectionParameter, 'isCallable') && $reflectionParameter->isCallable()) {
$param->setType('callable');
} else {
$typeClass = $reflectionParameter->getClass();
if ($typeClass) {
$parameterType = $typeClass->getName();
$currentNamespace = $reflectionParameter->getDeclaringClass()->getNamespaceName();
if (!empty($currentNamespace) && substr($parameterType, 0, strlen($currentNamespace)) == $currentNamespace) {
$parameterType = substr($parameterType, strlen($currentNamespace) + 1);
} else {
$parameterType = '\\' . trim($parameterType, '\\');
}
$param->setType($parameterType);
}
if ($type = self::extractFQCNTypeFromReflectionType($reflectionParameter)) {
$param->setType($type);
}
$param->setPosition($reflectionParameter->getPosition());
if ($reflectionParameter->isOptional()) {
$param->setDefaultValue($reflectionParameter->getDefaultValue());
$variadic = method_exists($reflectionParameter, 'isVariadic') && $reflectionParameter->isVariadic();
$param->setVariadic($variadic);
if (! $variadic && ($reflectionParameter->isOptional() || $reflectionParameter->isDefaultValueAvailable())) {
try {
$param->setDefaultValue($reflectionParameter->getDefaultValue());
} catch (\ReflectionException $e) {
$param->setDefaultValue(null);
}
}
$param->setPassedByReference($reflectionParameter->isPassedByReference());
return $param;
@@ -85,14 +90,15 @@ class ParameterGenerator extends AbstractGenerator
/**
* Generate from array
*
* @configkey name string [required] Class Name
* @configkey type string
* @configkey defaultvalue null|bool|string|int|float|array|ValueGenerator
* @configkey passedbyreference bool
* @configkey position int
* @configkey sourcedirty bool
* @configkey indentation string
* @configkey sourcecontent string
* @configkey name string [required] Class Name
* @configkey type string
* @configkey defaultvalue null|bool|string|int|float|array|ValueGenerator
* @configkey passedbyreference bool
* @configkey position int
* @configkey sourcedirty bool
* @configkey indentation string
* @configkey sourcecontent string
* @configkey omitdefaultvalue bool
*
* @throws Exception\InvalidArgumentException
* @param array $array
@@ -100,16 +106,16 @@ class ParameterGenerator extends AbstractGenerator
*/
public static function fromArray(array $array)
{
if (!isset($array['name'])) {
if (! isset($array['name'])) {
throw new Exception\InvalidArgumentException(
'Paramerer generator requires that a name is provided for this object'
'Parameter generator requires that a name is provided for this object'
);
}
$param = new static($array['name']);
foreach ($array as $name => $value) {
// normalize key
switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'type':
$param->setType($value);
break;
@@ -131,6 +137,9 @@ class ParameterGenerator extends AbstractGenerator
case 'sourcecontent':
$param->setSourceContent($value);
break;
case 'omitdefaultvalue':
$param->omitDefaultValue($value);
break;
}
}
@@ -174,7 +183,8 @@ class ParameterGenerator extends AbstractGenerator
*/
public function setType($type)
{
$this->type = (string) $type;
$this->type = TypeGenerator::fromTypeString($type);
return $this;
}
@@ -183,7 +193,9 @@ class ParameterGenerator extends AbstractGenerator
*/
public function getType()
{
return $this->type;
return $this->type
? (string) $this->type
: null;
}
/**
@@ -214,7 +226,7 @@ class ParameterGenerator extends AbstractGenerator
*/
public function setDefaultValue($defaultValue)
{
if (!($defaultValue instanceof ValueGenerator)) {
if (! $defaultValue instanceof ValueGenerator) {
$defaultValue = new ValueGenerator($defaultValue);
}
$this->defaultValue = $defaultValue;
@@ -223,7 +235,7 @@ class ParameterGenerator extends AbstractGenerator
}
/**
* @return string
* @return ValueGenerator
*/
public function getDefaultValue()
{
@@ -266,35 +278,146 @@ class ParameterGenerator extends AbstractGenerator
return $this;
}
/**
* @param bool $variadic
*
* @return ParameterGenerator
*/
public function setVariadic($variadic)
{
$this->variadic = (bool) $variadic;
return $this;
}
/**
* @return bool
*/
public function getVariadic()
{
return $this->variadic;
}
/**
* @return string
*/
public function generate()
{
$output = '';
if ($this->type && !in_array($this->type, static::$simple)) {
$output .= $this->type . ' ';
}
$output = $this->generateTypeHint();
if (true === $this->passedByReference) {
$output .= '&';
}
if ($this->variadic) {
$output .= '... ';
}
$output .= '$' . $this->name;
if ($this->defaultValue !== null) {
if ($this->omitDefaultValue) {
return $output;
}
if ($this->defaultValue instanceof ValueGenerator) {
$output .= ' = ';
if (is_string($this->defaultValue)) {
$output .= ValueGenerator::escape($this->defaultValue);
} elseif ($this->defaultValue instanceof ValueGenerator) {
$this->defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE);
$output .= $this->defaultValue;
} else {
$output .= $this->defaultValue;
}
$this->defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE);
$output .= $this->defaultValue;
}
return $output;
}
/**
* @param ParameterReflection $reflectionParameter
*
* @return null|string
*/
private static function extractFQCNTypeFromReflectionType(ParameterReflection $reflectionParameter)
{
if (! method_exists($reflectionParameter, 'getType')) {
return self::prePhp7ExtractFQCNTypeFromReflectionType($reflectionParameter);
}
$type = method_exists($reflectionParameter, 'getType')
? $reflectionParameter->getType()
: null;
if (! $type) {
return null;
}
if (! method_exists($type, 'getName')) {
return self::expandLiteralParameterType((string) $type, $reflectionParameter);
}
return ($type->allowsNull() ? '?' : '')
. self::expandLiteralParameterType($type->getName(), $reflectionParameter);
}
/**
* For ancient PHP versions (yes, you should upgrade to 7.0):
*
* @param ParameterReflection $reflectionParameter
*
* @return string|null
*/
private static function prePhp7ExtractFQCNTypeFromReflectionType(ParameterReflection $reflectionParameter)
{
if ($reflectionParameter->isCallable()) {
return 'callable';
}
if ($reflectionParameter->isArray()) {
return 'array';
}
if ($class = $reflectionParameter->getClass()) {
return $class->getName();
}
return null;
}
/**
* @param string $literalParameterType
* @param ReflectionParameter $reflectionParameter
*
* @return string
*/
private static function expandLiteralParameterType($literalParameterType, ReflectionParameter $reflectionParameter)
{
if ('self' === strtolower($literalParameterType)) {
return $reflectionParameter->getDeclaringClass()->getName();
}
if ('parent' === strtolower($literalParameterType)) {
return $reflectionParameter->getDeclaringClass()->getParentClass()->getName();
}
return $literalParameterType;
}
/**
* @return string
*/
private function generateTypeHint()
{
if (null === $this->type) {
return '';
}
return $this->type->generate() . ' ';
}
/**
* @param bool $omit
* @return ParameterGenerator
*/
public function omitDefaultValue(bool $omit = true)
{
$this->omitDefaultValue = $omit;
return $this;
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,10 @@ namespace Zend\Code\Generator;
use Zend\Code\Reflection\PropertyReflection;
use function sprintf;
use function str_replace;
use function strtolower;
class PropertyGenerator extends AbstractMemberGenerator
{
const FLAG_CONSTANT = 0x08;
@@ -18,12 +22,17 @@ class PropertyGenerator extends AbstractMemberGenerator
/**
* @var bool
*/
protected $isConst = null;
protected $isConst;
/**
* @var PropertyValueGenerator
*/
protected $defaultValue = null;
protected $defaultValue;
/**
* @var bool
*/
private $omitDefaultValue = false;
/**
* @param PropertyReflection $reflectionProperty
@@ -37,7 +46,11 @@ class PropertyGenerator extends AbstractMemberGenerator
$allDefaultProperties = $reflectionProperty->getDeclaringClass()->getDefaultProperties();
$property->setDefaultValue($allDefaultProperties[$reflectionProperty->getName()]);
$defaultValue = $allDefaultProperties[$reflectionProperty->getName()];
$property->setDefaultValue($defaultValue);
if ($defaultValue === null) {
$property->omitDefaultValue = true;
}
if ($reflectionProperty->getDocComment() != '') {
$property->setDocBlock(DocBlockGenerator::fromReflection($reflectionProperty->getDocBlock()));
@@ -63,14 +76,15 @@ class PropertyGenerator extends AbstractMemberGenerator
/**
* Generate from array
*
* @configkey name string [required] Class Name
* @configkey const bool
* @configkey defaultvalue null|bool|string|int|float|array|ValueGenerator
* @configkey flags int
* @configkey abstract bool
* @configkey final bool
* @configkey static bool
* @configkey visibility string
* @configkey name string [required] Class Name
* @configkey const bool
* @configkey defaultvalue null|bool|string|int|float|array|ValueGenerator
* @configkey flags int
* @configkey abstract bool
* @configkey final bool
* @configkey static bool
* @configkey visibility string
* @configkey omitdefaultvalue bool
*
* @throws Exception\InvalidArgumentException
* @param array $array
@@ -78,7 +92,7 @@ class PropertyGenerator extends AbstractMemberGenerator
*/
public static function fromArray(array $array)
{
if (!isset($array['name'])) {
if (! isset($array['name'])) {
throw new Exception\InvalidArgumentException(
'Property generator requires that a name is provided for this object'
);
@@ -87,7 +101,7 @@ class PropertyGenerator extends AbstractMemberGenerator
$property = new static($array['name']);
foreach ($array as $name => $value) {
// normalize key
switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'const':
$property->setConst($value);
break;
@@ -95,7 +109,7 @@ class PropertyGenerator extends AbstractMemberGenerator
$property->setDefaultValue($value);
break;
case 'docblock':
$docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
$docBlock = $value instanceof DocBlockGenerator ? $value : DocBlockGenerator::fromArray($value);
$property->setDocBlock($docBlock);
break;
case 'flags':
@@ -113,6 +127,9 @@ class PropertyGenerator extends AbstractMemberGenerator
case 'visibility':
$property->setVisibility($value);
break;
case 'omitdefaultvalue':
$property->omitDefaultValue($value);
break;
}
}
@@ -144,7 +161,6 @@ class PropertyGenerator extends AbstractMemberGenerator
public function setConst($const)
{
if ($const) {
$this->removeFlag(self::FLAG_PUBLIC | self::FLAG_PRIVATE | self::FLAG_PROTECTED);
$this->setFlags(self::FLAG_CONSTANT);
} else {
$this->removeFlag(self::FLAG_CONSTANT);
@@ -168,9 +184,12 @@ class PropertyGenerator extends AbstractMemberGenerator
*
* @return PropertyGenerator
*/
public function setDefaultValue($defaultValue, $defaultValueType = PropertyValueGenerator::TYPE_AUTO, $defaultValueOutputMode = PropertyValueGenerator::OUTPUT_MULTIPLE_LINE)
{
if (!($defaultValue instanceof PropertyValueGenerator)) {
public function setDefaultValue(
$defaultValue,
$defaultValueType = PropertyValueGenerator::TYPE_AUTO,
$defaultValueOutputMode = PropertyValueGenerator::OUTPUT_MULTIPLE_LINE
) {
if (! $defaultValue instanceof PropertyValueGenerator) {
$defaultValue = new PropertyValueGenerator($defaultValue, $defaultValueType, $defaultValueOutputMode);
}
@@ -204,23 +223,36 @@ class PropertyGenerator extends AbstractMemberGenerator
}
if ($this->isConst()) {
if ($defaultValue !== null && !$defaultValue->isValidConstantType()) {
if ($defaultValue !== null && ! $defaultValue->isValidConstantType()) {
throw new Exception\RuntimeException(sprintf(
'The property %s is said to be '
. 'constant but does not have a valid constant value.',
$this->name
));
}
$output .= $this->indentation . 'const ' . $name . ' = '
. (($defaultValue !== null) ? $defaultValue->generate() : 'null;');
} else {
$output .= $this->indentation
. $this->getVisibility()
. (($this->isStatic()) ? ' static' : '')
. ' $' . $name . ' = '
. (($defaultValue !== null) ? $defaultValue->generate() : 'null;');
$output .= $this->indentation . $this->getVisibility() . ' const ' . $name . ' = '
. ($defaultValue !== null ? $defaultValue->generate() : 'null;');
return $output;
}
return $output;
$output .= $this->indentation . $this->getVisibility() . ($this->isStatic() ? ' static' : '') . ' $' . $name;
if ($this->omitDefaultValue) {
return $output . ';';
}
return $output . ' = ' . ($defaultValue !== null ? $defaultValue->generate() : 'null;');
}
/**
* @param bool $omit
* @return PropertyGenerator
*/
public function omitDefaultValue(bool $omit = true)
{
$this->omitDefaultValue = $omit;
return $this;
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,9 @@ namespace Zend\Code\Generator;
use Zend\Code\Reflection\ClassReflection;
use function str_replace;
use function strtolower;
class TraitGenerator extends ClassGenerator
{
const OBJECT_TYPE = 'trait';
@@ -38,7 +41,7 @@ class TraitGenerator extends ClassGenerator
$cg->setNamespaceName($classReflection->getNamespaceName());
}
$properties = array();
$properties = [];
foreach ($classReflection->getProperties() as $reflectionProperty) {
if ($reflectionProperty->getDeclaringClass()->getName() == $classReflection->getName()) {
$properties[] = PropertyGenerator::fromReflection($reflectionProperty);
@@ -46,9 +49,9 @@ class TraitGenerator extends ClassGenerator
}
$cg->addProperties($properties);
$methods = array();
$methods = [];
foreach ($classReflection->getMethods() as $reflectionMethod) {
$className = ($cg->getNamespaceName())
$className = $cg->getNamespaceName()
? $cg->getNamespaceName() . '\\' . $cg->getName()
: $cg->getName();
if ($reflectionMethod->getDeclaringClass()->getName() == $className) {
@@ -85,7 +88,7 @@ class TraitGenerator extends ClassGenerator
$cg = new static($array['name']);
foreach ($array as $name => $value) {
// normalize key
switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
switch (strtolower(str_replace(['.', '-', '_'], '', $name))) {
case 'containingfile':
$cg->setContainingFileGenerator($value);
break;
@@ -93,7 +96,7 @@ class TraitGenerator extends ClassGenerator
$cg->setNamespaceName($value);
break;
case 'docblock':
$docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
$docBlock = $value instanceof DocBlockGenerator ? $value : DocBlockGenerator::fromArray($value);
$cg->setDocBlock($docBlock);
break;
case 'properties':

View File

@@ -3,15 +3,29 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use Reflection;
use ReflectionMethod;
class TraitUsageGenerator extends AbstractGenerator
use function array_key_exists;
use function array_search;
use function array_values;
use function count;
use function current;
use function explode;
use function implode;
use function in_array;
use function is_array;
use function is_string;
use function sprintf;
use function strpos;
class TraitUsageGenerator extends AbstractGenerator implements TraitUsageInterface
{
/**
* @var ClassGenerator
@@ -21,22 +35,22 @@ class TraitUsageGenerator extends AbstractGenerator
/**
* @var array Array of trait names
*/
protected $traits = array();
protected $traits = [];
/**
* @var array Array of trait aliases
*/
protected $traitAliases = array();
protected $traitAliases = [];
/**
* @var array Array of trait overrides
*/
protected $traitOverrides = array();
protected $traitOverrides = [];
/**
* @var array Array of string names
*/
protected $uses = array();
protected $uses = [];
public function __construct(ClassGenerator $classGenerator)
{
@@ -44,10 +58,12 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addUse($use, $useAlias = null)
{
$this->removeUse($use);
if (! empty($useAlias)) {
$use .= ' as ' . $useAlias;
}
@@ -57,7 +73,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function getUses()
{
@@ -65,7 +81,105 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @param string $use
* @return bool
*/
public function hasUse($use)
{
foreach ($this->uses as $key => $value) {
$parts = explode(' ', $value);
if ($parts[0] === $use) {
return true;
}
}
return false;
}
/**
* @param string $use
* @return bool
*/
public function hasUseAlias($use)
{
foreach ($this->uses as $key => $value) {
$parts = explode(' as ', $value);
if ($parts[0] === $use && count($parts) == 2) {
return true;
}
}
return false;
}
/**
* Returns the alias of the provided FQCN
*
* @param string $use
* @return string|null
*/
public function getUseAlias(string $use): ?string
{
foreach ($this->uses as $key => $value) {
$parts = explode(' as ', $key);
if ($parts[0] === $use && count($parts) == 2) {
return $parts[1];
}
}
return null;
}
/**
* Returns true if the alias is defined in the use list
*
* @param string $alias
* @return bool
*/
public function isUseAlias(string $alias): bool
{
foreach ($this->uses as $key => $value) {
$parts = explode(' as ', $key);
if (count($parts) === 2 && $parts[1] === $alias) {
return true;
}
}
return false;
}
/**
* @param string $use
* @return TraitUsageGenerator
*/
public function removeUse($use)
{
foreach ($this->uses as $key => $value) {
$parts = explode(' ', $value);
if ($parts[0] === $use) {
unset($this->uses[$value]);
}
}
return $this;
}
/**
* @param string $use
* @return TraitUsageGenerator
*/
public function removeUseAlias($use)
{
foreach ($this->uses as $key => $value) {
$parts = explode(' as ', $value);
if ($parts[0] === $use && count($parts) == 2) {
unset($this->uses[$value]);
}
}
return $this;
}
/**
* @inheritDoc
*/
public function addTrait($trait)
{
@@ -97,7 +211,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addTraits(array $traits)
{
@@ -109,7 +223,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function hasTrait($traitName)
{
@@ -117,7 +231,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function getTraits()
{
@@ -125,7 +239,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function removeTrait($traitName)
{
@@ -138,7 +252,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addTraitAlias($method, $alias, $visibility = null)
{
@@ -156,7 +270,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
// Validations
if (false === strpos($traitAndMethod, "::")) {
if (false === strpos($traitAndMethod, '::')) {
throw new Exception\InvalidArgumentException(
'Invalid Format: $method must be in the format of trait::method'
);
@@ -183,16 +297,16 @@ class TraitUsageGenerator extends AbstractGenerator
throw new Exception\InvalidArgumentException('Invalid trait: Trait does not exists on this class');
}
$this->traitAliases[$traitAndMethod] = array(
$this->traitAliases[$traitAndMethod] = [
'alias' => $alias,
'visibility' => $visibility
);
'visibility' => $visibility,
];
return $this;
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function getTraitAliases()
{
@@ -200,12 +314,12 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function addTraitOverride($method, $traitsToReplace)
{
if (false === is_array($traitsToReplace)) {
$traitsToReplace = array($traitsToReplace);
$traitsToReplace = [$traitsToReplace];
}
$traitAndMethod = $method;
@@ -222,19 +336,19 @@ class TraitUsageGenerator extends AbstractGenerator
}
// Validations
if (false === strpos($traitAndMethod, "::")) {
if (false === strpos($traitAndMethod, '::')) {
throw new Exception\InvalidArgumentException(
'Invalid Format: $method must be in the format of trait::method'
);
}
list($trait, $method) = explode("::", $traitAndMethod);
list($trait, $method) = explode('::', $traitAndMethod);
if (! $this->hasTrait($trait)) {
throw new Exception\InvalidArgumentException('Invalid trait: Trait does not exists on this class');
}
if (! array_key_exists($traitAndMethod, $this->traitOverrides)) {
$this->traitOverrides[$traitAndMethod] = array();
$this->traitOverrides[$traitAndMethod] = [];
}
foreach ($traitsToReplace as $traitToReplace) {
@@ -253,7 +367,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function removeTraitOverride($method, $overridesToRemove = null)
{
@@ -266,8 +380,8 @@ class TraitUsageGenerator extends AbstractGenerator
return $this;
}
$overridesToRemove = (! is_array($overridesToRemove))
? array($overridesToRemove)
$overridesToRemove = ! is_array($overridesToRemove)
? [$overridesToRemove]
: $overridesToRemove;
foreach ($overridesToRemove as $traitToRemove) {
$key = array_search($traitToRemove, $this->traitOverrides[$method]);
@@ -279,7 +393,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\TraitUsageInterface
* @inheritDoc
*/
public function getTraitOverrides()
{
@@ -287,7 +401,7 @@ class TraitUsageGenerator extends AbstractGenerator
}
/**
* @inherit Zend\Code\Generator\GeneratorInterface
* @inheritDoc
*/
public function generate()
{
@@ -304,13 +418,13 @@ class TraitUsageGenerator extends AbstractGenerator
$aliases = $this->getTraitAliases();
$overrides = $this->getTraitOverrides();
if (empty($aliases) && empty($overrides)) {
$output .= ";" . self::LINE_FEED . self::LINE_FEED;
$output .= ';' . self::LINE_FEED . self::LINE_FEED;
return $output;
}
$output .= ' {' . self::LINE_FEED;
foreach ($aliases as $method => $alias) {
$visibility = (null !== $alias['visibility'])
$visibility = null !== $alias['visibility']
? current(Reflection::getModifierNames($alias['visibility'])) . ' '
: '';

View File

@@ -3,9 +3,10 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
interface TraitUsageInterface
@@ -50,7 +51,7 @@ interface TraitUsageInterface
* Add multiple traits. Trait can be an array of trait names or array of trait
* configurations
*
* @param array $traitName Array of string names or configurations (@see addTrait)
* @param array $traits Array of string names or configurations (@see addTrait)
* @return self
*/
public function addTraits(array $traits);
@@ -58,7 +59,7 @@ interface TraitUsageInterface
/**
* Check to see if the class has a trait defined
*
* @param strint $traitName
* @param string $traitName
* @return bool
*/
public function hasTrait($traitName);
@@ -73,7 +74,7 @@ interface TraitUsageInterface
/**
* Remove a trait by its name
*
* @param $traitName
* @param string $traitName
*/
public function removeTrait($traitName);
@@ -91,11 +92,11 @@ interface TraitUsageInterface
* Alias is a string representing the new method name.
*
* $visibilty:
* ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PRIVATE| ReflectionMethod::IS_PROTECTED
* ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PRIVATE | ReflectionMethod::IS_PROTECTED
*
* @param mixed $method String or Array
* @param string $alias
* @param int $visiblity
* @param null|int $visibility
*/
public function addTraitAlias($method, $alias, $visibility = null);
@@ -123,7 +124,7 @@ interface TraitUsageInterface
* Option 2: Array of strings of traits to replace
* @param mixed $method
* @param mixed $traitToReplace
* @param mixed $traitsToReplace
*/
public function addTraitOverride($method, $traitsToReplace);
@@ -144,9 +145,9 @@ interface TraitUsageInterface
* Option 1: String of trait to replace
* Option 2: Array of strings of traits to replace
*
* @param $traitAndMethod
* @param null $overridesToRemove
* @return $this
* @param mixed $method
* @param mixed $overridesToRemove
* @return self
*/
public function removeTraitOverride($method, $overridesToRemove = null);

View File

@@ -0,0 +1,169 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use Zend\Code\Generator\Exception\InvalidArgumentException;
use function in_array;
use function ltrim;
use function preg_match;
use function sprintf;
use function strpos;
use function strtolower;
use function substr;
final class TypeGenerator implements GeneratorInterface
{
/**
* @var bool
*/
private $isInternalPhpType;
/**
* @var string
*/
private $type;
/**
* @var bool
*/
private $nullable;
/**
* @var string[]
*
* @link http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration
*/
private static $internalPhpTypes = [
'void',
'int',
'float',
'string',
'bool',
'array',
'callable',
'iterable',
'object'
];
/**
* @var string a regex pattern to match valid class names or types
*/
private static $validIdentifierMatcher = '/^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*'
. '(\\\\[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)*$/';
/**
* @param string $type
*
* @return TypeGenerator
*
* @throws InvalidArgumentException
*/
public static function fromTypeString($type)
{
list($nullable, $trimmedNullable) = self::trimNullable($type);
list($wasTrimmed, $trimmedType) = self::trimType($trimmedNullable);
if (! preg_match(self::$validIdentifierMatcher, $trimmedType)) {
throw new InvalidArgumentException(sprintf(
'Provided type "%s" is invalid: must conform "%s"',
$type,
self::$validIdentifierMatcher
));
}
$isInternalPhpType = self::isInternalPhpType($trimmedType);
if ($wasTrimmed && $isInternalPhpType) {
throw new InvalidArgumentException(sprintf(
'Provided type "%s" is an internal PHP type, but was provided with a namespace separator prefix',
$type
));
}
if ($nullable && $isInternalPhpType && 'void' === strtolower($trimmedType)) {
throw new InvalidArgumentException(sprintf('Provided type "%s" cannot be nullable', $type));
}
$instance = new self();
$instance->type = $trimmedType;
$instance->nullable = $nullable;
$instance->isInternalPhpType = $isInternalPhpType;
return $instance;
}
private function __construct()
{
}
/**
* {@inheritDoc}
*/
public function generate()
{
$nullable = $this->nullable ? '?' : '';
if ($this->isInternalPhpType) {
return $nullable . strtolower($this->type);
}
return $nullable . '\\' . $this->type;
}
/**
* @return string the cleaned type string
*/
public function __toString()
{
return ltrim($this->generate(), '?\\');
}
/**
* @param string $type
*
* @return bool[]|string[] ordered tuple, first key represents whether the type is nullable, second is the
* trimmed string
*/
private static function trimNullable($type)
{
if (0 === strpos($type, '?')) {
return [true, substr($type, 1)];
}
return [false, $type];
}
/**
* @param string $type
*
* @return bool[]|string[] ordered tuple, first key represents whether the values was trimmed, second is the
* trimmed string
*/
private static function trimType($type)
{
if (0 === strpos($type, '\\')) {
return [true, substr($type, 1)];
}
return [false, $type];
}
/**
* @param string $type
*
* @return bool
*/
private static function isInternalPhpType($type)
{
return in_array(strtolower($type), self::$internalPhpTypes, true);
}
}

View File

@@ -3,33 +3,55 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Generator;
use Zend\Stdlib\ArrayObject;
use ArrayObject as SplArrayObject;
use Zend\Code\Exception\InvalidArgumentException;
use Zend\Stdlib\ArrayObject as StdlibArrayObject;
use function addcslashes;
use function array_keys;
use function array_merge;
use function array_search;
use function count;
use function get_class;
use function get_defined_constants;
use function gettype;
use function implode;
use function in_array;
use function is_array;
use function is_int;
use function is_object;
use function max;
use function sprintf;
use function str_repeat;
use function strpos;
class ValueGenerator extends AbstractGenerator
{
/**#@+
* Constant values
*/
const TYPE_AUTO = 'auto';
const TYPE_BOOLEAN = 'boolean';
const TYPE_BOOL = 'bool';
const TYPE_NUMBER = 'number';
const TYPE_INTEGER = 'integer';
const TYPE_INT = 'int';
const TYPE_FLOAT = 'float';
const TYPE_DOUBLE = 'double';
const TYPE_STRING = 'string';
const TYPE_ARRAY = 'array';
const TYPE_CONSTANT = 'constant';
const TYPE_NULL = 'null';
const TYPE_OBJECT = 'object';
const TYPE_OTHER = 'other';
const TYPE_AUTO = 'auto';
const TYPE_BOOLEAN = 'boolean';
const TYPE_BOOL = 'bool';
const TYPE_NUMBER = 'number';
const TYPE_INTEGER = 'integer';
const TYPE_INT = 'int';
const TYPE_FLOAT = 'float';
const TYPE_DOUBLE = 'double';
const TYPE_STRING = 'string';
const TYPE_ARRAY = 'array';
const TYPE_ARRAY_SHORT = 'array_short';
const TYPE_ARRAY_LONG = 'array_long';
const TYPE_CONSTANT = 'constant';
const TYPE_NULL = 'null';
const TYPE_OBJECT = 'object';
const TYPE_OTHER = 'other';
/**#@-*/
const OUTPUT_MULTIPLE_LINE = 'multipleLine';
@@ -38,7 +60,7 @@ class ValueGenerator extends AbstractGenerator
/**
* @var mixed
*/
protected $value = null;
protected $value;
/**
* @var string
@@ -58,21 +80,27 @@ class ValueGenerator extends AbstractGenerator
/**
* @var array
*/
protected $allowedTypes = null;
protected $allowedTypes;
/**
* Autodetectable constants
* @var ArrayObject
*
* @var SplArrayObject|StdlibArrayObject
*/
protected $constants = null;
protected $constants;
/**
* @param mixed $value
* @param string $type
* @param string $outputMode
* @param ArrayObject $constants
* @param null|SplArrayObject|StdlibArrayObject $constants
*/
public function __construct($value = null, $type = self::TYPE_AUTO, $outputMode = self::OUTPUT_MULTIPLE_LINE, ArrayObject $constants = null)
{
public function __construct(
$value = null,
$type = self::TYPE_AUTO,
$outputMode = self::OUTPUT_MULTIPLE_LINE,
$constants = null
) {
// strict check is important here if $type = AUTO
if ($value !== null) {
$this->setValue($value);
@@ -83,11 +111,14 @@ class ValueGenerator extends AbstractGenerator
if ($outputMode !== self::OUTPUT_MULTIPLE_LINE) {
$this->setOutputMode($outputMode);
}
if ($constants !== null) {
$this->constants = $constants;
} else {
$this->constants = new ArrayObject();
if ($constants === null) {
$constants = new SplArrayObject();
} elseif (! ($constants instanceof SplArrayObject || $constants instanceof StdlibArrayObject)) {
throw new InvalidArgumentException(
'$constants must be an instance of ArrayObject or Zend\Stdlib\ArrayObject'
);
}
$this->constants = $constants;
}
/**
@@ -95,7 +126,7 @@ class ValueGenerator extends AbstractGenerator
*/
public function initEnvironmentConstants()
{
$constants = array(
$constants = [
'__DIR__',
'__FILE__',
'__LINE__',
@@ -104,8 +135,8 @@ class ValueGenerator extends AbstractGenerator
'__METHOD__',
'__FUNCTION__',
'__NAMESPACE__',
'::'
);
'::',
];
$constants = array_merge($constants, array_keys(get_defined_constants()), $this->constants->getArrayCopy());
$this->constants->exchangeArray($constants);
}
@@ -143,7 +174,7 @@ class ValueGenerator extends AbstractGenerator
/**
* Return constant list
*
* @return ArrayObject
* @return SplArrayObject|StdlibArrayObject
*/
public function getConstants()
{
@@ -155,14 +186,16 @@ class ValueGenerator extends AbstractGenerator
*/
public function isValidConstantType()
{
if ($this->type == self::TYPE_AUTO) {
if ($this->type === self::TYPE_AUTO) {
$type = $this->getAutoDeterminedType($this->value);
} else {
$type = $this->type;
}
// valid types for constants
$scalarTypes = array(
$validConstantTypes = [
self::TYPE_ARRAY,
self::TYPE_ARRAY_LONG,
self::TYPE_ARRAY_SHORT,
self::TYPE_BOOLEAN,
self::TYPE_BOOL,
self::TYPE_NUMBER,
@@ -172,10 +205,10 @@ class ValueGenerator extends AbstractGenerator
self::TYPE_DOUBLE,
self::TYPE_STRING,
self::TYPE_CONSTANT,
self::TYPE_NULL
);
self::TYPE_NULL,
];
return in_array($type, $scalarTypes);
return in_array($type, $validConstantTypes);
}
/**
@@ -238,7 +271,7 @@ class ValueGenerator extends AbstractGenerator
*/
protected function getValidatedType($type)
{
$types = array(
$types = [
self::TYPE_AUTO,
self::TYPE_BOOLEAN,
self::TYPE_BOOL,
@@ -249,11 +282,13 @@ class ValueGenerator extends AbstractGenerator
self::TYPE_DOUBLE,
self::TYPE_STRING,
self::TYPE_ARRAY,
self::TYPE_ARRAY_SHORT,
self::TYPE_ARRAY_LONG,
self::TYPE_CONSTANT,
self::TYPE_NULL,
self::TYPE_OBJECT,
self::TYPE_OTHER
);
self::TYPE_OTHER,
];
if (in_array($type, $types)) {
return $type;
@@ -302,22 +337,32 @@ class ValueGenerator extends AbstractGenerator
{
$type = $this->type;
if ($type != self::TYPE_AUTO) {
if ($type !== self::TYPE_AUTO) {
$type = $this->getValidatedType($type);
}
$value = $this->value;
if ($type == self::TYPE_AUTO) {
if ($type === self::TYPE_AUTO) {
$type = $this->getAutoDeterminedType($value);
}
if ($type == self::TYPE_ARRAY) {
$isArrayType = in_array($type, [self::TYPE_ARRAY, self::TYPE_ARRAY_LONG, self::TYPE_ARRAY_SHORT]);
if ($isArrayType) {
foreach ($value as &$curValue) {
if ($curValue instanceof self) {
continue;
}
$curValue = new self($curValue, self::TYPE_AUTO, self::OUTPUT_MULTIPLE_LINE, $this->getConstants());
if (is_array($curValue)) {
$newType = $type;
} else {
$newType = self::TYPE_AUTO;
}
$curValue = new self($curValue, $newType, self::OUTPUT_MULTIPLE_LINE, $this->getConstants());
$curValue->setIndentation($this->indentation);
}
}
@@ -326,7 +371,7 @@ class ValueGenerator extends AbstractGenerator
switch ($type) {
case self::TYPE_BOOLEAN:
case self::TYPE_BOOL:
$output .= ($value ? 'true' : 'false');
$output .= $value ? 'true' : 'false';
break;
case self::TYPE_STRING:
$output .= self::escape($value);
@@ -343,11 +388,21 @@ class ValueGenerator extends AbstractGenerator
$output .= $value;
break;
case self::TYPE_ARRAY:
$output .= 'array(';
case self::TYPE_ARRAY_LONG:
case self::TYPE_ARRAY_SHORT:
if ($type === self::TYPE_ARRAY_LONG) {
$startArray = 'array(';
$endArray = ')';
} else {
$startArray = '[';
$endArray = ']';
}
$output .= $startArray;
if ($this->outputMode == self::OUTPUT_MULTIPLE_LINE) {
$output .= self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth + 1);
}
$outputParts = array();
$outputParts = [];
$noKeyIndex = 0;
foreach ($value as $n => $v) {
/* @var $v ValueGenerator */
@@ -369,7 +424,7 @@ class ValueGenerator extends AbstractGenerator
$outputParts[] = (is_int($n) ? $n : self::escape($n)) . ' => ' . $partV;
}
}
$padding = ($this->outputMode == self::OUTPUT_MULTIPLE_LINE)
$padding = $this->outputMode == self::OUTPUT_MULTIPLE_LINE
? self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth + 1)
: ' ';
$output .= implode(',' . $padding, $outputParts);
@@ -379,13 +434,14 @@ class ValueGenerator extends AbstractGenerator
}
$output .= self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth);
}
$output .= ')';
$output .= $endArray;
break;
case self::TYPE_OTHER:
default:
throw new Exception\RuntimeException(
sprintf('Type "%s" is unknown or cannot be used as property default value.', get_class($value))
);
throw new Exception\RuntimeException(sprintf(
'Type "%s" is unknown or cannot be used as property default value.',
is_object($value) ? get_class($value) : gettype($value)
));
}
return $output;

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,8 @@ namespace Zend\Code\Generic\Prototype;
use Zend\Code\Reflection\Exception;
use function str_replace;
/**
* This is a factory for classes which are identified by name.
*
@@ -27,20 +29,20 @@ class PrototypeClassFactory
/**
* @var array
*/
protected $prototypes = array();
protected $prototypes = [];
/**
* @var PrototypeGenericInterface
*/
protected $genericPrototype = null;
protected $genericPrototype;
/**
* @param PrototypeInterface[] $prototypes
* @param PrototypeGenericInterface $genericPrototype
*/
public function __construct($prototypes = array(), PrototypeGenericInterface $genericPrototype = null)
public function __construct($prototypes = [], PrototypeGenericInterface $genericPrototype = null)
{
foreach ((array)$prototypes as $prototype) {
foreach ((array) $prototypes as $prototype) {
$this->addPrototype($prototype);
}
@@ -83,7 +85,7 @@ class PrototypeClassFactory
*/
protected function normalizeName($name)
{
return str_replace(array('-', '_'), '', $name);
return str_replace(['-', '_'], '', $name);
}
/**
@@ -105,11 +107,11 @@ class PrototypeClassFactory
{
$prototypeName = $this->normalizeName($prototypeName);
if (!$this->hasPrototype($prototypeName) && !isset($this->genericPrototype)) {
if (! $this->hasPrototype($prototypeName) && ! isset($this->genericPrototype)) {
throw new Exception\RuntimeException('This tag name is not supported by this tag manager');
}
if (!$this->hasPrototype($prototypeName)) {
if (! $this->hasPrototype($prototypeName)) {
$newPrototype = clone $this->genericPrototype;
$newPrototype->setName($prototypeName);
} else {

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,29 +3,42 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code;
use function array_key_exists;
use function array_search;
use function is_array;
use function is_int;
use function is_string;
use function ltrim;
use function strlen;
use function strpos;
use function strrpos;
use function substr;
use function substr_replace;
use function trim;
class NameInformation
{
/**
* @var string
*/
protected $namespace = null;
protected $namespace;
/**
* @var array
*/
protected $uses = array();
protected $uses = [];
/**
* @param string $namespace
* @param array $uses
*/
public function __construct($namespace = null, array $uses = array())
public function __construct($namespace = null, array $uses = [])
{
if ($namespace) {
$this->setNamespace($namespace);
@@ -58,7 +71,7 @@ class NameInformation
*/
public function hasNamespace()
{
return ($this->namespace !== null);
return $this->namespace !== null;
}
/**
@@ -67,7 +80,7 @@ class NameInformation
*/
public function setUses(array $uses)
{
$this->uses = array();
$this->uses = [];
$this->addUses($uses);
return $this;
@@ -128,11 +141,11 @@ class NameInformation
*/
public function resolveName($name)
{
if ($this->namespace && !$this->uses && strlen($name) > 0 && $name{0} != '\\') {
if ($this->namespace && ! $this->uses && strlen($name) > 0 && $name[0] != '\\') {
return $this->namespace . '\\' . $name;
}
if (!$this->uses || strlen($name) <= 0 || $name{0} == '\\') {
if (! $this->uses || strlen($name) <= 0 || $name[0] == '\\') {
return ltrim($name, '\\');
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -15,17 +15,25 @@ use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\Scanner\AnnotationScanner;
use Zend\Code\Scanner\FileScanner;
use function array_shift;
use function array_slice;
use function array_unshift;
use function file;
use function file_exists;
use function implode;
use function strstr;
class ClassReflection extends ReflectionClass implements ReflectionInterface
{
/**
* @var AnnotationScanner
*/
protected $annotations = null;
protected $annotations;
/**
* @var DocBlockReflection
*/
protected $docBlock = null;
protected $docBlock;
/**
* Return the reflection file of the declaring file.
@@ -42,7 +50,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
/**
* Return the classes DocBlock reflection object
*
* @return DocBlockReflection
* @return DocBlockReflection|false
* @throws Exception\ExceptionInterface for missing DocBock or invalid reflection class
*/
public function getDocBlock()
@@ -62,7 +70,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
/**
* @param AnnotationManager $annotationManager
* @return AnnotationCollection
* @return AnnotationCollection|false
*/
public function getAnnotations(AnnotationManager $annotationManager)
{
@@ -79,7 +87,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
$fileScanner = $this->createFileScanner($this->getFileName());
$nameInformation = $fileScanner->getClassNameInformation($this->getName());
if (!$nameInformation) {
if (! $nameInformation) {
return false;
}
@@ -123,7 +131,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
// Ensure we get between the open and close braces
$lines = array_slice($filelines, $startnum, $endnum);
array_unshift($lines, $filelines[$startnum-1]);
array_unshift($lines, $filelines[$startnum - 1]);
return strstr(implode('', $lines), '{');
}
@@ -136,7 +144,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
public function getInterfaces()
{
$phpReflections = parent::getInterfaces();
$zendReflections = array();
$zendReflections = [];
while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
$instance = new ClassReflection($phpReflection->getName());
$zendReflections[] = $instance;
@@ -168,7 +176,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
*/
public function getMethods($filter = -1)
{
$methods = array();
$methods = [];
foreach (parent::getMethods($filter) as $method) {
$instance = new MethodReflection($this->getName(), $method->getName());
$methods[] = $instance;
@@ -180,11 +188,11 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
/**
* Returns an array of reflection classes of traits used by this class.
*
* @return array|null
* @return null|array
*/
public function getTraits()
{
$vals = array();
$vals = [];
$traits = parent::getTraits();
if ($traits === null) {
return;
@@ -239,7 +247,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
public function getProperties($filter = -1)
{
$phpReflections = parent::getProperties($filter);
$zendReflections = array();
$zendReflections = [];
while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
$instance = new PropertyReflection($this->getName(), $phpReflection->getName());
$zendReflections[] = $instance;
@@ -269,7 +277,7 @@ class ClassReflection extends ReflectionClass implements ReflectionInterface
/**
* Creates a new FileScanner instance.
*
* By having this as a seperate method it allows the method to be overridden
* By having this as a separate method it allows the method to be overridden
* if a different FileScanner is needed.
*
* @param string $filename

View File

@@ -3,23 +3,26 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
use function preg_match;
use function rtrim;
class AuthorTag implements TagInterface
{
/**
* @var string
*/
protected $authorName = null;
protected $authorName;
/**
* @var string
*/
protected $authorEmail = null;
protected $authorEmail;
/**
* @return string
@@ -36,9 +39,9 @@ class AuthorTag implements TagInterface
*/
public function initialize($tagDocblockLine)
{
$match = array();
$match = [];
if (!preg_match('/^([^\<]*)(\<([^\>]*)\>)?(.*)$/u', $tagDocblockLine, $match)) {
if (! preg_match('/^([^\<]*)(\<([^\>]*)\>)?(.*)$/u', $tagDocblockLine, $match)) {
return;
}
@@ -69,6 +72,6 @@ class AuthorTag implements TagInterface
public function __toString()
{
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . "\n";
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,27 +11,30 @@ namespace Zend\Code\Reflection\DocBlock\Tag;
use Zend\Code\Generic\Prototype\PrototypeGenericInterface;
use function explode;
use function trim;
class GenericTag implements TagInterface, PrototypeGenericInterface
{
/**
* @var string
*/
protected $name = null;
protected $name;
/**
* @var string
*/
protected $content = null;
protected $content;
/**
* @var null|string
*/
protected $contentSplitCharacter = null;
protected $contentSplitCharacter;
/**
* @var array
*/
protected $values = array();
protected $values = [];
/**
* @param string $contentSplitCharacter
@@ -95,7 +98,7 @@ class GenericTag implements TagInterface, PrototypeGenericInterface
*/
public function __toString()
{
return 'DocBlock Tag [ * @' . $this->name . ' ]' . PHP_EOL;
return 'DocBlock Tag [ * @' . $this->name . ' ]' . "\n";
}
/**

View File

@@ -3,23 +3,26 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
use function preg_match;
use function trim;
class LicenseTag implements TagInterface
{
/**
* @var string
*/
protected $url = null;
protected $url;
/**
* @var string
*/
protected $licenseName = null;
protected $licenseName;
/**
* @return string
@@ -36,9 +39,9 @@ class LicenseTag implements TagInterface
*/
public function initialize($tagDocblockLine)
{
$match = array();
$match = [];
if (!preg_match('#^([\S]*)(?:\s+(.*))?$#m', $tagDocblockLine, $match)) {
if (! preg_match('#^([\S]*)(?:\s+(.*))?$#m', $tagDocblockLine, $match)) {
return;
}
@@ -69,6 +72,6 @@ class LicenseTag implements TagInterface
public function __toString()
{
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . "\n";
}
}

View File

@@ -3,12 +3,16 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
use function explode;
use function preg_match;
use function rtrim;
class MethodTag implements TagInterface, PhpDocTypedTagInterface
{
/**
@@ -16,17 +20,17 @@ class MethodTag implements TagInterface, PhpDocTypedTagInterface
*
* @var array
*/
protected $types = array();
protected $types = [];
/**
* @var string
*/
protected $methodName = null;
protected $methodName;
/**
* @var string
*/
protected $description = null;
protected $description;
/**
* Is static method
@@ -50,9 +54,9 @@ class MethodTag implements TagInterface, PhpDocTypedTagInterface
*/
public function initialize($tagDocblockLine)
{
$match = array();
$match = [];
if (!preg_match('#^(static[\s]+)?(.+[\s]+)?(.+\(\))[\s]*(.*)$#m', $tagDocblockLine, $match)) {
if (! preg_match('#^(static[\s]+)?(.+[\s]+)?(.+\(\))[\s]*(.*)$#m', $tagDocblockLine, $match)) {
return;
}
@@ -117,6 +121,6 @@ class MethodTag implements TagInterface, PhpDocTypedTagInterface
public function __toString()
{
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . "\n";
}
}

View File

@@ -3,28 +3,33 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
use function explode;
use function preg_match;
use function preg_replace;
use function trim;
class ParamTag implements TagInterface, PhpDocTypedTagInterface
{
/**
* @var array
*/
protected $types = array();
protected $types = [];
/**
* @var string
*/
protected $variableName = null;
protected $variableName;
/**
* @var string
*/
protected $description = null;
protected $description;
/**
* @return string
@@ -41,9 +46,9 @@ class ParamTag implements TagInterface, PhpDocTypedTagInterface
*/
public function initialize($tagDocBlockLine)
{
$matches = array();
$matches = [];
if (!preg_match('#((?:[\w|\\\]+(?:\[\])*\|?)+)(?:\s+(\$\S+))?(?:\s+(.*))?#s', $tagDocBlockLine, $matches)) {
if (! preg_match('#((?:[\w|\\\]+(?:\[\])*\|?)+)(?:\s+(\$\S+))?(?:\s+(.*))?#s', $tagDocBlockLine, $matches)) {
return;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,28 +3,32 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
use function explode;
use function preg_match;
use function rtrim;
class PropertyTag implements TagInterface, PhpDocTypedTagInterface
{
/**
* @var array
*/
protected $types = array();
protected $types = [];
/**
* @var string
*/
protected $propertyName = null;
protected $propertyName;
/**
* @var string
*/
protected $description = null;
protected $description;
/**
* @return string
@@ -41,8 +45,8 @@ class PropertyTag implements TagInterface, PhpDocTypedTagInterface
*/
public function initialize($tagDocblockLine)
{
$match = array();
if (!preg_match('#^(.+)?(\$[\S]+)[\s]*(.*)$#m', $tagDocblockLine, $match)) {
$match = [];
if (! preg_match('#^(.+)?(\$[\S]+)[\s]*(.*)$#m', $tagDocblockLine, $match)) {
return;
}
@@ -95,6 +99,6 @@ class PropertyTag implements TagInterface, PhpDocTypedTagInterface
public function __toString()
{
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . "\n";
}
}

View File

@@ -3,23 +3,28 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
use function explode;
use function preg_match;
use function preg_replace;
use function trim;
class ReturnTag implements TagInterface, PhpDocTypedTagInterface
{
/**
* @var array
*/
protected $types = array();
protected $types = [];
/**
* @var string
*/
protected $description = null;
protected $description;
/**
* @return string
@@ -35,8 +40,8 @@ class ReturnTag implements TagInterface, PhpDocTypedTagInterface
*/
public function initialize($tagDocBlockLine)
{
$matches = array();
if (!preg_match('#((?:[\w|\\\]+(?:\[\])*\|?)+)(?:\s+(.*))?#s', $tagDocBlockLine, $matches)) {
$matches = [];
if (! preg_match('#((?:[\w|\\\]+(?:\[\])*\|?)+)(?:\s+(.*))?#s', $tagDocBlockLine, $matches)) {
return;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,23 +3,27 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
use function explode;
use function implode;
use function preg_match;
class ThrowsTag implements TagInterface, PhpDocTypedTagInterface
{
/**
* @var array
*/
protected $types = array();
protected $types = [];
/**
* @var string
*/
protected $description = null;
protected $description;
/**
* @return string
@@ -35,7 +39,7 @@ class ThrowsTag implements TagInterface, PhpDocTypedTagInterface
*/
public function initialize($tagDocBlockLine)
{
$matches = array();
$matches = [];
preg_match('#([\w|\\\]+)(?:\s+(.*))?#', $tagDocBlockLine, $matches);
$this->types = explode('|', $matches[1]);

View File

@@ -0,0 +1,87 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Reflection\DocBlock\Tag;
class VarTag implements TagInterface, PhpDocTypedTagInterface
{
/**
* @var string[]
*/
private $types = [];
/**
* @var string|null
*/
private $variableName;
/**
* @var string|null
*/
private $description;
/**
* {@inheritDoc}
*/
public function getName() : string
{
return 'var';
}
/**
* {@inheritDoc}
*/
public function initialize($tagDocblockLine) : void
{
$match = [];
if (! preg_match(
'#^([^\$]\S+)?\s*(\$[\S]+)?\s*(.*)$#m',
$tagDocblockLine,
$match
)) {
return;
}
if ($match[1] !== '') {
$this->types = explode('|', rtrim($match[1]));
}
if ($match[2] !== '') {
$this->variableName = $match[2];
}
if ($match[3] !== '') {
$this->description = $match[3];
}
}
/**
* {@inheritDoc}
*/
public function getTypes() : array
{
return $this->types;
}
public function getVariableName() : ?string
{
return $this->variableName;
}
public function getDescription() : ?string
{
return $this->description;
}
public function __toString() : string
{
return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -26,6 +26,7 @@ class TagManager extends PrototypeClassFactory
$this->addPrototype(new Tag\AuthorTag());
$this->addPrototype(new Tag\LicenseTag());
$this->addPrototype(new Tag\ThrowsTag());
$this->addPrototype(new Tag\VarTag());
$this->setGenericPrototype(new Tag\GenericTag());
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -14,49 +14,61 @@ use Zend\Code\Reflection\DocBlock\Tag\TagInterface as DocBlockTagInterface;
use Zend\Code\Reflection\DocBlock\TagManager as DocBlockTagManager;
use Zend\Code\Scanner\DocBlockScanner;
use function count;
use function get_class;
use function is_string;
use function ltrim;
use function method_exists;
use function preg_replace;
use function sprintf;
use function substr_count;
class DocBlockReflection implements ReflectionInterface
{
/**
* @var Reflector
*/
protected $reflector = null;
protected $reflector;
/**
* @var string
*/
protected $docComment = null;
protected $docComment;
/**
* @var DocBlockTagManager
*/
protected $tagManager = null;
protected $tagManager;
/**#@+
/**
* @var int
*/
protected $startLine = null;
protected $endLine = null;
/**#@-*/
protected $startLine;
/**
* @var int
*/
protected $endLine;
/**
* @var string
*/
protected $cleanDocComment = null;
protected $cleanDocComment;
/**
* @var string
*/
protected $longDescription = null;
protected $longDescription;
/**
* @var string
*/
protected $shortDescription = null;
protected $shortDescription;
/**
* @var array
*/
protected $tags = array();
protected $tags = [];
/**
* @var bool
@@ -79,11 +91,10 @@ class DocBlockReflection implements ReflectionInterface
* @param Reflector|string $commentOrReflector
* @param null|DocBlockTagManager $tagManager
* @throws Exception\InvalidArgumentException
* @return DocBlockReflection
*/
public function __construct($commentOrReflector, DocBlockTagManager $tagManager = null)
{
if (!$tagManager) {
if (! $tagManager) {
$tagManager = new DocBlockTagManager();
$tagManager->initializeDefaultTags();
}
@@ -91,7 +102,7 @@ class DocBlockReflection implements ReflectionInterface
if ($commentOrReflector instanceof Reflector) {
$this->reflector = $commentOrReflector;
if (!method_exists($commentOrReflector, 'getDocComment')) {
if (! method_exists($commentOrReflector, 'getDocComment')) {
throw new Exception\InvalidArgumentException('Reflector must contain method "getDocComment"');
}
/* @var MethodReflection $commentOrReflector */
@@ -222,11 +233,11 @@ class DocBlockReflection implements ReflectionInterface
public function getTags($filter = null)
{
$this->reflect();
if ($filter === null || !is_string($filter)) {
if ($filter === null || ! is_string($filter)) {
return $this->tags;
}
$returnTags = array();
$returnTags = [];
foreach ($this->tags as $tag) {
if ($tag->getName() == $filter) {
$returnTags[] = $tag;
@@ -251,7 +262,9 @@ class DocBlockReflection implements ReflectionInterface
// create a clean docComment
$this->cleanDocComment = preg_replace("#[ \t]*(?:/\*\*|\*/|\*)[ ]{0,1}(.*)?#", '$1', $docComment);
$this->cleanDocComment = ltrim($this->cleanDocComment, "\r\n"); // @todo should be changed to remove first and last empty line
// @todo should be changed to remove first and last empty line
$this->cleanDocComment = ltrim($this->cleanDocComment, "\r\n");
$scanner = new DocBlockScanner($docComment);
$this->shortDescription = ltrim($scanner->getShortDescription());
@@ -269,15 +282,15 @@ class DocBlockReflection implements ReflectionInterface
*/
public function toString()
{
$str = "DocBlock [ /* DocBlock */ ] {" . PHP_EOL . PHP_EOL;
$str .= " - Tags [" . count($this->tags) . "] {" . PHP_EOL;
$str = 'DocBlock [ /* DocBlock */ ] {' . "\n\n";
$str .= ' - Tags [' . count($this->tags) . '] {' . "\n";
foreach ($this->tags as $tag) {
$str .= " " . $tag;
$str .= ' ' . $tag;
}
$str .= " }" . PHP_EOL;
$str .= "}" . PHP_EOL;
$str .= ' }' . "\n";
$str .= '}' . "\n";
return $str;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,17 +11,29 @@ namespace Zend\Code\Reflection;
use Zend\Code\Scanner\CachingFileScanner;
use function basename;
use function count;
use function current;
use function file_get_contents;
use function get_included_files;
use function in_array;
use function realpath;
use function reset;
use function sprintf;
use function stream_resolve_include_path;
use function substr_count;
class FileReflection implements ReflectionInterface
{
/**
* @var string
*/
protected $filePath = null;
protected $filePath;
/**
* @var string
*/
protected $docComment = null;
protected $docComment;
/**
* @var int
@@ -31,37 +43,37 @@ class FileReflection implements ReflectionInterface
/**
* @var int
*/
protected $endLine = null;
protected $endLine;
/**
* @var string[]
*/
protected $namespaces = array();
protected $namespaces = [];
/**
* @var string[]
*/
protected $uses = array();
protected $uses = [];
/**
* @var string[]
*/
protected $requiredFiles = array();
protected $requiredFiles = [];
/**
* @var ClassReflection[]
*/
protected $classes = array();
protected $classes = [];
/**
* @var FunctionReflection[]
*/
protected $functions = array();
protected $functions = [];
/**
* @var string
*/
protected $contents = null;
protected $contents;
/**
* @param string $filename
@@ -75,15 +87,15 @@ class FileReflection implements ReflectionInterface
$fileRealPath = stream_resolve_include_path($filename);
}
if (!$fileRealPath) {
if (! $fileRealPath) {
throw new Exception\InvalidArgumentException(sprintf(
'No file for %s was found.',
$filename
));
}
if (!in_array($fileRealPath, get_included_files())) {
if (!$includeIfNotAlreadyIncluded) {
if (! in_array($fileRealPath, get_included_files())) {
if (! $includeIfNotAlreadyIncluded) {
throw new Exception\RuntimeException(sprintf(
'File %s must be required before it can be reflected',
$filename
@@ -101,11 +113,10 @@ class FileReflection implements ReflectionInterface
* Required by the Reflector interface.
*
* @todo What should this do?
* @return null
* @return void
*/
public static function export()
{
return;
}
/**
@@ -147,11 +158,11 @@ class FileReflection implements ReflectionInterface
}
/**
* @return DocBlockReflection
* @return DocBlockReflection|false
*/
public function getDocBlock()
{
if (!($docComment = $this->getDocComment())) {
if (! ($docComment = $this->getDocComment())) {
return false;
}
@@ -169,7 +180,7 @@ class FileReflection implements ReflectionInterface
}
/**
* @return string
* @return null|string
*/
public function getNamespace()
{
@@ -195,7 +206,7 @@ class FileReflection implements ReflectionInterface
*/
public function getClasses()
{
$classes = array();
$classes = [];
foreach ($this->classes as $class) {
$classes[] = new ClassReflection($class);
}
@@ -210,7 +221,7 @@ class FileReflection implements ReflectionInterface
*/
public function getFunctions()
{
$functions = array();
$functions = [];
foreach ($this->functions as $function) {
$functions[] = new FunctionReflection($function);
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,20 @@ namespace Zend\Code\Reflection;
use ReflectionFunction;
use function array_shift;
use function array_slice;
use function count;
use function file;
use function implode;
use function preg_match;
use function preg_quote;
use function preg_replace;
use function sprintf;
use function strlen;
use function strrpos;
use function substr;
use function var_export;
class FunctionReflection extends ReflectionFunction implements ReflectionInterface
{
/**
@@ -85,7 +99,7 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
$lines = array_slice(
file($fileName, FILE_IGNORE_NEW_LINES),
$startLine - 1,
($endLine - ($startLine - 1)),
$endLine - ($startLine - 1),
true
);
@@ -98,8 +112,12 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
$content = $matches[0];
}
} else {
$name = substr($this->getName(), strrpos($this->getName(), '\\')+1);
preg_match('#function\s+' . preg_quote($name) . '\s*\([^\)]*\)\s*{([^{}]+({[^}]+})*[^}]+)?}#', $functionLine, $matches);
$name = substr($this->getName(), strrpos($this->getName(), '\\') + 1);
preg_match(
'#function\s+' . preg_quote($name) . '\s*\([^\)]*\)\s*{([^{}]+({[^}]+})*[^}]+)?}#',
$functionLine,
$matches
);
if (isset($matches[0])) {
$content = $matches[0];
}
@@ -113,7 +131,8 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
/**
* Get method prototype
*
* @return array
* @param string $format
* @return array|string
*/
public function getPrototype($format = FunctionReflection::PROTOTYPE_AS_ARRAY)
{
@@ -125,29 +144,31 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
$returnType = count($returnTypes) > 1 ? implode('|', $returnTypes) : $returnTypes[0];
}
$prototype = array(
$prototype = [
'namespace' => $this->getNamespaceName(),
'name' => substr($this->getName(), strlen($this->getNamespaceName()) + 1),
'return' => $returnType,
'arguments' => array(),
);
'arguments' => [],
];
$parameters = $this->getParameters();
foreach ($parameters as $parameter) {
$prototype['arguments'][$parameter->getName()] = array(
'type' => $parameter->getType(),
'required' => !$parameter->isOptional(),
$prototype['arguments'][$parameter->getName()] = [
'type' => $parameter->detectType(),
'required' => ! $parameter->isOptional(),
'by_ref' => $parameter->isPassedByReference(),
'default' => $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null,
);
];
}
if ($format == FunctionReflection::PROTOTYPE_AS_STRING) {
$line = $prototype['return'] . ' ' . $prototype['name'] . '(';
$args = array();
$args = [];
foreach ($prototype['arguments'] as $name => $argument) {
$argsLine = ($argument['type'] ? $argument['type'] . ' ' : '') . ($argument['by_ref'] ? '&' : '') . '$' . $name;
if (!$argument['required']) {
$argsLine = ($argument['type']
? $argument['type'] . ' '
: '') . ($argument['by_ref'] ? '&' : '') . '$' . $name;
if (! $argument['required']) {
$argsLine .= ' = ' . var_export($argument['default'], true);
}
$args[] = $argsLine;
@@ -169,7 +190,7 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
public function getParameters()
{
$phpReflections = parent::getParameters();
$zendReflections = array();
$zendReflections = [];
while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
$instance = new ParameterReflection($this->getName(), $phpReflection->getName());
$zendReflections[] = $instance;
@@ -189,7 +210,7 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
public function getReturn()
{
$docBlock = $this->getDocBlock();
if (!$docBlock->hasTag('return')) {
if (! $docBlock->hasTag('return')) {
throw new Exception\InvalidArgumentException(
'Function does not specify an @return annotation tag; cannot determine return type'
);
@@ -226,7 +247,7 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
$lines = array_slice(
file($fileName, FILE_IGNORE_NEW_LINES),
$startLine - 1,
($endLine - ($startLine - 1)),
$endLine - ($startLine - 1),
true
);
@@ -239,7 +260,7 @@ class FunctionReflection extends ReflectionFunction implements ReflectionInterfa
$body = $matches[2];
}
} else {
$name = substr($this->getName(), strrpos($this->getName(), '\\')+1);
$name = substr($this->getName(), strrpos($this->getName(), '\\') + 1);
preg_match('#function\s+' . $name . '\s*\([^\)]*\)\s*{([^{}]+({[^}]+})*[^}]+)}#', $functionLine, $matches);
if (isset($matches[1])) {
$body = $matches[1];

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -14,6 +14,21 @@ use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\Scanner\AnnotationScanner;
use Zend\Code\Scanner\CachingFileScanner;
use function array_shift;
use function array_slice;
use function class_exists;
use function count;
use function file;
use function file_exists;
use function implode;
use function is_array;
use function rtrim;
use function strlen;
use function substr;
use function token_get_all;
use function token_name;
use function var_export;
class MethodReflection extends PhpReflectionMethod implements ReflectionInterface
{
/**
@@ -29,7 +44,7 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
/**
* @var AnnotationScanner
*/
protected $annotations = null;
protected $annotations;
/**
* Retrieve method DocBlock reflection
@@ -49,7 +64,7 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
/**
* @param AnnotationManager $annotationManager
* @return AnnotationScanner
* @return AnnotationScanner|false
*/
public function getAnnotations(AnnotationManager $annotationManager)
{
@@ -64,7 +79,7 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
$cachingFileScanner = $this->createFileScanner($this->getFileName());
$nameInformation = $cachingFileScanner->getClassNameInformation($this->getDeclaringClass()->getName());
if (!$nameInformation) {
if (! $nameInformation) {
return false;
}
@@ -107,7 +122,8 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
/**
* Get method prototype
*
* @return array
* @param string $format
* @return array|string
*/
public function getPrototype($format = MethodReflection::PROTOTYPE_AS_ARRAY)
{
@@ -120,31 +136,33 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
}
$declaringClass = $this->getDeclaringClass();
$prototype = array(
$prototype = [
'namespace' => $declaringClass->getNamespaceName(),
'class' => substr($declaringClass->getName(), strlen($declaringClass->getNamespaceName()) + 1),
'name' => $this->getName(),
'visibility' => ($this->isPublic() ? 'public' : ($this->isPrivate() ? 'private' : 'protected')),
'visibility' => $this->isPublic() ? 'public' : ($this->isPrivate() ? 'private' : 'protected'),
'return' => $returnType,
'arguments' => array(),
);
'arguments' => [],
];
$parameters = $this->getParameters();
foreach ($parameters as $parameter) {
$prototype['arguments'][$parameter->getName()] = array(
'type' => $parameter->getType(),
'required' => !$parameter->isOptional(),
$prototype['arguments'][$parameter->getName()] = [
'type' => $parameter->detectType(),
'required' => ! $parameter->isOptional(),
'by_ref' => $parameter->isPassedByReference(),
'default' => $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null,
);
];
}
if ($format == MethodReflection::PROTOTYPE_AS_STRING) {
$line = $prototype['visibility'] . ' ' . $prototype['return'] . ' ' . $prototype['name'] . '(';
$args = array();
$args = [];
foreach ($prototype['arguments'] as $name => $argument) {
$argsLine = ($argument['type'] ? $argument['type'] . ' ' : '') . ($argument['by_ref'] ? '&' : '') . '$' . $name;
if (!$argument['required']) {
$argsLine = ($argument['type'] ?
$argument['type'] . ' '
: '') . ($argument['by_ref'] ? '&' : '') . '$' . $name;
if (! $argument['required']) {
$argsLine .= ' = ' . var_export($argument['default'], true);
}
$args[] = $argsLine;
@@ -166,10 +184,10 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
public function getParameters()
{
$phpReflections = parent::getParameters();
$zendReflections = array();
$zendReflections = [];
while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
$instance = new ParameterReflection(
array($this->getDeclaringClass()->getName(), $this->getName()),
[$this->getDeclaringClass()->getName(), $this->getName()],
$phpReflection->getName()
);
$zendReflections[] = $instance;
@@ -189,7 +207,7 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
public function getContents($includeDocBlock = true)
{
$docComment = $this->getDocComment();
$content = ($includeDocBlock && !empty($docComment)) ? $docComment . "\n" : '';
$content = $includeDocBlock && ! empty($docComment) ? $docComment . "\n" : '';
$content .= $this->extractMethodContents();
return $content;
@@ -222,17 +240,17 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
$lines = array_slice(
file($fileName, FILE_IGNORE_NEW_LINES),
$this->getStartLine() - 1,
($this->getEndLine() - ($this->getStartLine() - 1)),
$this->getEndLine() - ($this->getStartLine() - 1),
true
);
$functionLine = implode("\n", $lines);
$tokens = token_get_all("<?php ". $functionLine);
$tokens = token_get_all('<?php ' . $functionLine);
//remove first entry which is php open tag
array_shift($tokens);
if (!count($tokens)) {
if (! count($tokens)) {
return '';
}
@@ -241,17 +259,17 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
$body = '';
foreach ($tokens as $key => $token) {
$tokenType = (is_array($token)) ? token_name($token[0]) : $token;
$tokenValue = (is_array($token)) ? $token[1] : $token;
$tokenType = is_array($token) ? token_name($token[0]) : $token;
$tokenValue = is_array($token) ? $token[1] : $token;
switch ($tokenType) {
case "T_FINAL":
case "T_ABSTRACT":
case "T_PUBLIC":
case "T_PROTECTED":
case "T_PRIVATE":
case "T_STATIC":
case "T_FUNCTION":
case 'T_FINAL':
case 'T_ABSTRACT':
case 'T_PUBLIC':
case 'T_PROTECTED':
case 'T_PRIVATE':
case 'T_STATIC':
case 'T_FUNCTION':
// check to see if we have a valid function
// then check if we are inside function and have a closure
if ($this->isValidFunction($tokens, $key, $this->getName())) {
@@ -267,33 +285,33 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
$capture = true;
} else {
//closure test
if ($firstBrace && $tokenType == "T_FUNCTION") {
if ($firstBrace && $tokenType == 'T_FUNCTION') {
$body .= $tokenValue;
continue;
break;
}
$capture = false;
continue;
break;
}
break;
case "{":
case '{':
if ($capture === false) {
continue;
break;
}
if ($firstBrace === false) {
$firstBrace = true;
if ($bodyOnly === true) {
continue;
break;
}
}
$body .= $tokenValue;
break;
case "}":
case '}':
if ($capture === false) {
continue;
break;
}
//check to see if this is the last brace
@@ -311,12 +329,12 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
default:
if ($capture === false) {
continue;
break;
}
// if returning body only wait for first brace before capturing
if ($bodyOnly === true && $firstBrace !== true) {
continue;
break;
}
$body .= $tokenValue;
@@ -339,16 +357,16 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
{
$content = '';
$count = count($haystack);
if ($position+1 == $count) {
if ($position + 1 == $count) {
return $content;
}
for ($i = $position-1;$i >= 0;$i--) {
$tokenType = (is_array($haystack[$i])) ? token_name($haystack[$i][0]) : $haystack[$i];
$tokenValue = (is_array($haystack[$i])) ? $haystack[$i][1] : $haystack[$i];
for ($i = $position - 1; $i >= 0; $i--) {
$tokenType = is_array($haystack[$i]) ? token_name($haystack[$i][0]) : $haystack[$i];
$tokenValue = is_array($haystack[$i]) ? $haystack[$i][1] : $haystack[$i];
//search only for whitespace
if ($tokenType == "T_WHITESPACE") {
if ($tokenType == 'T_WHITESPACE') {
$content .= $tokenValue;
} else {
break;
@@ -370,24 +388,24 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
$count = count($haystack);
//advance one position
$position = $position+1;
$position = $position + 1;
if ($position == $count) {
return true;
}
for ($i = $position;$i < $count; $i++) {
$tokenType = (is_array($haystack[$i])) ? token_name($haystack[$i][0]) : $haystack[$i];
for ($i = $position; $i < $count; $i++) {
$tokenType = is_array($haystack[$i]) ? token_name($haystack[$i][0]) : $haystack[$i];
switch ($tokenType) {
case "T_FINAL":
case "T_ABSTRACT":
case "T_PUBLIC":
case "T_PROTECTED":
case "T_PRIVATE":
case "T_STATIC":
case 'T_FINAL':
case 'T_ABSTRACT':
case 'T_PUBLIC':
case 'T_PROTECTED':
case 'T_PRIVATE':
case 'T_STATIC':
return true;
case "T_FUNCTION":
case 'T_FUNCTION':
// If a function is encountered and that function is not a closure
// then return true. otherwise the function is a closure, return false
if ($this->isValidFunction($haystack, $i)) {
@@ -395,32 +413,31 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
}
return false;
case "}":
case ";";
case "T_BREAK":
case "T_CATCH":
case "T_DO":
case "T_ECHO":
case "T_ELSE":
case "T_ELSEIF":
case "T_EVAL":
case "T_EXIT":
case "T_FINALLY":
case "T_FOR":
case "T_FOREACH":
case "T_GOTO":
case "T_IF":
case "T_INCLUDE":
case "T_INCLUDE_ONCE":
case "T_PRINT":
case "T_STRING":
case "T_STRING_VARNAME":
case "T_THROW":
case "T_USE":
case "T_VARIABLE":
case "T_WHILE":
case "T_YIELD":
case '}':
case ';':
case 'T_BREAK':
case 'T_CATCH':
case 'T_DO':
case 'T_ECHO':
case 'T_ELSE':
case 'T_ELSEIF':
case 'T_EVAL':
case 'T_EXIT':
case 'T_FINALLY':
case 'T_FOR':
case 'T_FOREACH':
case 'T_GOTO':
case 'T_IF':
case 'T_INCLUDE':
case 'T_INCLUDE_ONCE':
case 'T_PRINT':
case 'T_STRING':
case 'T_STRING_VARNAME':
case 'T_THROW':
case 'T_USE':
case 'T_VARIABLE':
case 'T_WHILE':
case 'T_YIELD':
return false;
}
}
@@ -439,12 +456,12 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
{
$isValid = false;
$count = count($haystack);
for ($i = $position+1; $i < $count; $i++) {
$tokenType = (is_array($haystack[$i])) ? token_name($haystack[$i][0]) : $haystack[$i];
$tokenValue = (is_array($haystack[$i])) ? $haystack[$i][1] : $haystack[$i];
for ($i = $position + 1; $i < $count; $i++) {
$tokenType = is_array($haystack[$i]) ? token_name($haystack[$i][0]) : $haystack[$i];
$tokenValue = is_array($haystack[$i]) ? $haystack[$i][1] : $haystack[$i];
//check for occurance of ( or
if ($tokenType == "T_STRING") {
//check for occurrence of ( or
if ($tokenType == 'T_STRING') {
//check to see if function name is passed, if so validate against that
if ($functionName !== null && $tokenValue != $functionName) {
$isValid = false;
@@ -453,7 +470,7 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
$isValid = true;
break;
} elseif ($tokenValue == "(") {
} elseif ($tokenValue == '(') {
break;
}
}
@@ -480,7 +497,7 @@ class MethodReflection extends PhpReflectionMethod implements ReflectionInterfac
/**
* Creates a new FileScanner instance.
*
* By having this as a seperate method it allows the method to be overridden
* By having this as a separate method it allows the method to be overridden
* if a different FileScanner is needed.
*
* @param string $filename

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,8 @@ namespace Zend\Code\Reflection;
use ReflectionParameter;
use function method_exists;
class ParameterReflection extends ReflectionParameter implements ReflectionInterface
{
/**
@@ -35,13 +37,13 @@ class ParameterReflection extends ReflectionParameter implements ReflectionInter
/**
* Get class reflection object
*
* @return ClassReflection
* @return null|ClassReflection
*/
public function getClass()
{
$phpReflection = parent::getClass();
if ($phpReflection === null) {
return;
return null;
}
$zendReflection = new ClassReflection($phpReflection->getName());
@@ -71,13 +73,24 @@ class ParameterReflection extends ReflectionParameter implements ReflectionInter
/**
* Get parameter type
*
* @return string
* @return string|null
*/
public function getType()
public function detectType()
{
if (method_exists($this, 'getType')
&& ($type = $this->getType())
&& $type->isBuiltin()
) {
return $type->getName();
}
// can be dropped when dropping PHP7 support:
if ($this->isArray()) {
return 'array';
} elseif (method_exists($this, 'isCallable') && $this->isCallable()) {
}
// can be dropped when dropping PHP7 support:
if ($this->isCallable()) {
return 'callable';
}
@@ -86,16 +99,18 @@ class ParameterReflection extends ReflectionParameter implements ReflectionInter
}
$docBlock = $this->getDeclaringFunction()->getDocBlock();
if (!$docBlock instanceof DocBlockReflection) {
return;
if (! $docBlock instanceof DocBlockReflection) {
return null;
}
$params = $docBlock->getTags('param');
if (isset($params[$this->getPosition()])) {
return $params[$this->getPosition()]->getType();
}
return;
return null;
}
/**

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -53,7 +53,7 @@ class PropertyReflection extends PhpReflectionProperty implements ReflectionInte
*/
public function getDocBlock()
{
if (!($docComment = $this->getDocComment())) {
if (! ($docComment = $this->getDocComment())) {
return false;
}
@@ -64,7 +64,7 @@ class PropertyReflection extends PhpReflectionProperty implements ReflectionInte
/**
* @param AnnotationManager $annotationManager
* @return AnnotationScanner
* @return AnnotationScanner|false
*/
public function getAnnotations(AnnotationManager $annotationManager)
{
@@ -80,7 +80,7 @@ class PropertyReflection extends PhpReflectionProperty implements ReflectionInte
$cachingFileScanner = $this->createFileScanner($class->getFileName());
$nameInformation = $cachingFileScanner->getClassNameInformation($class->getName());
if (!$nameInformation) {
if (! $nameInformation) {
return false;
}
@@ -100,7 +100,7 @@ class PropertyReflection extends PhpReflectionProperty implements ReflectionInte
/**
* Creates a new FileScanner instance.
*
* By having this as a seperate method it allows the method to be overridden
* By having this as a separate method it allows the method to be overridden
* if a different FileScanner is needed.
*
* @param string $filename

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -27,18 +27,13 @@ class AggregateDirectoryScanner extends DirectoryScanner
// @todo
}
/*
public function getUses($returnScannerClass = false)
{}
*/
public function getIncludes($returnScannerClass = false)
{
}
public function getClasses($returnScannerClass = false, $returnDerivedScannerClass = false)
{
$classes = array();
$classes = [];
foreach ($this->directories as $scanner) {
$classes += $scanner->getClasses();
}
@@ -65,7 +60,7 @@ class AggregateDirectoryScanner extends DirectoryScanner
}
}
return (isset($scanner));
return isset($scanner);
}
/**
@@ -85,7 +80,7 @@ class AggregateDirectoryScanner extends DirectoryScanner
}
}
if (!isset($scanner)) {
if (! isset($scanner)) {
throw new Exception\RuntimeException('Class by that name was not found.');
}
@@ -101,8 +96,8 @@ class AggregateDirectoryScanner extends DirectoryScanner
{
$this->scan();
if (!$returnScannerClass) {
$functions = array();
if (! $returnScannerClass) {
$functions = [];
foreach ($this->infos as $info) {
if ($info['type'] == 'function') {
$functions[] = $info['name'];

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,6 +13,18 @@ use Zend\Code\Annotation\AnnotationCollection;
use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\NameInformation;
use function array_pop;
use function current;
use function in_array;
use function is_string;
use function next;
use function preg_match;
use function reset;
use function strlen;
use function strpos;
use function substr;
use function substr_count;
class AnnotationScanner extends AnnotationCollection implements ScannerInterface
{
/**
@@ -23,22 +35,22 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
/**
* @var string
*/
protected $docComment = null;
protected $docComment;
/**
* @var NameInformation
*/
protected $nameInformation = null;
protected $nameInformation;
/**
* @var AnnotationManager
*/
protected $annotationManager = null;
protected $annotationManager;
/**
* @var array
*/
protected $annotations = array();
protected $annotations = [];
/**
* @param AnnotationManager $annotationManager
@@ -70,7 +82,7 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
*/
protected function scan(array $tokens)
{
$annotations = array();
$annotations = [];
$annotationIndex = -1;
$contentEnd = false;
@@ -80,28 +92,27 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
$token = current($tokens);
switch ($token[0]) {
case 'ANNOTATION_CLASS':
$contentEnd = false;
$annotationIndex++;
$class = substr($token[1], 1);
$class = $this->nameInformation->resolveName($class);
$annotations[$annotationIndex] = array($class, null);
$annotations[$annotationIndex] = [$class, null];
goto SCANNER_CONTINUE;
// goto no break needed
case 'ANNOTATION_CONTENT_START':
$annotations[$annotationIndex][1] = '';
//fall-through
// fall-through
case 'ANNOTATION_CONTENT_END':
case 'ANNOTATION_CONTENT':
case 'ANNOTATION_WHITESPACE':
case 'ANNOTATION_NEWLINE':
if (!$contentEnd && isset($annotations[$annotationIndex]) && is_string($annotations[$annotationIndex][1])) {
if (! $contentEnd
&& isset($annotations[$annotationIndex])
&& is_string($annotations[$annotationIndex][1])
) {
$annotations[$annotationIndex][1] .= $token[1];
}
@@ -110,6 +121,7 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
}
goto SCANNER_CONTINUE;
// goto no break needed
}
SCANNER_CONTINUE:
@@ -142,7 +154,7 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
$context = 0x00;
$stream = $this->docComment;
$streamIndex = null;
$tokens = array();
$tokens = [];
$tokenIndex = null;
$currentChar = null;
$currentWord = null;
@@ -150,21 +162,31 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
$annotationParentCount = 0;
$MACRO_STREAM_ADVANCE_CHAR = function ($positionsForward = 1) use (&$stream, &$streamIndex, &$currentChar, &$currentWord, &$currentLine) {
$positionsForward = ($positionsForward > 0) ? $positionsForward : 1;
$streamIndex = ($streamIndex === null) ? 0 : $streamIndex + $positionsForward;
if (!isset($stream[$streamIndex])) {
$MACRO_STREAM_ADVANCE_CHAR = function ($positionsForward = 1) use (
&$stream,
&$streamIndex,
&$currentChar,
&$currentWord,
&$currentLine
) {
$positionsForward = $positionsForward > 0 ? $positionsForward : 1;
$streamIndex = $streamIndex === null ? 0 : $streamIndex + $positionsForward;
if (! isset($stream[$streamIndex])) {
$currentChar = false;
return false;
}
$currentChar = $stream[$streamIndex];
$matches = array();
$currentLine = (preg_match('#(.*?)(?:\n|\r\n?)#', $stream, $matches, null, $streamIndex) === 1) ? $matches[1] : substr($stream, $streamIndex);
$matches = [];
$currentLine = preg_match('#(.*?)(?:\n|\r\n?)#', $stream, $matches, null, $streamIndex) === 1
? $matches[1]
: substr($stream, $streamIndex);
if ($currentChar === ' ') {
$currentWord = (preg_match('#( +)#', $currentLine, $matches) === 1) ? $matches[1] : $currentLine;
$currentWord = preg_match('#( +)#', $currentLine, $matches) === 1 ? $matches[1] : $currentLine;
} else {
$currentWord = (($matches = strpos($currentLine, ' ')) !== false) ? substr($currentLine, 0, $matches) : $currentLine;
$currentWord = ($matches = strpos($currentLine, ' ')) !== false
? substr($currentLine, 0, $matches)
: $currentLine;
}
return $currentChar;
@@ -176,8 +198,8 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentLine));
};
$MACRO_TOKEN_ADVANCE = function () use (&$tokenIndex, &$tokens) {
$tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
$tokens[$tokenIndex] = array('ANNOTATION_UNKNOWN', '');
$tokenIndex = $tokenIndex === null ? 0 : $tokenIndex + 1;
$tokens[$tokenIndex] = ['ANNOTATION_UNKNOWN', ''];
};
$MACRO_TOKEN_SET_TYPE = function ($type) use (&$tokenIndex, &$tokens) {
$tokens[$tokenIndex][0] = $type;
@@ -192,7 +214,7 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
$tokens[$tokenIndex][1] .= $currentLine;
};
$MACRO_HAS_CONTEXT = function ($which) use (&$context) {
return (($context & $which) === $which);
return ($context & $which) === $which;
};
$MACRO_STREAM_ADVANCE_CHAR();
@@ -213,7 +235,7 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
}
if ($MACRO_HAS_CONTEXT($CONTEXT_CLASS)) {
if (in_array($currentChar, array(' ', '(', "\n", "\r"))) {
if (in_array($currentChar, [' ', '(', "\n", "\r"])) {
$context &= ~$CONTEXT_CLASS;
$MACRO_TOKEN_ADVANCE();
} else {
@@ -226,8 +248,8 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
}
// Since we don't know what line endings are used in the file, we check for all scenarios. If we find a
// cariage return (\r), we check the next character for a line feed (\n). If so we consume it and act as
// if the cariage return was a line feed.
// carriage return (\r), we check the next character for a line feed (\n). If so we consume it and act as
// if the carriage return was a line feed.
$lineEnded = $currentChar === "\n";
if ($currentChar === "\r") {
$lineEnded = true;
@@ -253,7 +275,11 @@ class AnnotationScanner extends AnnotationCollection implements ScannerInterface
}
if ($currentChar === ' ') {
$MACRO_TOKEN_SET_TYPE(($MACRO_HAS_CONTEXT($CONTEXT_ASTERISK)) ? 'ANNOTATION_WHITESPACE' : 'ANNOTATION_WHITESPACE_INDENT');
$MACRO_TOKEN_SET_TYPE(
$MACRO_HAS_CONTEXT($CONTEXT_ASTERISK)
? 'ANNOTATION_WHITESPACE'
: 'ANNOTATION_WHITESPACE_INDENT'
);
$MACRO_TOKEN_APPEND_WORD();
$MACRO_TOKEN_ADVANCE();
if ($MACRO_STREAM_ADVANCE_WORD() === false) {

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,17 +13,23 @@ use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\Exception;
use Zend\Code\NameInformation;
use function file_exists;
use function md5;
use function realpath;
use function spl_object_hash;
use function sprintf;
class CachingFileScanner extends FileScanner
{
/**
* @var array
*/
protected static $cache = array();
protected static $cache = [];
/**
* @var null|FileScanner
*/
protected $fileScanner = null;
protected $fileScanner;
/**
* @param string $file
@@ -32,7 +38,7 @@ class CachingFileScanner extends FileScanner
*/
public function __construct($file, AnnotationManager $annotationManager = null)
{
if (!file_exists($file)) {
if (! file_exists($file)) {
throw new Exception\InvalidArgumentException(sprintf(
'File "%s" not found',
$file
@@ -41,7 +47,9 @@ class CachingFileScanner extends FileScanner
$file = realpath($file);
$cacheId = md5($file) . '/' . ((isset($annotationManager) ? spl_object_hash($annotationManager) : 'no-annotation'));
$cacheId = md5($file) . '/' . (isset($annotationManager)
? spl_object_hash($annotationManager)
: 'no-annotation');
if (isset(static::$cache[$cacheId])) {
$this->fileScanner = static::$cache[$cacheId];
@@ -56,7 +64,7 @@ class CachingFileScanner extends FileScanner
*/
public static function clearCache()
{
static::$cache = array();
static::$cache = [];
}
/**

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -14,6 +14,24 @@ use Zend\Code\Annotation;
use Zend\Code\Exception;
use Zend\Code\NameInformation;
use function array_key_exists;
use function array_merge;
use function array_search;
use function array_slice;
use function array_values;
use function define;
use function defined;
use function explode;
use function in_array;
use function is_array;
use function is_int;
use function is_object;
use function is_string;
use function ltrim;
use function sprintf;
use function substr_count;
use function trigger_error;
class ClassScanner implements ScannerInterface
{
/**
@@ -24,27 +42,27 @@ class ClassScanner implements ScannerInterface
/**
* @var string
*/
protected $docComment = null;
protected $docComment;
/**
* @var string
*/
protected $name = null;
protected $name;
/**
* @var string
*/
protected $shortName = null;
protected $shortName;
/**
* @var int
*/
protected $lineStart = null;
protected $lineStart;
/**
* @var int
*/
protected $lineEnd = null;
protected $lineEnd;
/**
* @var bool
@@ -69,47 +87,47 @@ class ClassScanner implements ScannerInterface
/**
* @var string
*/
protected $parentClass = null;
protected $parentClass;
/**
* @var string
*/
protected $shortParentClass = null;
protected $shortParentClass;
/**
* @var array
*/
protected $interfaces = array();
protected $interfaces = [];
/**
* @var array
*/
protected $shortInterfaces = array();
protected $shortInterfaces = [];
/**
* @var array
*/
protected $tokens = array();
protected $tokens = [];
/**
* @var NameInformation
*/
protected $nameInformation = null;
protected $nameInformation;
/**
* @var array
*/
protected $infos = array();
protected $infos = [];
/**
* @var array
*/
protected $traits = array();
protected $traits = [];
/**
* @var array
*/
protected $methods = array();
protected $methods = [];
/**
* @param array $classTokens
@@ -156,7 +174,7 @@ class ClassScanner implements ScannerInterface
*/
public function getDocBlock()
{
if (!$docComment = $this->getDocComment()) {
if (! $docComment = $this->getDocComment()) {
return false;
}
@@ -220,6 +238,7 @@ class ClassScanner implements ScannerInterface
/**
* Verify if class is a trait
*
* @return bool
*/
public function isTrait()
@@ -236,7 +255,7 @@ class ClassScanner implements ScannerInterface
public function isInstantiable()
{
$this->scan();
return (!$this->isAbstract && !$this->isInterface);
return ! $this->isAbstract && ! $this->isInterface && ! $this->isTrait;
}
/**
@@ -269,7 +288,7 @@ class ClassScanner implements ScannerInterface
public function hasParentClass()
{
$this->scan();
return ($this->parentClass !== null);
return $this->parentClass !== null;
}
/**
@@ -303,7 +322,7 @@ class ClassScanner implements ScannerInterface
{
$this->scan();
$return = array();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] != 'constant') {
continue;
@@ -330,7 +349,7 @@ class ClassScanner implements ScannerInterface
$this->scan();
$return = array();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] != 'constant') {
continue;
@@ -366,7 +385,7 @@ class ClassScanner implements ScannerInterface
break;
}
}
if (!$constantFound) {
if (! $constantFound) {
return false;
}
} else {
@@ -374,7 +393,7 @@ class ClassScanner implements ScannerInterface
'Invalid constant name of info index type. Must be of type int or string'
);
}
if (!isset($info)) {
if (! isset($info)) {
return false;
}
$p = new ConstantScanner(
@@ -414,7 +433,7 @@ class ClassScanner implements ScannerInterface
{
$this->scan();
$return = array();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] != 'property') {
continue;
@@ -435,7 +454,7 @@ class ClassScanner implements ScannerInterface
{
$this->scan();
$return = array();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] != 'property') {
continue;
@@ -471,7 +490,7 @@ class ClassScanner implements ScannerInterface
break;
}
}
if (!$propertyFound) {
if (! $propertyFound) {
return false;
}
} else {
@@ -479,7 +498,7 @@ class ClassScanner implements ScannerInterface
'Invalid property name of info index type. Must be of type int or string'
);
}
if (!isset($info)) {
if (! isset($info)) {
return false;
}
$p = new PropertyScanner(
@@ -547,7 +566,9 @@ class ClassScanner implements ScannerInterface
*/
public function getTraitNames()
{
$return = array();
$this->scan();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] !== 'use') {
continue;
@@ -562,7 +583,6 @@ class ClassScanner implements ScannerInterface
$return[] = $traitName;
}
}
break;
}
return $return;
@@ -575,7 +595,9 @@ class ClassScanner implements ScannerInterface
*/
public function getTraitAliases()
{
$return = array();
$this->scan();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] !== 'use') {
continue;
@@ -598,7 +620,6 @@ class ClassScanner implements ScannerInterface
$return[$alias['alias']] = $trait . '::' . $method;
}
}
break;
}
return $return;
@@ -612,6 +633,8 @@ class ClassScanner implements ScannerInterface
*/
protected function getVisibilityForAlias($aliasName)
{
$this->scan();
$return = null;
foreach ($this->infos as $info) {
if ($info['type'] !== 'use') {
@@ -632,7 +655,6 @@ class ClassScanner implements ScannerInterface
}
}
}
break;
}
return $return;
@@ -645,7 +667,9 @@ class ClassScanner implements ScannerInterface
*/
protected function getBlockedTraitMethods()
{
$return = array();
$this->scan();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] !== 'use') {
continue;
@@ -668,7 +692,6 @@ class ClassScanner implements ScannerInterface
$return[] = $trait . '::' . $method;
}
}
break;
}
return $return;
@@ -684,7 +707,7 @@ class ClassScanner implements ScannerInterface
$this->scan();
$methods = $this->getMethods();
$return = array();
$return = [];
foreach ($methods as $method) {
$return[] = $method->getName();
}
@@ -711,8 +734,8 @@ class ClassScanner implements ScannerInterface
}
// Merge in trait methods
if ($info['type'] === "use") {
$traitMethods = array();
if ($info['type'] === 'use') {
$traitMethods = [];
$traits = $this->getTraits();
$insteadof = $this->getBlockedTraitMethods();
$aliases = $this->getTraitAliases();
@@ -845,14 +868,13 @@ class ClassScanner implements ScannerInterface
return;
}
if (!$this->tokens) {
if (! $this->tokens) {
throw new Exception\RuntimeException('No tokens were provided');
}
/**
* Variables & Setup
*/
$tokens = &$this->tokens; // localize
$infos = &$this->infos; // localize
$tokenIndex = null;
@@ -876,8 +898,8 @@ class ClassScanner implements ScannerInterface
&$tokenLine
) {
static $lastTokenArray = null;
$tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
if (!isset($tokens[$tokenIndex])) {
$tokenIndex = $tokenIndex === null ? 0 : $tokenIndex + 1;
if (! isset($tokens[$tokenIndex])) {
$token = false;
$tokenContent = false;
$tokenType = false;
@@ -890,13 +912,13 @@ class ClassScanner implements ScannerInterface
if (is_string($token)) {
$tokenType = null;
$tokenContent = $token;
$tokenLine = $tokenLine + substr_count(
$lastTokenArray[1],
$tokenLine += substr_count(
$lastTokenArray[1] ?? '',
"\n"
); // adjust token line by last known newline count
} else {
$lastTokenArray = $token;
list($tokenType, $tokenContent, $tokenLine) = $token;
[$tokenType, $tokenContent, $tokenLine] = $token;
}
return $tokenIndex;
@@ -912,16 +934,13 @@ class ClassScanner implements ScannerInterface
/**
* START FINITE STATE MACHINE FOR SCANNING TOKENS
*/
// Initialize token
$MACRO_TOKEN_ADVANCE();
SCANNER_TOP:
switch ($tokenType) {
case T_DOC_COMMENT:
$this->docComment = $tokenContent;
goto SCANNER_CONTINUE;
//goto no break needed
@@ -931,7 +950,6 @@ class ClassScanner implements ScannerInterface
case T_CLASS:
case T_INTERFACE:
case T_TRAIT:
// CLASS INFORMATION
$classContext = null;
@@ -946,7 +964,6 @@ class ClassScanner implements ScannerInterface
$this->lineStart = $tokenLine;
switch ($tokenType) {
case T_FINAL:
$this->isFinal = true;
goto SCANNER_CLASS_INFO_CONTINUE;
@@ -966,10 +983,11 @@ class ClassScanner implements ScannerInterface
$this->name = $this->shortName;
}
goto SCANNER_CLASS_INFO_CONTINUE;
// goto no break needed
case T_INTERFACE:
$this->isInterface = true;
//fall-through
// fall-through
case T_CLASS:
$this->shortName = $tokens[$tokenIndex + 2][1];
if ($this->nameInformation && $this->nameInformation->hasNamespace()) {
@@ -978,38 +996,43 @@ class ClassScanner implements ScannerInterface
$this->name = $this->shortName;
}
goto SCANNER_CLASS_INFO_CONTINUE;
//goto no break needed
// goto no break needed
case T_NS_SEPARATOR:
case T_STRING:
switch ($classContext) {
case T_EXTENDS:
$this->shortParentClass .= $tokenContent;
if ($this->isInterface) {
$this->shortInterfaces[$classInterfaceIndex] .= $tokenContent;
} else {
$this->shortParentClass .= $tokenContent;
}
break;
case T_IMPLEMENTS:
$this->shortInterfaces[$classInterfaceIndex] .= $tokenContent;
break;
}
goto SCANNER_CLASS_INFO_CONTINUE;
//goto no break needed
// goto no break needed
case T_EXTENDS:
case T_IMPLEMENTS:
$classContext = $tokenType;
if (($this->isInterface && $classContext === T_EXTENDS) || $classContext === T_IMPLEMENTS) {
$this->shortInterfaces[$classInterfaceIndex] = '';
} elseif (!$this->isInterface && $classContext === T_EXTENDS) {
} elseif (! $this->isInterface && $classContext === T_EXTENDS) {
$this->shortParentClass = '';
}
goto SCANNER_CLASS_INFO_CONTINUE;
//goto no break needed
// goto no break needed
case null:
if ($classContext == T_IMPLEMENTS && $tokenContent == ',') {
if (($classContext == T_IMPLEMENTS && $tokenContent == ',')
|| ($classContext == T_EXTENDS && $tokenContent == ',' && $this->isInterface)
) {
$classInterfaceIndex++;
$this->shortInterfaces[$classInterfaceIndex] = '';
}
}
SCANNER_CLASS_INFO_CONTINUE:
@@ -1022,7 +1045,6 @@ class ClassScanner implements ScannerInterface
SCANNER_CLASS_INFO_END:
goto SCANNER_CONTINUE;
}
if ($tokenType === null && $tokenContent === '{' && $braceCount === 0) {
@@ -1038,10 +1060,8 @@ class ClassScanner implements ScannerInterface
}
switch ($tokenType) {
case T_CONST:
$infos[$infoIndex] = array(
$infos[$infoIndex] = [
'type' => 'constant',
'tokenStart' => $tokenIndex,
'tokenEnd' => null,
@@ -1049,7 +1069,7 @@ class ClassScanner implements ScannerInterface
'lineEnd' => null,
'name' => null,
'value' => null,
);
];
SCANNER_CLASS_BODY_CONST_TOP:
@@ -1080,21 +1100,21 @@ class ClassScanner implements ScannerInterface
define('T_INSTEADOF', 24000);
}
$infos[$infoIndex] = array(
$infos[$infoIndex] = [
'type' => 'use',
'tokenStart' => $tokenIndex,
'tokenEnd' => null,
'lineStart' => $tokens[$tokenIndex][2],
'lineEnd' => null,
'name' => $namespace,
'use_statements' => array(0 => null),
'aliases' => array(0 => null),
);
'use_statements' => [0 => null],
'aliases' => [0 => null],
];
$isOriginalName = array(T_STRING, T_DOUBLE_COLON);
$isAlias = array(T_STRING);
$isVisibility = array(T_PRIVATE, T_PROTECTED, T_PUBLIC, T_STATIC);
$isAliasType = array(T_AS, T_INSTEADOF);
$isOriginalName = [T_STRING, T_DOUBLE_COLON];
$isAlias = [T_STRING];
$isVisibility = [T_PRIVATE, T_PROTECTED, T_PUBLIC, T_STATIC];
$isAliasType = [T_AS, T_INSTEADOF];
$isValidAlias = array_merge($isOriginalName, $isAlias, $isVisibility, $isAliasType);
$useStatementIndex = 0;
@@ -1110,16 +1130,16 @@ class ClassScanner implements ScannerInterface
SCANNER_USE_TOP:
if ($tokenType === null) {
if ($tokenContent === "{") {
if ($tokenContent === '{') {
$useStatementIndex = 0;
$useAliasContext = true;
$infos[$infoIndex]['aliases'][$useStatementIndex] = array(
$infos[$infoIndex]['aliases'][$useStatementIndex] = [
'original' => null,
'alias' => null,
'visibility' => null,
'type' => 'as'
);
} elseif ($tokenContent === "}") {
'type' => 'as',
];
} elseif ($tokenContent === '}') {
$useAliasContext = false;
goto SCANNER_USE_END;
} elseif ($tokenContent === ';') {
@@ -1148,17 +1168,17 @@ class ClassScanner implements ScannerInterface
if (in_array($tokenType, $isValidAlias)
&& empty($infos[$infoIndex]['aliases'][$useStatementIndex])
) {
$infos[$infoIndex]['aliases'][$useStatementIndex] = array(
$infos[$infoIndex]['aliases'][$useStatementIndex] = [
'original' => null,
'visibility' => null,
'alias' => null,
'type' => null
);
'type' => null,
];
}
if ($tokenType == T_AS || $tokenType == T_INSTEADOF) {
$useAsContext = true;
$infos[$infoIndex]['aliases'][$useStatementIndex]['type'] = ($tokenType == T_INSTEADOF)
$infos[$infoIndex]['aliases'][$useStatementIndex]['type'] = $tokenType == T_INSTEADOF
? 'insteadof'
: 'as';
goto SCANNER_USE_CONTINUE;
@@ -1187,6 +1207,7 @@ class ClassScanner implements ScannerInterface
$MACRO_INFO_ADVANCE();
goto SCANNER_CLASS_BODY_CONTINUE;
// goto no break needed
case T_DOC_COMMENT:
case T_PUBLIC:
@@ -1196,15 +1217,14 @@ class ClassScanner implements ScannerInterface
case T_FINAL:
case T_VAR:
case T_FUNCTION:
$infos[$infoIndex] = array(
$infos[$infoIndex] = [
'type' => null,
'tokenStart' => $tokenIndex,
'tokenEnd' => null,
'lineStart' => $tokenLine,
'lineEnd' => null,
'name' => null,
);
];
$memberContext = null;
$methodBodyStarted = false;
@@ -1218,19 +1238,21 @@ class ClassScanner implements ScannerInterface
$braceCount++;
goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
// goto no break needed
case '}':
$braceCount--;
goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
// goto no break needed
case ';':
$infos[$infoIndex]['tokenEnd'] = $tokenIndex;
goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
// goto no break needed
}
}
if ($memberContext !== null) {
if (
($memberContext === 'property' && $tokenContent === ';')
if (($memberContext === 'property' && $tokenContent === ';')
|| ($memberContext === 'method' && $methodBodyStarted && $braceCount === 1)
|| ($memberContext === 'method' && $this->isInterface && $tokenContent === ';')
) {
@@ -1239,7 +1261,6 @@ class ClassScanner implements ScannerInterface
}
switch ($tokenType) {
case T_CONST:
$memberContext = 'constant';
$infos[$infoIndex]['type'] = 'constant';
@@ -1284,7 +1305,6 @@ class ClassScanner implements ScannerInterface
// goto no break needed
case null: // no type, is a string
switch ($tokenContent) {
case '{':
$braceCount++;
@@ -1294,6 +1314,7 @@ class ClassScanner implements ScannerInterface
case '}':
$braceCount--;
goto SCANNER_CLASS_BODY_CONTINUE;
// goto no break needed
}
}
@@ -1338,7 +1359,5 @@ class ClassScanner implements ScannerInterface
}
$this->isScanned = true;
return;
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,6 +13,15 @@ use Zend\Code\Annotation;
use Zend\Code\Exception;
use Zend\Code\NameInformation;
use function current;
use function is_string;
use function next;
use function reset;
use function strtolower;
use function substr;
use function strpos;
use function var_export;
class ConstantScanner implements ScannerInterface
{
/**
@@ -156,7 +165,7 @@ class ConstantScanner implements ScannerInterface
return;
}
if (!$this->tokens) {
if (! $this->tokens) {
throw new Exception\RuntimeException('No tokens were provided');
}
@@ -171,7 +180,7 @@ class ConstantScanner implements ScannerInterface
$token = current($tokens);
if (!is_string($token)) {
if (! is_string($token)) {
list($tokenType, $tokenContent, $tokenLine) = $token;
switch ($tokenType) {
@@ -183,7 +192,7 @@ class ConstantScanner implements ScannerInterface
// fall-through
case T_STRING:
$string = (is_string($token)) ? $token : $tokenContent;
$string = is_string($token) ? $token : $tokenContent;
if (null === $this->name) {
$this->name = $string;
@@ -207,9 +216,9 @@ class ConstantScanner implements ScannerInterface
case T_CONSTANT_ENCAPSED_STRING:
case T_DNUMBER:
case T_LNUMBER:
$string = (is_string($token)) ? $token : $tokenContent;
$string = is_string($token) ? $token : $tokenContent;
if (substr($string, 0, 1) === '"' || substr($string, 0, 1) === "'") {
if (0 === strpos($string, '"') || 0 === strpos($string, "'")) {
$this->value = substr($string, 1, -1); // Remove quotes
} else {
$this->value = $string;

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,27 +11,32 @@ namespace Zend\Code\Scanner;
use Zend\Code\Exception;
use function array_keys;
use function array_merge;
use function sprintf;
use function trigger_error;
class DerivedClassScanner extends ClassScanner
{
/**
* @var DirectoryScanner
*/
protected $directoryScanner = null;
protected $directoryScanner;
/**
* @var ClassScanner
*/
protected $classScanner = null;
protected $classScanner;
/**
* @var array
*/
protected $parentClassScanners = array();
protected $parentClassScanners = [];
/**
* @var array
*/
protected $interfaceClassScanners = array();
protected $interfaceClassScanners = [];
/**
* @param ClassScanner $classScanner
@@ -47,9 +52,9 @@ class DerivedClassScanner extends ClassScanner
while ($currentScannerClass && $currentScannerClass->hasParentClass()) {
$currentParentClassName = $currentScannerClass->getParentClass();
if ($directoryScanner->hasClass($currentParentClassName)) {
$currentParentClass = $directoryScanner->getClass($currentParentClassName);
$currentParentClass = $directoryScanner->getClass($currentParentClassName);
$this->parentClassScanners[$currentParentClassName] = $currentParentClass;
$currentScannerClass = $currentParentClass;
$currentScannerClass = $currentParentClass;
} else {
$currentScannerClass = false;
}
@@ -123,7 +128,7 @@ class DerivedClassScanner extends ClassScanner
*/
public function hasParentClass()
{
return ($this->classScanner->getParentClass() !== null);
return $this->classScanner->getParentClass() !== null;
}
/**

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,6 +13,15 @@ use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use Zend\Code\Exception;
use function array_keys;
use function array_merge;
use function is_array;
use function is_dir;
use function is_string;
use function pathinfo;
use function realpath;
use function sprintf;
class DirectoryScanner implements ScannerInterface
{
/**
@@ -23,17 +32,17 @@ class DirectoryScanner implements ScannerInterface
/**
* @var string[]|DirectoryScanner[]
*/
protected $directories = array();
protected $directories = [];
/**
* @var FileScanner[]
*/
protected $fileScanners = array();
protected $fileScanners = [];
/**
* @var array
*/
protected $classToFileScanner = null;
protected $classToFileScanner;
/**
* @param null|string|array $directory
@@ -62,7 +71,7 @@ class DirectoryScanner implements ScannerInterface
$this->directories[] = $directory;
} elseif (is_string($directory)) {
$realDir = realpath($directory);
if (!$realDir || !is_dir($realDir)) {
if (! $realDir || ! is_dir($realDir)) {
throw new Exception\InvalidArgumentException(sprintf(
'Directory "%s" does not exist',
$realDir
@@ -139,9 +148,9 @@ class DirectoryScanner implements ScannerInterface
{
$this->scan();
$return = array();
$return = [];
foreach ($this->fileScanners as $fileScanner) {
$return[] = ($returnFileScanners) ? $fileScanner : $fileScanner->getFile();
$return[] = $returnFileScanners ? $fileScanner : $fileScanner->getFile();
}
return $return;
@@ -173,7 +182,7 @@ class DirectoryScanner implements ScannerInterface
$this->createClassToFileScannerCache();
}
$returnClasses = array();
$returnClasses = [];
foreach ($this->classToFileScanner as $className => $fsIndex) {
$classScanner = $this->fileScanners[$fsIndex]->getClass($className);
if ($returnDerivedScannerClass) {
@@ -197,7 +206,7 @@ class DirectoryScanner implements ScannerInterface
$this->createClassToFileScannerCache();
}
return (isset($this->classToFileScanner[$class]));
return isset($this->classToFileScanner[$class]);
}
/**
@@ -214,7 +223,7 @@ class DirectoryScanner implements ScannerInterface
$this->createClassToFileScannerCache();
}
if (!isset($this->classToFileScanner[$class])) {
if (! isset($this->classToFileScanner[$class])) {
throw new Exception\InvalidArgumentException('Class not found.');
}
@@ -222,7 +231,7 @@ class DirectoryScanner implements ScannerInterface
$fs = $this->fileScanners[$this->classToFileScanner[$class]];
$returnClass = $fs->getClass($class);
if (($returnClass instanceof ClassScanner) && $returnDerivedScannerClass) {
if ($returnClass instanceof ClassScanner && $returnDerivedScannerClass) {
return new DerivedClassScanner($returnClass, $this);
}
@@ -240,7 +249,8 @@ class DirectoryScanner implements ScannerInterface
return;
}
$this->classToFileScanner = array();
$this->classToFileScanner = [];
/** @var FileScanner $fileScanner */
foreach ($this->fileScanners as $fsIndex => $fileScanner) {
$fsClasses = $fileScanner->getClassNames();

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -12,6 +12,19 @@ namespace Zend\Code\Scanner;
use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\NameInformation;
use function array_pop;
use function array_push;
use function current;
use function end;
use function key;
use function next;
use function preg_match;
use function reset;
use function strlen;
use function strpos;
use function substr;
use function trim;
class DocBlockScanner implements ScannerInterface
{
/**
@@ -22,22 +35,22 @@ class DocBlockScanner implements ScannerInterface
/**
* @var string
*/
protected $docComment = null;
protected $docComment;
/**
* @var NameInformation
*/
protected $nameInformation = null;
protected $nameInformation;
/**
* @var AnnotationManager
*/
protected $annotationManager = null;
protected $annotationManager;
/**
* @var string
*/
protected $shortDescription = null;
protected $shortDescription;
/**
* @var string
@@ -47,12 +60,12 @@ class DocBlockScanner implements ScannerInterface
/**
* @var array
*/
protected $tags = array();
protected $tags = [];
/**
* @var array
*/
protected $annotations = array();
protected $annotations = [];
/**
* @param string $docComment
@@ -135,7 +148,9 @@ class DocBlockScanner implements ScannerInterface
case 'DOCBLOCK_WHITESPACE':
case 'DOCBLOCK_TEXT':
if ($tagIndex !== null) {
$this->tags[$tagIndex]['value'] .= ($this->tags[$tagIndex]['value'] == '') ? $token[1] : ' ' . $token[1];
$this->tags[$tagIndex]['value'] .= $this->tags[$tagIndex]['value'] == ''
? $token[1]
: ' ' . $token[1];
goto SCANNER_CONTINUE;
} elseif ($mode <= 2) {
if ($mode == 1) {
@@ -147,8 +162,10 @@ class DocBlockScanner implements ScannerInterface
}
//gotos no break needed
case 'DOCBLOCK_TAG':
array_push($this->tags, array('name' => $token[1],
'value' => ''));
array_push($this->tags, [
'name' => $token[1],
'value' => '',
]);
end($this->tags);
$tagIndex = key($this->tags);
$mode = 3;
@@ -157,7 +174,6 @@ class DocBlockScanner implements ScannerInterface
case 'DOCBLOCK_COMMENTEND':
goto SCANNER_END;
}
SCANNER_CONTINUE:
@@ -184,27 +200,37 @@ class DocBlockScanner implements ScannerInterface
$context = 0x00;
$stream = $this->docComment;
$streamIndex = null;
$tokens = array();
$tokens = [];
$tokenIndex = null;
$currentChar = null;
$currentWord = null;
$currentLine = null;
$MACRO_STREAM_ADVANCE_CHAR = function ($positionsForward = 1) use (&$stream, &$streamIndex, &$currentChar, &$currentWord, &$currentLine) {
$positionsForward = ($positionsForward > 0) ? $positionsForward : 1;
$streamIndex = ($streamIndex === null) ? 0 : $streamIndex + $positionsForward;
if (!isset($stream[$streamIndex])) {
$MACRO_STREAM_ADVANCE_CHAR = function ($positionsForward = 1) use (
&$stream,
&$streamIndex,
&$currentChar,
&$currentWord,
&$currentLine
) {
$positionsForward = $positionsForward > 0 ? $positionsForward : 1;
$streamIndex = $streamIndex === null ? 0 : $streamIndex + $positionsForward;
if (! isset($stream[$streamIndex])) {
$currentChar = false;
return false;
}
$currentChar = $stream[$streamIndex];
$matches = array();
$currentLine = (preg_match('#(.*?)\r?\n#', $stream, $matches, null, $streamIndex) === 1) ? $matches[1] : substr($stream, $streamIndex);
$matches = [];
$currentLine = preg_match('#(.*?)\r?\n#', $stream, $matches, null, $streamIndex) === 1
? $matches[1]
: substr($stream, $streamIndex);
if ($currentChar === ' ') {
$currentWord = (preg_match('#( +)#', $currentLine, $matches) === 1) ? $matches[1] : $currentLine;
$currentWord = preg_match('#( +)#', $currentLine, $matches) === 1 ? $matches[1] : $currentLine;
} else {
$currentWord = (($matches = strpos($currentLine, ' ')) !== false) ? substr($currentLine, 0, $matches) : $currentLine;
$currentWord = ($matches = strpos($currentLine, ' ')) !== false
? substr($currentLine, 0, $matches)
: $currentLine;
}
return $currentChar;
@@ -216,8 +242,8 @@ class DocBlockScanner implements ScannerInterface
return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentLine));
};
$MACRO_TOKEN_ADVANCE = function () use (&$tokenIndex, &$tokens) {
$tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
$tokens[$tokenIndex] = array('DOCBLOCK_UNKNOWN', '');
$tokenIndex = $tokenIndex === null ? 0 : $tokenIndex + 1;
$tokens[$tokenIndex] = ['DOCBLOCK_UNKNOWN', ''];
};
$MACRO_TOKEN_SET_TYPE = function ($type) use (&$tokenIndex, &$tokens) {
$tokens[$tokenIndex][0] = $type;
@@ -264,7 +290,11 @@ class DocBlockScanner implements ScannerInterface
}
if ($currentChar === ' ' || $currentChar === "\t") {
$MACRO_TOKEN_SET_TYPE(($context & $CONTEXT_INSIDE_ASTERISK) ? 'DOCBLOCK_WHITESPACE' : 'DOCBLOCK_WHITESPACE_INDENT');
$MACRO_TOKEN_SET_TYPE(
$context & $CONTEXT_INSIDE_ASTERISK
? 'DOCBLOCK_WHITESPACE'
: 'DOCBLOCK_WHITESPACE_INDENT'
);
$MACRO_TOKEN_APPEND_WORD();
$MACRO_TOKEN_ADVANCE();
if ($MACRO_STREAM_ADVANCE_WORD() === false) {

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -12,12 +12,17 @@ namespace Zend\Code\Scanner;
use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\Exception;
use function file_exists;
use function file_get_contents;
use function sprintf;
use function token_get_all;
class FileScanner extends TokenArrayScanner implements ScannerInterface
{
/**
* @var string
*/
protected $file = null;
protected $file;
/**
* @param string $file
@@ -27,7 +32,7 @@ class FileScanner extends TokenArrayScanner implements ScannerInterface
public function __construct($file, AnnotationManager $annotationManager = null)
{
$this->file = $file;
if (!file_exists($file)) {
if (! file_exists($file)) {
throw new Exception\InvalidArgumentException(sprintf(
'File "%s" not found',
$file

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,42 +13,51 @@ use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\Exception;
use Zend\Code\NameInformation;
use function array_slice;
use function count;
use function is_int;
use function is_string;
use function ltrim;
use function strtolower;
use function substr_count;
use function var_export;
class MethodScanner implements ScannerInterface
{
/**
* @var bool
*/
protected $isScanned = false;
protected $isScanned = false;
/**
* @var string
*/
protected $docComment = null;
protected $docComment;
/**
* @var ClassScanner
*/
protected $scannerClass = null;
protected $scannerClass;
/**
* @var string
*/
protected $class = null;
protected $class;
/**
* @var string
*/
protected $name = null;
protected $name;
/**
* @var int
*/
protected $lineStart = null;
protected $lineStart;
/**
* @var int
*/
protected $lineEnd = null;
protected $lineEnd;
/**
* @var bool
@@ -88,17 +97,17 @@ class MethodScanner implements ScannerInterface
/**
* @var array
*/
protected $tokens = array();
protected $tokens = [];
/**
* @var NameInformation
*/
protected $nameInformation = null;
protected $nameInformation;
/**
* @var array
*/
protected $infos = array();
protected $infos = [];
/**
* @param array $methodTokens
@@ -131,7 +140,7 @@ class MethodScanner implements ScannerInterface
}
/**
* @return MethodScanner
* @return ClassScanner
*/
public function getClassScanner()
{
@@ -180,7 +189,7 @@ class MethodScanner implements ScannerInterface
/**
* @param AnnotationManager $annotationManager
* @return AnnotationScanner
* @return AnnotationScanner|false
*/
public function getAnnotations(AnnotationManager $annotationManager)
{
@@ -255,7 +264,7 @@ class MethodScanner implements ScannerInterface
* Override the given name for a method, this is necessary to
* support traits.
*
* @param $name
* @param string $name
* @return self
*/
public function setName($name)
@@ -268,13 +277,13 @@ class MethodScanner implements ScannerInterface
* Visibility must be of T_PUBLIC, T_PRIVATE or T_PROTECTED
* Needed to support traits
*
* @param $visibility T_PUBLIC | T_PRIVATE | T_PROTECTED
* @param int $visibility T_PUBLIC | T_PRIVATE | T_PROTECTED
* @return self
* @throws \Zend\Code\Exception
* @throws \Zend\Code\Exception\InvalidArgumentException
*/
public function setVisibility($visibility)
{
switch (strtolower($visibility)) {
switch ($visibility) {
case T_PUBLIC:
$this->isPublic = true;
$this->isPrivate = false;
@@ -294,7 +303,7 @@ class MethodScanner implements ScannerInterface
break;
default:
throw new Exception("Invalid visibility argument passed to setVisibility.");
throw new Exception\InvalidArgumentException('Invalid visibility argument passed to setVisibility.');
}
return $this;
@@ -316,14 +325,14 @@ class MethodScanner implements ScannerInterface
{
$this->scan();
$return = array();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] != 'parameter') {
continue;
}
if (!$returnScanner) {
if (! $returnScanner) {
$return[] = $info['name'];
} else {
$return[] = $this->getParameter($info['name']);
@@ -354,7 +363,7 @@ class MethodScanner implements ScannerInterface
}
unset($info);
}
if (!isset($info)) {
if (! isset($info)) {
throw new Exception\InvalidArgumentException('Index of info offset is not about a parameter');
}
}
@@ -400,14 +409,13 @@ class MethodScanner implements ScannerInterface
return;
}
if (!$this->tokens) {
if (! $this->tokens) {
throw new Exception\RuntimeException('No tokens were provided');
}
/**
* Variables & Setup
*/
$tokens = &$this->tokens; // localize
$infos = &$this->infos; // localize
$tokenIndex = null;
@@ -430,8 +438,8 @@ class MethodScanner implements ScannerInterface
&$tokenLine
) {
static $lastTokenArray = null;
$tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
if (!isset($tokens[$tokenIndex])) {
$tokenIndex = $tokenIndex === null ? 0 : $tokenIndex + 1;
if (! isset($tokens[$tokenIndex])) {
$token = false;
$tokenContent = false;
$tokenType = false;
@@ -443,18 +451,19 @@ class MethodScanner implements ScannerInterface
if (is_string($token)) {
$tokenType = null;
$tokenContent = $token;
$tokenLine = $tokenLine + substr_count(
$lastTokenArray[1],
$tokenLine += substr_count(
$lastTokenArray[1] ?? '',
"\n"
); // adjust token line by last known newline count
} else {
list($tokenType, $tokenContent, $tokenLine) = $token;
$lastTokenArray = $token;
[$tokenType, $tokenContent, $tokenLine] = $token;
}
return $tokenIndex;
};
$MACRO_INFO_START = function () use (&$infoIndex, &$infos, &$tokenIndex, &$tokenLine) {
$infos[$infoIndex] = array(
$infos[$infoIndex] = [
'type' => 'parameter',
'tokenStart' => $tokenIndex,
'tokenEnd' => null,
@@ -462,7 +471,7 @@ class MethodScanner implements ScannerInterface
'lineEnd' => $tokenLine,
'name' => null,
'position' => $infoIndex + 1, // position is +1 of infoIndex
);
];
};
$MACRO_INFO_ADVANCE = function () use (&$infoIndex, &$infos, &$tokenIndex, &$tokenLine) {
$infos[$infoIndex]['tokenEnd'] = $tokenIndex;
@@ -475,13 +484,12 @@ class MethodScanner implements ScannerInterface
/**
* START FINITE STATE MACHINE FOR SCANNING TOKENS
*/
// Initialize token
$MACRO_TOKEN_ADVANCE();
SCANNER_TOP:
$this->lineStart = ($this->lineStart) ? : $tokenLine;
$this->lineStart = $this->lineStart ? : $tokenLine;
switch ($tokenType) {
case T_DOC_COMMENT:
@@ -490,47 +498,53 @@ class MethodScanner implements ScannerInterface
$this->docComment = $tokenContent;
}
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case T_FINAL:
$this->isFinal = true;
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case T_ABSTRACT:
$this->isAbstract = true;
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case T_PUBLIC:
// use defaults
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case T_PROTECTED:
$this->setVisibility(T_PROTECTED);
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case T_PRIVATE:
$this->setVisibility(T_PRIVATE);
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case T_STATIC:
$this->isStatic = true;
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case T_NS_SEPARATOR:
if (! isset($infos[$infoIndex])) {
$MACRO_INFO_START();
}
goto SCANNER_CONTINUE_SIGNATURE;
// goto (no break needed);
case T_VARIABLE:
case T_STRING:
if ($tokenType === T_STRING && $parentCount === 0) {
$this->name = $tokenContent;
}
if ($parentCount === 1) {
if (!isset($infos[$infoIndex])) {
if (! isset($infos[$infoIndex])) {
$MACRO_INFO_START();
}
if ($tokenType === T_VARIABLE) {
@@ -539,21 +553,20 @@ class MethodScanner implements ScannerInterface
}
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case null:
switch ($tokenContent) {
case '&':
if (!isset($infos[$infoIndex])) {
if (! isset($infos[$infoIndex])) {
$MACRO_INFO_START();
}
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case '(':
$parentCount++;
goto SCANNER_CONTINUE_SIGNATURE;
//goto (no break needed);
// goto (no break needed);
case ')':
$parentCount--;
if ($parentCount > 0) {
@@ -566,7 +579,7 @@ class MethodScanner implements ScannerInterface
$context = 'body';
}
goto SCANNER_CONTINUE_BODY;
//goto (no break needed);
// goto (no break needed);
case ',':
if ($parentCount === 1) {
$MACRO_INFO_ADVANCE();
@@ -601,7 +614,5 @@ class MethodScanner implements ScannerInterface
SCANNER_END:
$this->isScanned = true;
return;
}
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -11,6 +11,13 @@ namespace Zend\Code\Scanner;
use Zend\Code\NameInformation;
use function current;
use function is_string;
use function ltrim;
use function next;
use function reset;
use function trim;
class ParameterScanner
{
/**
@@ -21,42 +28,42 @@ class ParameterScanner
/**
* @var null|ClassScanner
*/
protected $declaringScannerClass = null;
protected $declaringScannerClass;
/**
* @var null|string
*/
protected $declaringClass = null;
protected $declaringClass;
/**
* @var null|MethodScanner
*/
protected $declaringScannerFunction = null;
protected $declaringScannerFunction;
/**
* @var null|string
*/
protected $declaringFunction = null;
protected $declaringFunction;
/**
* @var null|string
*/
protected $defaultValue = null;
protected $defaultValue;
/**
* @var null|string
*/
protected $class = null;
protected $class;
/**
* @var null|string
*/
protected $name = null;
protected $name;
/**
* @var null|int
*/
protected $position = null;
protected $position;
/**
* @var bool
@@ -81,12 +88,12 @@ class ParameterScanner
/**
* @var array|null
*/
protected $tokens = null;
protected $tokens;
/**
* @var null|NameInformation
*/
protected $nameInformation = null;
protected $nameInformation;
/**
* @param array $parameterTokens
@@ -195,7 +202,7 @@ class ParameterScanner
}
if ($this->name !== null) {
$this->defaultValue .= trim((is_string($token)) ? $token : $token[1]);
$this->defaultValue .= trim(is_string($token) ? $token : $token[1]);
}
SCANNER_CONTINUE:

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,13 +13,23 @@ use Zend\Code\Annotation;
use Zend\Code\Exception;
use Zend\Code\NameInformation;
use function is_array;
use function is_numeric;
use function is_string;
use function ltrim;
use function reset;
use function strpos;
use function substr;
use function trim;
use function var_export;
class PropertyScanner implements ScannerInterface
{
const T_BOOLEAN = "boolean";
const T_INTEGER = "int";
const T_STRING = "string";
const T_ARRAY = "array";
const T_UNKNOWN = "unknown";
const T_BOOLEAN = 'boolean';
const T_INTEGER = 'int';
const T_STRING = 'string';
const T_ARRAY = 'array';
const T_UNKNOWN = 'unknown';
/**
* @var bool
@@ -141,6 +151,7 @@ class PropertyScanner implements ScannerInterface
*/
public function getValueType()
{
$this->scan();
return $this->valueType;
}
@@ -200,7 +211,7 @@ class PropertyScanner implements ScannerInterface
/**
* @param Annotation\AnnotationManager $annotationManager
* @return AnnotationScanner
* @return AnnotationScanner|false
*/
public function getAnnotations(Annotation\AnnotationManager $annotationManager)
{
@@ -231,7 +242,7 @@ class PropertyScanner implements ScannerInterface
return;
}
if (!$this->tokens) {
if (! $this->tokens) {
throw new Exception\RuntimeException('No tokens were provided');
}
@@ -246,7 +257,7 @@ class PropertyScanner implements ScannerInterface
foreach ($tokens as $token) {
$tempValue = $token;
if (!is_string($token)) {
if (! is_string($token)) {
list($tokenType, $tokenContent, $tokenLine) = $token;
switch ($tokenType) {
@@ -284,7 +295,7 @@ class PropertyScanner implements ScannerInterface
}
//end value concatenation
if (!is_array($token) && trim($token) == ";") {
if (! is_array($token) && trim($token) == ';') {
$concatenateValue = false;
}
@@ -293,19 +304,19 @@ class PropertyScanner implements ScannerInterface
}
//start value concatenation
if (!is_array($token) && trim($token) == "=") {
if (! is_array($token) && trim($token) == '=') {
$concatenateValue = true;
}
}
$this->valueType = self::T_UNKNOWN;
if ($value == "false" || $value == "true") {
if ($value == 'false' || $value == 'true') {
$this->valueType = self::T_BOOLEAN;
} elseif (is_numeric($value)) {
$this->valueType = self::T_INTEGER;
} elseif (0 === strpos($value, 'array') || 0 === strpos($value, "[")) {
} elseif (0 === strpos($value, 'array') || 0 === strpos($value, '[')) {
$this->valueType = self::T_ARRAY;
} elseif (substr($value, 0, 1) === '"' || substr($value, 0, 1) === "'") {
} elseif (0 === strpos($value, '"') || 0 === strpos($value, "'")) {
$value = substr($value, 1, -1); // Remove quotes
$this->valueType = self::T_STRING;
}

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -13,6 +13,13 @@ use Zend\Code\Annotation\AnnotationManager;
use Zend\Code\Exception;
use Zend\Code\NameInformation;
use function array_shift;
use function array_slice;
use function in_array;
use function is_array;
use function is_int;
use function is_string;
class TokenArrayScanner implements ScannerInterface
{
/**
@@ -23,27 +30,27 @@ class TokenArrayScanner implements ScannerInterface
/**
* @var array
*/
protected $tokens = array();
protected $tokens = [];
/**
* @var null
*/
protected $docComment = null;
protected $docComment;
/**
* @var NameInformation
*/
protected $nameInformation = null;
protected $nameInformation;
/**
* @var array
*/
protected $infos = array();
protected $infos = [];
/**
* @var AnnotationManager
*/
protected $annotationManager = null;
protected $annotationManager;
/**
* @param null|array $tokens
@@ -69,7 +76,7 @@ class TokenArrayScanner implements ScannerInterface
* @todo Assignment of $this->docComment should probably be done in scan()
* and then $this->getDocComment() just retrieves it.
*
* @return string
* @return string|null
*/
public function getDocComment()
{
@@ -96,7 +103,7 @@ class TokenArrayScanner implements ScannerInterface
{
$this->scan();
$namespaces = array();
$namespaces = [];
foreach ($this->infos as $info) {
if ($info['type'] == 'namespace') {
$namespaces[] = $info['namespace'];
@@ -118,7 +125,7 @@ class TokenArrayScanner implements ScannerInterface
}
/**
* @return array
* @return void
*/
public function getIncludes()
{
@@ -133,7 +140,7 @@ class TokenArrayScanner implements ScannerInterface
{
$this->scan();
$return = array();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] != 'class') {
continue;
@@ -152,7 +159,7 @@ class TokenArrayScanner implements ScannerInterface
{
$this->scan();
$return = array();
$return = [];
foreach ($this->infos as $info) {
if ($info['type'] != 'class') {
continue;
@@ -169,7 +176,7 @@ class TokenArrayScanner implements ScannerInterface
*
* @param string|int $name
* @throws Exception\InvalidArgumentException
* @return ClassScanner
* @return ClassScanner|false
*/
public function getClass($name)
{
@@ -189,7 +196,7 @@ class TokenArrayScanner implements ScannerInterface
}
}
if (!$classFound) {
if (! $classFound) {
return false;
}
}
@@ -198,7 +205,7 @@ class TokenArrayScanner implements ScannerInterface
array_slice(
$this->tokens,
$info['tokenStart'],
($info['tokenEnd'] - $info['tokenStart'] + 1)
$info['tokenEnd'] - $info['tokenStart'] + 1
), // zero indexed array
new NameInformation($info['namespace'], $info['uses'])
);
@@ -220,11 +227,11 @@ class TokenArrayScanner implements ScannerInterface
}
}
if (!$classFound) {
if (! $classFound) {
return false;
}
if (!isset($info)) {
if (! isset($info)) {
return;
}
@@ -237,7 +244,7 @@ class TokenArrayScanner implements ScannerInterface
public function getFunctionNames()
{
$this->scan();
$functionNames = array();
$functionNames = [];
foreach ($this->infos as $info) {
if ($info['type'] == 'function') {
$functionNames[] = $info['name'];
@@ -254,12 +261,12 @@ class TokenArrayScanner implements ScannerInterface
{
$this->scan();
$functions = array();
foreach ($this->infos as $info) {
if ($info['type'] == 'function') {
// @todo $functions[] = new FunctionScanner($info['name']);
}
}
$functions = [];
// foreach ($this->infos as $info) {
// if ($info['type'] == 'function') {
// // @todo $functions[] = new FunctionScanner($info['name']);
// }
// }
return $functions;
}
@@ -267,7 +274,7 @@ class TokenArrayScanner implements ScannerInterface
/**
* Export
*
* @param $tokens
* @param mixed $tokens
*/
public static function export($tokens)
{
@@ -294,21 +301,13 @@ class TokenArrayScanner implements ScannerInterface
return;
}
if (!$this->tokens) {
if (! $this->tokens) {
throw new Exception\RuntimeException('No tokens were provided');
}
/**
* Define PHP 5.4 'trait' token constant.
*/
if (!defined('T_TRAIT')) {
define('T_TRAIT', 42001);
}
/**
* Variables & Setup
*/
$tokens = &$this->tokens; // localize
$infos = &$this->infos; // localize
$tokenIndex = null;
@@ -323,9 +322,16 @@ class TokenArrayScanner implements ScannerInterface
/*
* MACRO creation
*/
$MACRO_TOKEN_ADVANCE = function () use (&$tokens, &$tokenIndex, &$token, &$tokenType, &$tokenContent, &$tokenLine) {
$tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
if (!isset($tokens[$tokenIndex])) {
$MACRO_TOKEN_ADVANCE = function () use (
&$tokens,
&$tokenIndex,
&$token,
&$tokenType,
&$tokenContent,
&$tokenLine
) {
$tokenIndex = $tokenIndex === null ? 0 : $tokenIndex + 1;
if (! isset($tokens[$tokenIndex])) {
$token = false;
$tokenContent = false;
$tokenType = false;
@@ -336,7 +342,7 @@ class TokenArrayScanner implements ScannerInterface
if (is_string($tokens[$tokenIndex]) && $tokens[$tokenIndex] === '"') {
do {
$tokenIndex++;
} while (!(is_string($tokens[$tokenIndex]) && $tokens[$tokenIndex] === '"'));
} while (! (is_string($tokens[$tokenIndex]) && $tokens[$tokenIndex] === '"'));
}
$token = $tokens[$tokenIndex];
if (is_array($token)) {
@@ -349,7 +355,7 @@ class TokenArrayScanner implements ScannerInterface
return $tokenIndex;
};
$MACRO_TOKEN_LOGICAL_START_INDEX = function () use (&$tokenIndex, &$docCommentIndex) {
return ($docCommentIndex === false) ? $tokenIndex : $docCommentIndex;
return $docCommentIndex === false ? $tokenIndex : $docCommentIndex;
};
$MACRO_DOC_COMMENT_START = function () use (&$tokenIndex, &$docCommentIndex) {
$docCommentIndex = $tokenIndex;
@@ -359,9 +365,9 @@ class TokenArrayScanner implements ScannerInterface
$MACRO_DOC_COMMENT_VALIDATE = function () use (&$tokenType, &$docCommentIndex) {
static $validTrailingTokens = null;
if ($validTrailingTokens === null) {
$validTrailingTokens = array(T_WHITESPACE, T_FINAL, T_ABSTRACT, T_INTERFACE, T_CLASS, T_FUNCTION);
$validTrailingTokens = [T_WHITESPACE, T_FINAL, T_ABSTRACT, T_INTERFACE, T_CLASS, T_FUNCTION];
}
if ($docCommentIndex !== false && !in_array($tokenType, $validTrailingTokens)) {
if ($docCommentIndex !== false && ! in_array($tokenType, $validTrailingTokens)) {
$docCommentIndex = false;
}
@@ -378,7 +384,6 @@ class TokenArrayScanner implements ScannerInterface
/**
* START FINITE STATE MACHINE FOR SCANNING TOKENS
*/
// Initialize token
$MACRO_TOKEN_ADVANCE();
@@ -392,23 +397,20 @@ class TokenArrayScanner implements ScannerInterface
$MACRO_DOC_COMMENT_VALIDATE();
switch ($tokenType) {
case T_DOC_COMMENT:
$MACRO_DOC_COMMENT_START();
goto SCANNER_CONTINUE;
//goto no break needed
// goto no break needed
case T_NAMESPACE:
$infos[$infoIndex] = array(
$infos[$infoIndex] = [
'type' => 'namespace',
'tokenStart' => $MACRO_TOKEN_LOGICAL_START_INDEX(),
'tokenEnd' => null,
'lineStart' => $token[2],
'lineEnd' => null,
'namespace' => null,
);
];
// start processing with next token
if ($MACRO_TOKEN_ADVANCE() === false) {
@@ -417,7 +419,7 @@ class TokenArrayScanner implements ScannerInterface
SCANNER_NAMESPACE_TOP:
if ($tokenType === null && $tokenContent === ';' || $tokenContent === '{') {
if (($tokenType === null && $tokenContent === ';') || $tokenContent === '{') {
goto SCANNER_NAMESPACE_END;
}
@@ -442,20 +444,23 @@ class TokenArrayScanner implements ScannerInterface
$MACRO_INFO_ADVANCE();
goto SCANNER_CONTINUE;
//goto no break needed
// goto no break needed
case T_USE:
$infos[$infoIndex] = array(
$infos[$infoIndex] = [
'type' => 'use',
'tokenStart' => $MACRO_TOKEN_LOGICAL_START_INDEX(),
'tokenEnd' => null,
'lineStart' => $tokens[$tokenIndex][2],
'lineEnd' => null,
'namespace' => $namespace,
'statements' => array(0 => array('use' => null,
'as' => null)),
);
'statements' => [
0 => [
'use' => null,
'as' => null,
],
],
];
$useStatementIndex = 0;
$useAsContext = false;
@@ -473,8 +478,10 @@ class TokenArrayScanner implements ScannerInterface
} elseif ($tokenContent === ',') {
$useAsContext = false;
$useStatementIndex++;
$infos[$infoIndex]['statements'][$useStatementIndex] = array('use' => null,
'as' => null);
$infos[$infoIndex]['statements'][$useStatementIndex] = [
'use' => null,
'as' => null,
];
}
}
@@ -505,22 +512,21 @@ class TokenArrayScanner implements ScannerInterface
$MACRO_INFO_ADVANCE();
goto SCANNER_CONTINUE;
//goto no break needed
// goto no break needed
case T_INCLUDE:
case T_INCLUDE_ONCE:
case T_REQUIRE:
case T_REQUIRE_ONCE:
// Static for performance
static $includeTypes = array(
static $includeTypes = [
T_INCLUDE => 'include',
T_INCLUDE_ONCE => 'include_once',
T_REQUIRE => 'require',
T_REQUIRE_ONCE => 'require_once'
);
T_REQUIRE_ONCE => 'require_once',
];
$infos[$infoIndex] = array(
$infos[$infoIndex] = [
'type' => 'include',
'tokenStart' => $MACRO_TOKEN_LOGICAL_START_INDEX(),
'tokenEnd' => null,
@@ -528,7 +534,7 @@ class TokenArrayScanner implements ScannerInterface
'lineEnd' => null,
'includeType' => $includeTypes[$tokens[$tokenIndex][0]],
'path' => '',
);
];
// start processing with next token
if ($MACRO_TOKEN_ADVANCE() === false) {
@@ -554,7 +560,7 @@ class TokenArrayScanner implements ScannerInterface
$MACRO_INFO_ADVANCE();
goto SCANNER_CONTINUE;
//goto no break needed
// goto no break needed
case T_FUNCTION:
case T_FINAL:
@@ -562,9 +568,8 @@ class TokenArrayScanner implements ScannerInterface
case T_CLASS:
case T_INTERFACE:
case T_TRAIT:
$infos[$infoIndex] = array(
'type' => ($tokenType === T_FUNCTION) ? 'function' : 'class',
$infos[$infoIndex] = [
'type' => $tokenType === T_FUNCTION ? 'function' : 'class',
'tokenStart' => $MACRO_TOKEN_LOGICAL_START_INDEX(),
'tokenEnd' => null,
'lineStart' => $tokens[$tokenIndex][2],
@@ -573,7 +578,7 @@ class TokenArrayScanner implements ScannerInterface
'uses' => $this->getUsesNoScan($namespace),
'name' => null,
'shortName' => null,
);
];
$classBraceCount = 0;
@@ -583,11 +588,18 @@ class TokenArrayScanner implements ScannerInterface
// process the name
if ($infos[$infoIndex]['shortName'] == ''
&& (($tokenType === T_CLASS || $tokenType === T_INTERFACE || $tokenType === T_TRAIT) && $infos[$infoIndex]['type'] === 'class'
&& (($tokenType === T_CLASS
|| $tokenType === T_INTERFACE
|| $tokenType === T_TRAIT)
&& $infos[$infoIndex]['type'] === 'class'
|| ($tokenType === T_FUNCTION && $infos[$infoIndex]['type'] === 'function'))
) {
$infos[$infoIndex]['shortName'] = $tokens[$tokenIndex + 2][1];
$infos[$infoIndex]['name'] = (($namespace !== null) ? $namespace . '\\' : '') . $infos[$infoIndex]['shortName'];
$infos[$infoIndex]['shortName'] = is_array($tokens[$tokenIndex + 2])
? $tokens[$tokenIndex + 2][1]
: $tokens[$tokenIndex + 2];
$infos[$infoIndex]['name'] = ($namespace !== null
? $namespace . '\\'
: '') . $infos[$infoIndex]['shortName'];
}
if ($tokenType === null) {
@@ -613,7 +625,7 @@ class TokenArrayScanner implements ScannerInterface
$MACRO_INFO_ADVANCE();
goto SCANNER_CONTINUE;
// goto no break needed
}
SCANNER_CONTINUE:
@@ -628,7 +640,6 @@ class TokenArrayScanner implements ScannerInterface
/**
* END FINITE STATE MACHINE FOR SCANNING TOKENS
*/
$this->isScanned = true;
}
@@ -657,7 +668,7 @@ class TokenArrayScanner implements ScannerInterface
*/
protected function getUsesNoScan($namespace)
{
$namespaces = array();
$namespaces = [];
foreach ($this->infos as $info) {
if ($info['type'] == 'namespace') {
$namespaces[] = $info['namespace'];
@@ -666,13 +677,13 @@ class TokenArrayScanner implements ScannerInterface
if ($namespace === null) {
$namespace = array_shift($namespaces);
} elseif (!is_string($namespace)) {
} elseif (! is_string($namespace)) {
throw new Exception\InvalidArgumentException('Invalid namespace provided');
} elseif (!in_array($namespace, $namespaces)) {
} elseif (! in_array($namespace, $namespaces)) {
return;
}
$uses = array();
$uses = [];
foreach ($this->infos as $info) {
if ($info['type'] !== 'use') {
continue;

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
@@ -12,6 +12,16 @@ namespace Zend\Code\Scanner;
use stdClass;
use Zend\Code\Exception;
use function array_key_exists;
use function is_object;
use function ltrim;
use function property_exists;
use function sprintf;
use function strlen;
use function strpos;
use function substr;
use function substr_replace;
/**
* Shared utility methods used by scanners
*/
@@ -28,9 +38,9 @@ class Util
*/
public static function resolveImports(&$value, $key = null, stdClass $data = null)
{
if (!is_object($data)
|| !property_exists($data, 'uses')
|| !property_exists($data, 'namespace')
if (! is_object($data)
|| ! property_exists($data, 'uses')
|| ! property_exists($data, 'namespace')
) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects a data object containing "uses" and "namespace" properties; on or both missing',
@@ -38,13 +48,13 @@ class Util
));
}
if ($data->namespace && !$data->uses && strlen($value) > 0 && $value{0} != '\\') {
if ($data->namespace && ! $data->uses && strlen($value) > 0 && $value[0] != '\\') {
$value = $data->namespace . '\\' . $value;
return;
}
if (!$data->uses || strlen($value) <= 0 || $value{0} == '\\') {
if (! $data->uses || strlen($value) <= 0 || $value[0] == '\\') {
$value = ltrim($value, '\\');
return;

View File

@@ -3,7 +3,7 @@
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/