fix type error handling when writing values
This commit is contained in:
parent
30b24d200b
commit
45754515a5
@ -231,7 +231,12 @@ class PropertyAccessor implements PropertyAccessorInterface
|
|||||||
|
|
||||||
private static function throwInvalidArgumentException($message, $trace, $i)
|
private static function throwInvalidArgumentException($message, $trace, $i)
|
||||||
{
|
{
|
||||||
if (isset($trace[$i]['file']) && __FILE__ === $trace[$i]['file'] && isset($trace[$i]['args'][0])) {
|
// the type mismatch is not caused by invalid arguments (but e.g. by an incompatible return type hint of the writer method)
|
||||||
|
if (0 !== strpos($message, 'Argument ')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($trace[$i]['file']) && __FILE__ === $trace[$i]['file'] && array_key_exists(0, $trace[$i]['args'])) {
|
||||||
$pos = strpos($message, $delim = 'must be of the type ') ?: (strpos($message, $delim = 'must be an instance of ') ?: strpos($message, $delim = 'must implement interface '));
|
$pos = strpos($message, $delim = 'must be of the type ') ?: (strpos($message, $delim = 'must be an instance of ') ?: strpos($message, $delim = 'must implement interface '));
|
||||||
$pos += \strlen($delim);
|
$pos += \strlen($delim);
|
||||||
$type = $trace[$i]['args'][0];
|
$type = $trace[$i]['args'][0];
|
||||||
|
@ -28,4 +28,9 @@ class ReturnTyped
|
|||||||
public function removeFoo(\DateTime $dateTime)
|
public function removeFoo(\DateTime $dateTime)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setName($name): self
|
||||||
|
{
|
||||||
|
return 'This does not respect the return type on purpose.';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -538,6 +538,17 @@ class PropertyAccessorTest extends TestCase
|
|||||||
$this->propertyAccessor->setValue($object, 'date', 'This is a string, \DateTime expected.');
|
$this->propertyAccessor->setValue($object, 'date', 'This is a string, \DateTime expected.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\PropertyAccess\Exception\InvalidArgumentException
|
||||||
|
* @expectedExceptionMessage Expected argument of type "DateTime", "NULL" given
|
||||||
|
*/
|
||||||
|
public function testThrowTypeErrorWithNullArgument()
|
||||||
|
{
|
||||||
|
$object = new TypeHinted();
|
||||||
|
|
||||||
|
$this->propertyAccessor->setValue($object, 'date', null);
|
||||||
|
}
|
||||||
|
|
||||||
public function testSetTypeHint()
|
public function testSetTypeHint()
|
||||||
{
|
{
|
||||||
$date = new \DateTime();
|
$date = new \DateTime();
|
||||||
@ -579,4 +590,16 @@ class PropertyAccessorTest extends TestCase
|
|||||||
|
|
||||||
$this->propertyAccessor->setValue($object, 'foos', array(new \DateTime()));
|
$this->propertyAccessor->setValue($object, 'foos', array(new \DateTime()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires PHP 7
|
||||||
|
*
|
||||||
|
* @expectedException \TypeError
|
||||||
|
*/
|
||||||
|
public function testDoNotDiscardReturnTypeErrorWhenWriterMethodIsMisconfigured()
|
||||||
|
{
|
||||||
|
$object = new ReturnTyped();
|
||||||
|
|
||||||
|
$this->propertyAccessor->setValue($object, 'name', 'foo');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user