Skip to content

Commit

Permalink
Drop support for PHP < 8.1
Browse files Browse the repository at this point in the history
This allows us to add parameter type declarations.
  • Loading branch information
greg0ire committed Dec 17, 2022
1 parent e29955f commit 9fd489f
Show file tree
Hide file tree
Showing 14 changed files with 73 additions and 121 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/continuous-integration.yml
Expand Up @@ -16,4 +16,4 @@ jobs:
name: "PHPUnit"
uses: "doctrine/.github/.github/workflows/continuous-integration.yml@2.1.0"
with:
php-versions: '["7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2"]'
php-versions: '["8.1", "8.2"]'
6 changes: 5 additions & 1 deletion UPGRADE.md
@@ -1,6 +1,10 @@
# Upgrade from 1.0.x to 2.0.x

`DocLexer::peek()` and `DocLexer::glimpse` now return
- `DocLexer::peek()` and `DocLexer::glimpse` now return
`Doctrine\Common\Lexer\Token` objects. When using `doctrine/lexer` 2, these
implement `ArrayAccess` as a way for you to still be able to treat them as
arrays in some ways.
- Parameter type declarations have been added to all methods of all classes. If
you have classes inheriting from classes inside this package, you should add
parameter and return type declarations.
- Support for PHP < 8.1 has been reoved
14 changes: 7 additions & 7 deletions composer.json
Expand Up @@ -32,17 +32,17 @@
],
"homepage": "https://www.doctrine-project.org/projects/annotations.html",
"require": {
"php": "^7.1 || ^8.0",
"php": "^8.1",
"ext-tokenizer": "*",
"doctrine/lexer": "^2",
"psr/cache": "^1 || ^2 || ^3"
"psr/cache": "^3"
},
"require-dev": {
"doctrine/cache": "^1.11 || ^2.0",
"doctrine/coding-standard": "^9 || ^10",
"phpstan/phpstan": "~1.4.10 || ^1.8.0",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"symfony/cache": "^4.4 || ^5.4 || ^6",
"doctrine/cache": "^2.0",
"doctrine/coding-standard": "^10",
"phpstan/phpstan": "^1.8.0",
"phpunit/phpunit": "^9.5.27",
"symfony/cache": "^6",
"vimeo/psalm": "^4.10"
},
"suggest": {
Expand Down
9 changes: 2 additions & 7 deletions lib/Doctrine/Common/Annotations/Annotation.php
Expand Up @@ -29,11 +29,9 @@ final public function __construct(array $data)
/**
* Error handler for unknown property accessor in Annotation class.
*
* @param string $name Unknown property name.
*
* @throws BadMethodCallException
*/
public function __get($name)
public function __get(string $name)
{
throw new BadMethodCallException(
sprintf("Unknown property '%s' on annotation '%s'.", $name, static::class)
Expand All @@ -43,12 +41,9 @@ public function __get($name)
/**
* Error handler for unknown property mutator in Annotation class.
*
* @param string $name Unknown property name.
* @param mixed $value Property value.
*
* @throws BadMethodCallException
*/
public function __set($name, $value)
public function __set(string $name, mixed $value)
{
throw new BadMethodCallException(
sprintf("Unknown property '%s' on annotation '%s'.", $name, static::class)
Expand Down
64 changes: 26 additions & 38 deletions lib/Doctrine/Common/Annotations/AnnotationException.php
Expand Up @@ -19,23 +19,19 @@ class AnnotationException extends Exception
/**
* Creates a new AnnotationException describing a Syntax error.
*
* @param string $message Exception message
*
* @return AnnotationException
*/
public static function syntaxError($message)
public static function syntaxError(string $message)
{
return new self('[Syntax Error] ' . $message);
}

/**
* Creates a new AnnotationException describing a Semantical error.
*
* @param string $message Exception message
*
* @return AnnotationException
*/
public static function semanticalError($message)
public static function semanticalError(string $message)
{
return new self('[Semantical Error] ' . $message);
}
Expand All @@ -44,36 +40,29 @@ public static function semanticalError($message)
* Creates a new AnnotationException describing an error which occurred during
* the creation of the annotation.
*
* @param string $message
*
* @return AnnotationException
*/
public static function creationError($message, ?Throwable $previous = null)
public static function creationError(string $message, ?Throwable $previous = null)
{
return new self('[Creation Error] ' . $message, 0, $previous);
}

/**
* Creates a new AnnotationException describing a type error.
*
* @param string $message
*
* @return AnnotationException
*/
public static function typeError($message)
public static function typeError(string $message)
{
return new self('[Type Error] ' . $message);
}

/**
* Creates a new AnnotationException describing a constant semantical error.
*
* @param string $identifier
* @param string $context
*
* @return AnnotationException
*/
public static function semanticalErrorConstants($identifier, $context = null)
public static function semanticalErrorConstants(string $identifier, ?string $context = null)
{
return self::semanticalError(sprintf(
"Couldn't find constant %s%s.",
Expand All @@ -85,16 +74,15 @@ public static function semanticalErrorConstants($identifier, $context = null)
/**
* Creates a new AnnotationException describing an type error of an attribute.
*
* @param string $attributeName
* @param string $annotationName
* @param string $context
* @param string $expected
* @param mixed $actual
*
* @return AnnotationException
*/
public static function attributeTypeError($attributeName, $annotationName, $context, $expected, $actual)
{
public static function attributeTypeError(
string $attributeName,
string $annotationName,
string $context,
string $expected,
mixed $actual
) {
return self::typeError(sprintf(
'Attribute "%s" of @%s declared on %s expects %s, but got %s.',
$attributeName,
Expand All @@ -108,15 +96,14 @@ public static function attributeTypeError($attributeName, $annotationName, $cont
/**
* Creates a new AnnotationException describing an required error of an attribute.
*
* @param string $attributeName
* @param string $annotationName
* @param string $context
* @param string $expected
*
* @return AnnotationException
*/
public static function requiredError($attributeName, $annotationName, $context, $expected)
{
public static function requiredError(
string $attributeName,
string $annotationName,
string $context,
string $expected
) {
return self::typeError(sprintf(
'Attribute "%s" of @%s declared on %s expects %s. This value should not be null.',
$attributeName,
Expand All @@ -129,16 +116,17 @@ public static function requiredError($attributeName, $annotationName, $context,
/**
* Creates a new AnnotationException describing a invalid enummerator.
*
* @param string $attributeName
* @param string $annotationName
* @param string $context
* @param mixed $given
* @phpstan-param list<string> $available
* @phpstan-param list<string> $available
*
* @return AnnotationException
*/
public static function enumeratorError($attributeName, $annotationName, $context, $available, $given)
{
public static function enumeratorError(
string $attributeName,
string $annotationName,
string $context,
array $available,
mixed $given
) {
return new self(sprintf(
'[Enum Error] Attribute "%s" of @%s declared on %s accepts only [%s], but got %s.',
$attributeName,
Expand Down
20 changes: 5 additions & 15 deletions lib/Doctrine/Common/Annotations/AnnotationReader.php
Expand Up @@ -48,20 +48,16 @@ class AnnotationReader implements Reader

/**
* Add a new annotation to the globally ignored annotation names with regard to exception handling.
*
* @param string $name
*/
public static function addGlobalIgnoredName($name)
public static function addGlobalIgnoredName(string $name)
{
self::$globalIgnoredNames[$name] = true;
}

/**
* Add a new annotation to the globally ignored annotation namespaces with regard to exception handling.
*
* @param string $namespace
*/
public static function addGlobalIgnoredNamespace($namespace)
public static function addGlobalIgnoredNamespace(string $namespace)
{
self::$globalIgnoredNamespaces[$namespace] = true;
}
Expand Down Expand Up @@ -264,11 +260,9 @@ public function getFunctionAnnotation(ReflectionFunction $function, string $anno
/**
* Returns the ignored annotations for the given class or function.
*
* @param ReflectionClass|ReflectionFunction $reflection
*
* @return array<string, true>
*/
private function getIgnoredAnnotationNames($reflection): array
private function getIgnoredAnnotationNames(ReflectionClass|ReflectionFunction $reflection): array
{
$type = $reflection instanceof ReflectionClass ? 'class' : 'function';
$name = $reflection->getName();
Expand All @@ -285,11 +279,9 @@ private function getIgnoredAnnotationNames($reflection): array
/**
* Retrieves imports for a class or a function.
*
* @param ReflectionClass|ReflectionFunction $reflection
*
* @return array<string, class-string>
*/
private function getImports($reflection): array
private function getImports(ReflectionClass|ReflectionFunction $reflection): array
{
$type = $reflection instanceof ReflectionClass ? 'class' : 'function';
$name = $reflection->getName();
Expand Down Expand Up @@ -354,10 +346,8 @@ private function getPropertyImports(ReflectionProperty $property)

/**
* Collects parsing metadata for a given class or function.
*
* @param ReflectionClass|ReflectionFunction $reflection
*/
private function collectParsingMetadata($reflection): void
private function collectParsingMetadata(ReflectionClass|ReflectionFunction $reflection): void
{
$type = $reflection instanceof ReflectionClass ? 'class' : 'function';
$name = $reflection->getName();
Expand Down
2 changes: 1 addition & 1 deletion lib/Doctrine/Common/Annotations/AnnotationRegistry.php
Expand Up @@ -79,7 +79,7 @@ public static function registerFile(string $file): void
*
* @phpstan-param string|list<string>|null $dirs
*/
public static function registerAutoloadNamespace(string $namespace, $dirs = null): void
public static function registerAutoloadNamespace(string $namespace, string|array|null $dirs = null): void
{
self::$autoloadNamespaces[$namespace] = $dirs;
}
Expand Down
11 changes: 3 additions & 8 deletions lib/Doctrine/Common/Annotations/CachedReader.php
Expand Up @@ -168,7 +168,7 @@ public function clearLoadedAnnotations()
*
* @return mixed The cached value or false when the value is not in cache.
*/
private function fetchFromCache($cacheKey, ReflectionClass $class)
private function fetchFromCache(string $cacheKey, ReflectionClass $class)
{
$data = $this->cache->fetch($cacheKey);
if ($data !== false) {
Expand All @@ -183,12 +183,9 @@ private function fetchFromCache($cacheKey, ReflectionClass $class)
/**
* Saves a value to the cache.
*
* @param string $cacheKey The cache key.
* @param mixed $value The value.
*
* @return void
*/
private function saveToCache($cacheKey, $value)
private function saveToCache(string $cacheKey, mixed $value)
{
$this->cache->save($cacheKey, $value);
if (! $this->debug) {
Expand All @@ -201,11 +198,9 @@ private function saveToCache($cacheKey, $value)
/**
* Checks if the cache is fresh.
*
* @param string $cacheKey
*
* @return bool
*/
private function isCacheFresh($cacheKey, ReflectionClass $class)
private function isCacheFresh(string $cacheKey, ReflectionClass $class)
{
$lastModification = $this->getLastModification($class);
if ($lastModification === 0) {
Expand Down
25 changes: 7 additions & 18 deletions lib/Doctrine/Common/Annotations/DocParser.php
Expand Up @@ -286,33 +286,29 @@ public function setIgnoredAnnotationNames(array $names)
*
* @return void
*/
public function setIgnoredAnnotationNamespaces($ignoredAnnotationNamespaces)
public function setIgnoredAnnotationNamespaces(array $ignoredAnnotationNamespaces)
{
$this->ignoredAnnotationNamespaces = $ignoredAnnotationNamespaces;
}

/**
* Sets ignore on not-imported annotations.
*
* @param bool $bool
*
* @return void
*/
public function setIgnoreNotImportedAnnotations($bool)
public function setIgnoreNotImportedAnnotations(bool $bool)
{
$this->ignoreNotImportedAnnotations = (bool) $bool;
$this->ignoreNotImportedAnnotations = $bool;
}

/**
* Sets the default namespaces.
*
* @param string $namespace
*
* @return void
*
* @throws RuntimeException
*/
public function addNamespace($namespace)
public function addNamespace(string $namespace)
{
if ($this->imports) {
throw new RuntimeException('You must either use addNamespace(), or setImports(), but not both.');
Expand Down Expand Up @@ -342,27 +338,22 @@ public function setImports(array $imports)
/**
* Sets current target context as bitmask.
*
* @param int $target
*
* @return void
*/
public function setTarget($target)
public function setTarget(int $target)
{
$this->target = $target;
}

/**
* Parses the given docblock string for annotations.
*
* @param string $input The docblock string to parse.
* @param string $context The parsing context.
*
* @phpstan-return list<object> Array of annotations. If no annotations are found, an empty array is returned.
*
* @throws AnnotationException
* @throws ReflectionException
*/
public function parse($input, $context = '')
public function parse(string $input, string $context = '')
{
$pos = $this->findInitialTokenPosition($input);
if ($pos === null) {
Expand All @@ -379,10 +370,8 @@ public function parse($input, $context = '')

/**
* Finds the first valid annotation
*
* @param string $input The docblock string to parse
*/
private function findInitialTokenPosition($input): ?int
private function findInitialTokenPosition(string $input): ?int
{
$pos = 0;

Expand Down

0 comments on commit 9fd489f

Please sign in to comment.