diff --git a/.gitattributes b/.gitattributes
index dc4ed6af..8cc3d67f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -12,7 +12,4 @@
/phpcs.xml.dist export-ignore
/phpstan.neon export-ignore
/phpstan-baseline.neon export-ignore
-/psalm.xml export-ignore
-/psalm-baseline.xml export-ignore
-/psalm.phpstub export-ignore
/composer.lock export-ignore
diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml
index 591ad180..6727a24d 100644
--- a/.github/workflows/static-analysis.yml
+++ b/.github/workflows/static-analysis.yml
@@ -12,6 +12,6 @@ on:
jobs:
static-analysis:
name: "Static Analysis"
- uses: "doctrine/.github/.github/workflows/static-analysis.yml@5.2.0"
+ uses: "doctrine/.github/.github/workflows/phpstan.yml@5.2.0"
with:
composer-root-version: "3.0"
diff --git a/composer.json b/composer.json
index 03d832fe..638a8c43 100644
--- a/composer.json
+++ b/composer.json
@@ -25,14 +25,13 @@
"psr/cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
- "phpstan/phpstan": "1.11.1",
+ "phpstan/phpstan": "1.12.7",
"phpstan/phpstan-phpunit": "^1",
"phpstan/phpstan-strict-rules": "^1.1",
"doctrine/coding-standard": "^12",
"doctrine/common": "^3.0",
"phpunit/phpunit": "^8.5 || ^9.5",
- "symfony/cache": "^4.4 || ^5.4 || ^6.0",
- "vimeo/psalm": "4.30.0 || 5.24.0"
+ "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0"
},
"conflict": {
"doctrine/common": "<2.10"
diff --git a/psalm-baseline.xml b/psalm-baseline.xml
deleted file mode 100644
index c99afb10..00000000
--- a/psalm-baseline.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
- nsSeparator, '\\', $fileName)]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/psalm.phpstub b/psalm.phpstub
deleted file mode 100644
index 727effe9..00000000
--- a/psalm.phpstub
+++ /dev/null
@@ -1,12 +0,0 @@
- return
- */
-function ltrim(string $string, string $characters = " \t\n\r\0\x0B") : string {}
diff --git a/psalm.xml b/psalm.xml
deleted file mode 100644
index bd5fbbf9..00000000
--- a/psalm.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Persistence/AbstractManagerRegistry.php b/src/Persistence/AbstractManagerRegistry.php
index cc245ba6..ce27d99f 100644
--- a/src/Persistence/AbstractManagerRegistry.php
+++ b/src/Persistence/AbstractManagerRegistry.php
@@ -32,14 +32,14 @@ abstract class AbstractManagerRegistry implements ManagerRegistry
/**
* @var string
- * @psalm-var class-string
+ * @phpstan-var class-string
*/
private $proxyInterfaceName;
/**
* @param array $connections
* @param array $managers
- * @psalm-param class-string $proxyInterfaceName
+ * @phpstan-param class-string $proxyInterfaceName
*/
public function __construct(
string $name,
@@ -255,7 +255,7 @@ public function resetManager(?string $name = null)
return $this->getManager($name);
}
- /** @psalm-param class-string $persistentObject */
+ /** @phpstan-param class-string $persistentObject */
private function selectManager(
string $persistentObject,
?string $persistentManagerName = null
diff --git a/src/Persistence/Event/LifecycleEventArgs.php b/src/Persistence/Event/LifecycleEventArgs.php
index 1654de42..05a66a92 100644
--- a/src/Persistence/Event/LifecycleEventArgs.php
+++ b/src/Persistence/Event/LifecycleEventArgs.php
@@ -17,14 +17,14 @@ class LifecycleEventArgs extends EventArgs
{
/**
* @var ObjectManager
- * @psalm-var TObjectManager
+ * @phpstan-var TObjectManager
*/
private $objectManager;
/** @var object */
private $object;
- /** @psalm-param TObjectManager $objectManager */
+ /** @phpstan-param TObjectManager $objectManager */
public function __construct(object $object, ObjectManager $objectManager)
{
$this->object = $object;
@@ -45,7 +45,7 @@ public function getObject()
* Retrieves the associated ObjectManager.
*
* @return ObjectManager
- * @psalm-return TObjectManager
+ * @phpstan-return TObjectManager
*/
public function getObjectManager()
{
diff --git a/src/Persistence/Event/LoadClassMetadataEventArgs.php b/src/Persistence/Event/LoadClassMetadataEventArgs.php
index aa92d5d7..cf2bf7f9 100644
--- a/src/Persistence/Event/LoadClassMetadataEventArgs.php
+++ b/src/Persistence/Event/LoadClassMetadataEventArgs.php
@@ -18,19 +18,19 @@ class LoadClassMetadataEventArgs extends EventArgs
{
/**
* @var ClassMetadata
- * @psalm-var TClassMetadata
+ * @phpstan-var TClassMetadata
*/
private $classMetadata;
/**
* @var ObjectManager
- * @psalm-var TObjectManager
+ * @phpstan-var TObjectManager
*/
private $objectManager;
/**
- * @psalm-param TClassMetadata $classMetadata
- * @psalm-param TObjectManager $objectManager
+ * @phpstan-param TClassMetadata $classMetadata
+ * @phpstan-param TObjectManager $objectManager
*/
public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager)
{
@@ -42,7 +42,7 @@ public function __construct(ClassMetadata $classMetadata, ObjectManager $objectM
* Retrieves the associated ClassMetadata.
*
* @return ClassMetadata
- * @psalm-return TClassMetadata
+ * @phpstan-return TClassMetadata
*/
public function getClassMetadata()
{
diff --git a/src/Persistence/Event/ManagerEventArgs.php b/src/Persistence/Event/ManagerEventArgs.php
index 5156013f..d4874ae4 100644
--- a/src/Persistence/Event/ManagerEventArgs.php
+++ b/src/Persistence/Event/ManagerEventArgs.php
@@ -16,11 +16,11 @@ class ManagerEventArgs extends EventArgs
{
/**
* @var ObjectManager
- * @psalm-var TObjectManager
+ * @phpstan-var TObjectManager
*/
private $objectManager;
- /** @psalm-param TObjectManager $objectManager */
+ /** @phpstan-param TObjectManager $objectManager */
public function __construct(ObjectManager $objectManager)
{
$this->objectManager = $objectManager;
@@ -30,7 +30,7 @@ public function __construct(ObjectManager $objectManager)
* Retrieves the associated ObjectManager.
*
* @return ObjectManager
- * @psalm-return TObjectManager
+ * @phpstan-return TObjectManager
*/
public function getObjectManager()
{
diff --git a/src/Persistence/Event/OnClearEventArgs.php b/src/Persistence/Event/OnClearEventArgs.php
index 519a8876..b25d3d8a 100644
--- a/src/Persistence/Event/OnClearEventArgs.php
+++ b/src/Persistence/Event/OnClearEventArgs.php
@@ -16,13 +16,13 @@ class OnClearEventArgs extends EventArgs
{
/**
* @var ObjectManager
- * @psalm-var TObjectManager
+ * @phpstan-var TObjectManager
*/
private $objectManager;
/**
* @param ObjectManager $objectManager The object manager.
- * @psalm-param TObjectManager $objectManager
+ * @phpstan-param TObjectManager $objectManager
*/
public function __construct(ObjectManager $objectManager)
{
@@ -33,7 +33,7 @@ public function __construct(ObjectManager $objectManager)
* Retrieves the associated ObjectManager.
*
* @return ObjectManager
- * @psalm-return TObjectManager
+ * @phpstan-return TObjectManager
*/
public function getObjectManager()
{
diff --git a/src/Persistence/Event/PreUpdateEventArgs.php b/src/Persistence/Event/PreUpdateEventArgs.php
index 95ecbd45..60d07762 100644
--- a/src/Persistence/Event/PreUpdateEventArgs.php
+++ b/src/Persistence/Event/PreUpdateEventArgs.php
@@ -23,7 +23,7 @@ class PreUpdateEventArgs extends LifecycleEventArgs
/**
* @param array> $changeSet
- * @psalm-param TObjectManager $objectManager
+ * @phpstan-param TObjectManager $objectManager
*/
public function __construct(object $entity, ObjectManager $objectManager, array &$changeSet)
{
diff --git a/src/Persistence/ManagerRegistry.php b/src/Persistence/ManagerRegistry.php
index 46599a56..3c10f5e9 100644
--- a/src/Persistence/ManagerRegistry.php
+++ b/src/Persistence/ManagerRegistry.php
@@ -66,10 +66,10 @@ public function getManagerNames();
*
* @param string $persistentObject The name of the persistent object.
* @param string|null $persistentManagerName The object manager name (null for the default one).
- * @psalm-param class-string $persistentObject
+ * @phpstan-param class-string $persistentObject
*
* @return ObjectRepository
- * @psalm-return ObjectRepository
+ * @phpstan-return ObjectRepository
*
* @template T of object
*/
diff --git a/src/Persistence/Mapping/AbstractClassMetadataFactory.php b/src/Persistence/Mapping/AbstractClassMetadataFactory.php
index e8f6acaa..45e7e1e1 100644
--- a/src/Persistence/Mapping/AbstractClassMetadataFactory.php
+++ b/src/Persistence/Mapping/AbstractClassMetadataFactory.php
@@ -47,7 +47,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
/**
* @var array
- * @psalm-var CMTemplate[]
+ * @phpstan-var CMTemplate[]
*/
private $loadedMetadata = [];
@@ -74,7 +74,7 @@ final protected function getCache(): ?CacheItemPoolInterface
* Returns an array of all the loaded metadata currently in memory.
*
* @return ClassMetadata[]
- * @psalm-return CMTemplate[]
+ * @phpstan-return CMTemplate[]
*/
public function getLoadedMetadata()
{
@@ -122,7 +122,7 @@ abstract protected function getDriver();
/**
* Wakes up reflection after ClassMetadata gets unserialized from cache.
*
- * @psalm-param CMTemplate $class
+ * @phpstan-param CMTemplate $class
*
* @return void
*/
@@ -134,7 +134,7 @@ abstract protected function wakeupReflection(
/**
* Initializes Reflection after ClassMetadata was constructed.
*
- * @psalm-param CMTemplate $class
+ * @phpstan-param CMTemplate $class
*
* @return void
*/
@@ -148,7 +148,7 @@ abstract protected function initializeReflection(
*
* This method should return false for mapped superclasses or embedded classes.
*
- * @psalm-param CMTemplate $class
+ * @phpstan-param CMTemplate $class
*
* @return bool
*/
@@ -157,9 +157,9 @@ abstract protected function isEntity(ClassMetadata $class);
/**
* Removes the prepended backslash of a class string to conform with how php outputs class names
*
- * @psalm-param class-string $className
+ * @phpstan-param class-string $className
*
- * @psalm-return class-string
+ * @phpstan-return class-string
*/
private function normalizeClassName(string $className): string
{
@@ -199,7 +199,7 @@ public function getMetadataFor(string $className)
if ($this->cache !== null) {
$cached = $this->cache->getItem($this->getCacheKey($realClassName))->get();
if ($cached instanceof ClassMetadata) {
- /** @psalm-var CMTemplate $cached */
+ /** @phpstan-var CMTemplate $cached */
$this->loadedMetadata[$realClassName] = $cached;
$this->wakeupReflection($cached, $this->getReflectionService());
@@ -257,8 +257,8 @@ public function hasMetadataFor(string $className)
*
* NOTE: This is only useful in very special cases, like when generating proxy classes.
*
- * @psalm-param class-string $className
- * @psalm-param CMTemplate $class
+ * @phpstan-param class-string $className
+ * @phpstan-param CMTemplate $class
*
* @return void
*/
@@ -270,10 +270,10 @@ public function setMetadataFor(string $className, ClassMetadata $class)
/**
* Gets an array of parent classes for the given entity class.
*
- * @psalm-param class-string $name
+ * @phpstan-param class-string $name
*
* @return string[]
- * @psalm-return list
+ * @phpstan-return list
*/
protected function getParentClasses(string $name)
{
@@ -302,10 +302,10 @@ protected function getParentClasses(string $name)
* should be used for reflection.
*
* @param string $name The name of the class for which the metadata should get loaded.
- * @psalm-param class-string $name
+ * @phpstan-param class-string $name
*
* @return array
- * @psalm-return list
+ * @phpstan-return list
*/
protected function loadMetadata(string $name)
{
@@ -366,7 +366,7 @@ protected function loadMetadata(string $name)
* Override this method to implement a fallback strategy for failed metadata loading
*
* @return ClassMetadata|null
- * @psalm-return CMTemplate|null
+ * @phpstan-return CMTemplate|null
*/
protected function onNotFoundMetadata(string $className)
{
@@ -378,8 +378,8 @@ protected function onNotFoundMetadata(string $className)
*
* @param bool $rootEntityFound True when there is another entity (non-mapped superclass) class above the current class in the PHP class hierarchy.
* @param list $nonSuperclassParents All parent class names that are not marked as mapped superclasses, with the direct parent class being the first and the root entity class the last element.
- * @psalm-param CMTemplate $class
- * @psalm-param CMTemplate|null $parent
+ * @phpstan-param CMTemplate $class
+ * @phpstan-param CMTemplate|null $parent
*
* @return void
*/
@@ -393,10 +393,10 @@ abstract protected function doLoadMetadata(
/**
* Creates a new ClassMetadata instance for the given class name.
*
- * @psalm-param class-string $className
+ * @phpstan-param class-string $className
*
* @return ClassMetadata
- * @psalm-return CMTemplate
+ * @phpstan-return CMTemplate
*
* @template T of object
*/
@@ -419,7 +419,7 @@ public function isTransient(string $className)
throw MappingException::nonExistingClass($className);
}
- /** @psalm-var class-string $className */
+ /** @phpstan-var class-string $className */
return $this->getDriver()->isTransient($className);
}
@@ -455,9 +455,9 @@ protected function getCacheKey(string $realClassName): string
/**
* Gets the real class name of a class name that could be a proxy.
*
- * @psalm-param class-string>|class-string $class
+ * @phpstan-param class-string>|class-string $class
*
- * @psalm-return class-string
+ * @phpstan-return class-string
*
* @template T of object
*/
@@ -476,9 +476,9 @@ private function createDefaultProxyClassNameResolver(): void
{
$this->proxyClassNameResolver = new class implements ProxyClassNameResolver {
/**
- * @psalm-param class-string>|class-string $className
+ * @phpstan-param class-string>|class-string $className
*
- * @psalm-return class-string
+ * @phpstan-return class-string
*
* @template T of object
*/
@@ -487,11 +487,11 @@ public function resolveClassName(string $className): string
$pos = strrpos($className, '\\' . Proxy::MARKER . '\\');
if ($pos === false) {
- /** @psalm-var class-string */
+ /** @phpstan-var class-string */
return $className;
}
- /** @psalm-var class-string */
+ /** @phpstan-var class-string */
return substr($className, $pos + Proxy::MARKER_LENGTH + 2);
}
};
diff --git a/src/Persistence/Mapping/ClassMetadata.php b/src/Persistence/Mapping/ClassMetadata.php
index f407ba3b..c258aa2c 100644
--- a/src/Persistence/Mapping/ClassMetadata.php
+++ b/src/Persistence/Mapping/ClassMetadata.php
@@ -17,7 +17,7 @@ interface ClassMetadata
* Gets the fully-qualified class name of this persistent class.
*
* @return string
- * @psalm-return class-string
+ * @phpstan-return class-string
*/
public function getName();
@@ -27,7 +27,7 @@ public function getName();
* The returned structure is an array of the identifier field names.
*
* @return array
- * @psalm-return list
+ * @phpstan-return list
*/
public function getIdentifier();
@@ -112,7 +112,7 @@ public function getTypeOfField(string $fieldName);
* Returns the target class name of the given association.
*
* @return string|null
- * @psalm-return class-string|null
+ * @phpstan-return class-string|null
*/
public function getAssociationTargetClass(string $assocName);
diff --git a/src/Persistence/Mapping/ClassMetadataFactory.php b/src/Persistence/Mapping/ClassMetadataFactory.php
index 28b83033..25c649e5 100644
--- a/src/Persistence/Mapping/ClassMetadataFactory.php
+++ b/src/Persistence/Mapping/ClassMetadataFactory.php
@@ -16,7 +16,7 @@ interface ClassMetadataFactory
* mapping driver.
*
* @return ClassMetadata[] The ClassMetadata instances of all mapped classes.
- * @psalm-return list
+ * @phpstan-return list
*/
public function getAllMetadata();
@@ -26,7 +26,7 @@ public function getAllMetadata();
* @param class-string $className The name of the class.
*
* @return ClassMetadata
- * @psalm-return T
+ * @phpstan-return T
*/
public function getMetadataFor(string $className);
@@ -43,7 +43,7 @@ public function hasMetadataFor(string $className);
* Sets the metadata descriptor for a specific class.
*
* @param class-string $className
- * @psalm-param T $class
+ * @phpstan-param T $class
*
* @return void
*/
@@ -53,7 +53,7 @@ public function setMetadataFor(string $className, ClassMetadata $class);
* Returns whether the class with the specified name should have its metadata loaded.
* This is only the case if it is either mapped directly or as a MappedSuperclass.
*
- * @psalm-param class-string $className
+ * @phpstan-param class-string $className
*
* @return bool
*/
diff --git a/src/Persistence/Mapping/Driver/ColocatedMappingDriver.php b/src/Persistence/Mapping/Driver/ColocatedMappingDriver.php
index e85ba700..00bc9da2 100644
--- a/src/Persistence/Mapping/Driver/ColocatedMappingDriver.php
+++ b/src/Persistence/Mapping/Driver/ColocatedMappingDriver.php
@@ -54,7 +54,7 @@ trait ColocatedMappingDriver
* Cache for getAllClassNames().
*
* @var array|null
- * @psalm-var list|null
+ * @phpstan-var list|null
*/
protected $classNames;
@@ -128,7 +128,7 @@ public function setFileExtension(string $fileExtension)
* Returns whether the class with the specified name is transient. Only non-transient
* classes, that is entities and mapped superclasses, should have their metadata loaded.
*
- * @psalm-param class-string $className
+ * @phpstan-param class-string $className
*
* @return bool
*/
@@ -138,7 +138,7 @@ abstract public function isTransient(string $className);
* Gets the names of all mapped classes known to this driver.
*
* @return string[] The names of all mapped classes known to this driver.
- * @psalm-return list
+ * @phpstan-return list
*/
public function getAllClassNames()
{
diff --git a/src/Persistence/Mapping/Driver/DefaultFileLocator.php b/src/Persistence/Mapping/Driver/DefaultFileLocator.php
index 9b00e744..1f48ddee 100644
--- a/src/Persistence/Mapping/Driver/DefaultFileLocator.php
+++ b/src/Persistence/Mapping/Driver/DefaultFileLocator.php
@@ -147,7 +147,7 @@ public function getAllClassNames(string $globalBasename)
// NOTE: All files found here means classes are not transient!
assert(is_string($fileName));
- /** @psalm-var class-string */
+ /** @phpstan-var class-string */
$class = str_replace('.', '\\', $fileName);
$classes[] = $class;
}
diff --git a/src/Persistence/Mapping/Driver/FileDriver.php b/src/Persistence/Mapping/Driver/FileDriver.php
index c1162331..4c2d86d0 100644
--- a/src/Persistence/Mapping/Driver/FileDriver.php
+++ b/src/Persistence/Mapping/Driver/FileDriver.php
@@ -31,7 +31,7 @@ abstract class FileDriver implements MappingDriver
/**
* @var mixed[]|null
- * @psalm-var array|null
+ * @phpstan-var array|null
*/
protected $classCache;
@@ -78,7 +78,7 @@ public function getGlobalBasename()
* Gets the element of schema meta data for the class from the mapping file.
* This will lazily load the mapping file if it is not loaded yet.
*
- * @psalm-param class-string $className
+ * @phpstan-param class-string $className
*
* @return T The element of schema meta data.
*
@@ -137,7 +137,7 @@ public function getAllClassNames()
return $this->locator->getAllClassNames($this->globalBasename);
}
- /** @psalm-var array> $classCache */
+ /** @phpstan-var array> $classCache */
$classCache = $this->classCache;
/** @var list $keys */
@@ -156,7 +156,7 @@ public function getAllClassNames()
* @param string $file The mapping file to load.
*
* @return mixed[]
- * @psalm-return array
+ * @phpstan-return array
*/
abstract protected function loadMappingFile(string $file);
diff --git a/src/Persistence/Mapping/Driver/FileLocator.php b/src/Persistence/Mapping/Driver/FileLocator.php
index e57d5398..0a338753 100644
--- a/src/Persistence/Mapping/Driver/FileLocator.php
+++ b/src/Persistence/Mapping/Driver/FileLocator.php
@@ -25,7 +25,7 @@ public function findMappingFile(string $className);
* @param string $globalBasename Passed to allow excluding the basename.
*
* @return array
- * @psalm-return list
+ * @phpstan-return list
*/
public function getAllClassNames(string $globalBasename);
diff --git a/src/Persistence/Mapping/Driver/MappingDriver.php b/src/Persistence/Mapping/Driver/MappingDriver.php
index 9b6f0c80..b59eb968 100644
--- a/src/Persistence/Mapping/Driver/MappingDriver.php
+++ b/src/Persistence/Mapping/Driver/MappingDriver.php
@@ -14,8 +14,8 @@ interface MappingDriver
/**
* Loads the metadata for the specified class into the provided container.
*
- * @psalm-param class-string $className
- * @psalm-param ClassMetadata $metadata
+ * @phpstan-param class-string $className
+ * @phpstan-param ClassMetadata $metadata
*
* @return void
*
@@ -27,7 +27,7 @@ public function loadMetadataForClass(string $className, ClassMetadata $metadata)
* Gets the names of all mapped classes known to this driver.
*
* @return array The names of all mapped classes known to this driver.
- * @psalm-return list
+ * @phpstan-return list
*/
public function getAllClassNames();
@@ -35,7 +35,7 @@ public function getAllClassNames();
* Returns whether the class with the specified name should have its metadata loaded.
* This is only the case if it is either mapped as an Entity or a MappedSuperclass.
*
- * @psalm-param class-string $className
+ * @phpstan-param class-string $className
*
* @return bool
*/
diff --git a/src/Persistence/Mapping/Driver/PHPDriver.php b/src/Persistence/Mapping/Driver/PHPDriver.php
index 1c1ab9c8..052cafbf 100644
--- a/src/Persistence/Mapping/Driver/PHPDriver.php
+++ b/src/Persistence/Mapping/Driver/PHPDriver.php
@@ -16,7 +16,7 @@ class PHPDriver extends FileDriver
{
/**
* @var ClassMetadata
- * @psalm-var ClassMetadata