Skip to content

Commit

Permalink
add type hint object, add generic types
Browse files Browse the repository at this point in the history
  • Loading branch information
mikey179 committed Mar 5, 2020
1 parent b3a76f8 commit 32a7cd2
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 26 deletions.
8 changes: 7 additions & 1 deletion CHANGELOG.md
@@ -1,6 +1,12 @@
# Changelog

## 8.?.? (2020-??-??)
## 9.?.? (2020-??-??)

### BC breaks

* added type hint `object` for first parameter of `stubbles\xml\serializer\ObjectXmlSerializer::serialize()`

### Other changes

* provide more specific types where applicable

Expand Down
10 changes: 7 additions & 3 deletions phpstan.neon.dist
Expand Up @@ -9,9 +9,6 @@ parameters:
ignoreErrors:
# False positive
- '#Call to an undefined method stubbles\\reflect\\annotation\\Annotation::#'
-
message: '#entity of method stubbles\\xml\\rss\\RssFeed::addEntity\(\) expects object, int given#'
path: src/test/php/rss/RssFeedItemFromEntityTest.php
-
message: '#doc of method XSLTProcessor::transformToDoc() expects DOMNode, DOMDocument|null given#'
path: src/main/php/xsl/XslProcessor.php
Expand All @@ -25,3 +22,10 @@ parameters:
-
message: '#Strict comparison using === between false and string will always evaluate to false#'
path: src/main/php/xsl/XslProcessor.php
# explicit tests
-
message: '#rssFeedItem of method stubbles\\xml\\rss\\RssFeedItemSerializer::serialize\(\) expects stubbles\\xml\\rss\\RssFeedItem, stdClass given#'
path: src/test/php/rss/RssFeedItemSerializerTest.php
-
message: '#rssFeed of method stubbles\\xml\\rss\\RssFeedSerializer::serialize\(\) expects stubbles\\xml\\rss\\RssFeed, stdClass given#'
path: src/test/php/rss/RssFeedSerializerTest.php
5 changes: 3 additions & 2 deletions src/main/php/rss/RssFeedItemSerializer.php
Expand Up @@ -14,20 +14,21 @@
* Class for a rss 2.0 feed item.
*
* @see http://rssboard.org/rss-specification
* @implements ObjectXmlSerializer<RssFeedItem>
*/
class RssFeedItemSerializer implements ObjectXmlSerializer
{
/**
* serializes given value
*
* @param mixed $rssFeedItem
* @param RssFeedItem $rssFeedItem
* @param \stubbles\xml\serializer\XmlSerializer $xmlSerializer serializer in case $value is not just a scalar value
* @param \stubbles\xml\XmlStreamWriter $xmlWriter xml writer to write serialized object into
* @param string $tagName name of the surrounding xml tag
* @throws \InvalidArgumentException in case $rssFeedItem is not an instance of stubbles\xml\rss\RssFeedItem
*/
public function serialize(
$rssFeedItem,
object $rssFeedItem,
XmlSerializer $xmlSerializer,
XmlStreamWriter $xmlWriter,
string $tagName = null
Expand Down
5 changes: 3 additions & 2 deletions src/main/php/rss/RssFeedSerializer.php
Expand Up @@ -25,6 +25,7 @@
* skipDays Usage relies on behaviour of aggregators.
*
* @see http://rssboard.org/rss-specification
* @implements ObjectXmlSerializer<RssFeed>
*/
class RssFeedSerializer implements ObjectXmlSerializer
{
Expand All @@ -50,14 +51,14 @@ public function setGenerator(string $generator): self
/**
* serializes given value
*
* @param mixed $rssFeed
* @param RssFeed $rssFeed
* @param \stubbles\xml\serializer\XmlSerializer $xmlSerializer serializer in case $value is not just a scalar value
* @param \stubbles\xml\XmlStreamWriter $xmlWriter xml writer to write serialized object into
* @param string $tagName name of the surrounding xml tag
* @throws \InvalidArgumentException in case $rssFeed is not an instance of stubbles\xml\rss\RssFeed
*/
public function serialize(
$rssFeed,
object $rssFeed,
XmlSerializer $xmlSerializer,
XmlStreamWriter $xmlWriter,
string $tagName = null
Expand Down
30 changes: 18 additions & 12 deletions src/main/php/serializer/AnnotationBasedObjectXmlSerializer.php
Expand Up @@ -21,6 +21,9 @@
use function stubbles\reflect\propertiesOf;
/**
* Container for extracting informations on how to serialize a class.
*
* @implements ObjectXmlSerializer<object>
* @template T of object
*/
class AnnotationBasedObjectXmlSerializer implements ObjectXmlSerializer
{
Expand All @@ -45,7 +48,7 @@ class AnnotationBasedObjectXmlSerializer implements ObjectXmlSerializer
/**
* map of serializer instances for different classes
*
* @var \stubbles\xml\serializer\AnnotationBasedObjectXmlSerializer[]
* @var array<class-string<T>,AnnotationBasedObjectXmlSerializer<T>>
*/
private static $cache = [];

Expand All @@ -56,7 +59,7 @@ class AnnotationBasedObjectXmlSerializer implements ObjectXmlSerializer
* method. The constructor should be used if one is sure that there is only
* one instance of a class to serialize.
*
* @param \ReflectionClass<object> $objectClass
* @param \ReflectionClass<T> $objectClass
*/
public function __construct(\ReflectionClass $objectClass)
{
Expand All @@ -77,30 +80,33 @@ public function __construct(\ReflectionClass $objectClass)
* class it will return the same result, even if the given object is a
* different instance.
*
* @param object $object
* @return \stubbles\xml\serializer\AnnotationBasedObjectXmlSerializer
* @param T $object
* @return AnnotationBasedObjectXmlSerializer<T>
*/
public static function fromObject($object): self
public static function fromObject(object $object): self
{
/** @var class-string<T> $className */
$className = get_class($object);
if (isset(self::$cache[$className])) {
return self::$cache[$className];
if (!isset(self::$cache[$className])) {
/** @var \ReflectionClass<T> */
$ref = new \ReflectionObject($object);
self::$cache[$className] = new self($ref);
}

self::$cache[$className] = new self(new \ReflectionObject($object));
/** @var AnnotationBasedObjectXmlSerializer<T> */
return self::$cache[$className];
}

/**
* serializes given value
*
* @param mixed $object
* @param T $object
* @param \stubbles\xml\serializer\XmlSerializer $xmlSerializer serializer in case $value is not just a scalar value
* @param \stubbles\xml\XmlStreamWriter $xmlWriter xml writer to write serialized object into
* @param string $tagName name of the surrounding xml tag
*/
public function serialize(
$object,
object $object,
XmlSerializer $xmlSerializer,
XmlStreamWriter $xmlWriter,
string $tagName = null
Expand Down Expand Up @@ -128,7 +134,7 @@ public function serialize(
/**
* extract informations about properties
*
* @param \ReflectionClass<object> $objectClass
* @param \ReflectionClass<T> $objectClass
* @return XmlSerializerDelegate[]
*/
private function extractProperties(\ReflectionClass $objectClass): array
Expand All @@ -152,7 +158,7 @@ private function extractProperties(\ReflectionClass $objectClass): array
/**
* extract informations about methods
*
* @param \ReflectionClass<object> $objectClass
* @param \ReflectionClass<T> $objectClass
* @return XmlSerializerDelegate[]
*/
private function extractMethods(\ReflectionClass $objectClass): array
Expand Down
5 changes: 3 additions & 2 deletions src/main/php/serializer/ObjectXmlSerializer.php
Expand Up @@ -12,19 +12,20 @@
* Interface for object serializers.
*
* @since 1.6.0
* @template T of object
*/
interface ObjectXmlSerializer
{
/**
* serializes given value
*
* @param mixed $object
* @param T $object
* @param \stubbles\xml\serializer\XmlSerializer $xmlSerializer serializer in case $value is not just a scalar value
* @param \stubbles\xml\XmlStreamWriter $xmlWriter xml writer to write serialized object into
* @param string $tagName name of the surrounding xml tag
*/
public function serialize(
$object,
object $object,
XmlSerializer $xmlSerializer,
XmlStreamWriter $xmlWriter,
string $tagName = null
Expand Down
10 changes: 6 additions & 4 deletions src/main/php/serializer/XmlSerializer.php
Expand Up @@ -242,7 +242,7 @@ public function serializeArray(
* @return \stubbles\xml\XmlStreamWriter
* @since 1.6.0
*/
public function serializeObject($object, XmlStreamWriter $xmlWriter, string $tagName = null): XmlStreamWriter
public function serializeObject(object $object, XmlStreamWriter $xmlWriter, string $tagName = null): XmlStreamWriter
{
$this->serializerFor($object)->serialize($object, $this, $xmlWriter, $tagName);
return $xmlWriter;
Expand All @@ -251,16 +251,18 @@ public function serializeObject($object, XmlStreamWriter $xmlWriter, string $tag
/**
* returns serializer for given object
*
* @param object $object
* @return \stubbles\xml\serializer\ObjectXmlSerializer
* @template T of object
* @param T $object
* @return \stubbles\xml\serializer\ObjectXmlSerializer<T>
*/
protected function serializerFor($object): ObjectXmlSerializer
{
if (!annotationsOf($object)->contain('XmlSerializer')) {
/** @var ObjectXmlSerializer<T> */
return AnnotationBasedObjectXmlSerializer::fromObject($object);
}

/** @var ObjectXmlSerializer $serializer */
/** @var ObjectXmlSerializer<T> $serializer */
$serializer = $this->injector->getInstance(
annotationsOf($object)
->firstNamed('XmlSerializer')
Expand Down

0 comments on commit 32a7cd2

Please sign in to comment.