Skip to content
Snippets Groups Projects
Commit ad8a7e81 authored by David Prévot's avatar David Prévot
Browse files

Update upstream source from tag 'upstream/2.0.1'

Update to upstream version '2.0.1'
with Debian dir b8fcfbb5331a452d1b6fa3f110562a4364371588
parents 001be42b 6194076d
No related branches found
No related tags found
No related merge requests found
......@@ -4,22 +4,26 @@
"slug": "annotations",
"docsSlug": "doctrine-annotations",
"versions": [
{
"name": "2.0",
"branchName": "2.0.x",
"aliases": [
"current",
"stable"
],
"current": true,
"maintained": true
},
{
"name": "1.14",
"branchName": "1.14.x",
"slug": "latest",
"upcoming": true
"maintained": true
},
{
"name": "1.13",
"branchName": "1.13.x",
"slug": "1.13",
"aliases": [
"current",
"stable"
],
"current": true,
"maintained": true
"maintained": false
},
{
"name": "1.12",
......
......@@ -601,6 +601,10 @@ final class DocParser
$metadata['default_property'] = reset($metadata['properties']);
} elseif ($metadata['has_named_argument_constructor']) {
foreach ($constructor->getParameters() as $parameter) {
if ($parameter->isVariadic()) {
break;
}
$metadata['constructor_args'][$parameter->getName()] = [
'position' => $parameter->getPosition(),
'default' => $parameter->isOptional() ? $parameter->getDefaultValue() : null,
......@@ -930,6 +934,23 @@ EXCEPTION
if (self::$annotationMetadata[$name]['has_named_argument_constructor']) {
if (PHP_VERSION_ID >= 80000) {
foreach ($values as $property => $value) {
if (! isset(self::$annotationMetadata[$name]['constructor_args'][$property])) {
throw AnnotationException::creationError(sprintf(
<<<'EXCEPTION'
The annotation @%s declared on %s does not have a property named "%s"
that can be set through its named arguments constructor.
Available named arguments: %s
EXCEPTION
,
$originalName,
$this->context,
$property,
implode(', ', array_keys(self::$annotationMetadata[$name]['constructor_args']))
));
}
}
return $this->instantiateAnnotiation($originalName, $this->context, $name, $values);
}
......
......@@ -1649,6 +1649,18 @@ DOCBLOCK;
self::assertSame(1234, $result[0]->getBar());
}
public function testNamedArgumentsConstructorAnnotationWithExtraArguments(): void
{
$docParser = $this->createTestParser();
$this->expectException(AnnotationException::class);
$this->expectExceptionMessageMatches(
'/does not have a property named "invalid"\s.*\sAvailable named arguments: foo, bar/'
);
$docParser->parse('/** @AnotherNamedAnnotation(foo="baz", invalid="uh oh") */');
}
public function testNamedArgumentsConstructorAnnotationWithDefaultPropertyAsArray(): void
{
$result = $this
......@@ -1701,6 +1713,115 @@ DOCBLOCK;
}
}
public function testAnnotationWithConstructorWithVariadicParamAndExtraNamedArguments(): void
{
$parser = $this->createTestParser();
$docblock = <<<'DOCBLOCK'
/**
* @SomeAnnotationWithConstructorWithVariadicParam(name = "Some data", foo = "Foo", bar = "Bar")
*/
DOCBLOCK;
$this->expectException(AnnotationException::class);
$this->expectExceptionMessageMatches(
'/does not have a property named "foo"\s.*\sAvailable named arguments: name/'
);
$parser->parse($docblock);
}
public function testAnnotationWithConstructorWithVariadicParamAndExtraNamedArgumentsShuffled(): void
{
$parser = $this->createTestParser();
$docblock = <<<'DOCBLOCK'
/**
* @SomeAnnotationWithConstructorWithVariadicParam(foo = "Foo", name = "Some data", bar = "Bar")
*/
DOCBLOCK;
$this->expectException(AnnotationException::class);
$this->expectExceptionMessageMatches(
'/does not have a property named "foo"\s.*\sAvailable named arguments: name/'
);
$parser->parse($docblock);
}
public function testAnnotationWithConstructorWithVariadicParamAndCombinedNamedAndPositionalArguments(): void
{
$parser = $this->createTestParser();
$docblock = <<<'DOCBLOCK'
/**
* @SomeAnnotationWithConstructorWithVariadicParam("Some data", "Foo", bar = "Bar")
*/
DOCBLOCK;
$this->expectException(AnnotationException::class);
$this->expectExceptionMessageMatches(
'/does not have a property named "bar"\s.*\sAvailable named arguments: name/'
);
$parser->parse($docblock);
}
public function testAnnotationWithConstructorWithVariadicParamPassOneNamedArgument(): void
{
$parser = $this->createTestParser();
$docblock = <<<'DOCBLOCK'
/**
* @SomeAnnotationWithConstructorWithVariadicParam(name = "Some data", data = "Foo")
*/
DOCBLOCK;
$this->expectException(AnnotationException::class);
$this->expectExceptionMessageMatches(
'/does not have a property named "data"\s.*\sAvailable named arguments: name/'
);
$parser->parse($docblock);
}
public function testAnnotationWithConstructorWithVariadicParamPassPositionalArguments(): void
{
$parser = $this->createTestParser();
$docblock = <<<'DOCBLOCK'
/**
* @SomeAnnotationWithConstructorWithVariadicParam("Some data", "Foo", "Bar")
*/
DOCBLOCK;
$result = $parser->parse($docblock);
self::assertCount(1, $result);
$annot = $result[0];
self::assertInstanceOf(SomeAnnotationWithConstructorWithVariadicParam::class, $annot);
self::assertSame('Some data', $annot->name);
// Positional extra arguments will be ignored
self::assertSame([], $annot->data);
}
public function testAnnotationWithConstructorWithVariadicParamNoArgs(): void
{
$parser = $this->createTestParser();
// Without variadic arguments
$docblock = <<<'DOCBLOCK'
/**
* @SomeAnnotationWithConstructorWithVariadicParam("Some data")
*/
DOCBLOCK;
$result = $parser->parse($docblock);
self::assertCount(1, $result);
$annot = $result[0];
self::assertInstanceOf(SomeAnnotationWithConstructorWithVariadicParam::class, $annot);
self::assertSame('Some data', $annot->name);
self::assertSame([], $annot->data);
}
/**
* Override for BC with PHPUnit <8
*/
......@@ -1782,6 +1903,25 @@ class NamedAnnotationWithArray
}
}
/**
* @Annotation
* @NamedArgumentConstructor
*/
class SomeAnnotationWithConstructorWithVariadicParam
{
public function __construct(string $name, string ...$data)
{
$this->name = $name;
$this->data = $data;
}
/** @var string[] */
public $data;
/** @var string */
public $name;
}
/** @Annotation */
class SettingsAnnotation
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment