UPGRADING.md
The minimum PHP version was raised to PHP 8.1.17.
Dictionaries were refactored and are now automatically generated and validated with the new bin/gen_callmap.sh script, see here » for the full documentation.
[BC] The configuration settings ignoreInternalFunctionFalseReturn and ignoreInternalFunctionNullReturn are now defaulted to false
[BC] Switched the internal representation of list<T> and non-empty-list<T> from the TList and TNonEmptyList classes to an unsealed list shape: the TList, TNonEmptyList and TCallableList classes were removed.
Nothing will change for users: the list<T> and non-empty-list<T> syntax will remain supported and its semantics unchanged.
Psalm 5 already deprecates the TList, TNonEmptyList and TCallableList classes: use \Psalm\Type::getListAtomic, \Psalm\Type::getNonEmptyListAtomic and \Psalm\Type::getCallableListAtomic to instantiate list atomics, or directly instantiate TKeyedArray objects with is_list=true where appropriate.
[BC] The only optional boolean parameter of TKeyedArray::getGenericArrayType was removed, and was replaced with a string parameter with a different meaning.
[BC] The TDependentListKey type was removed and replaced with an optional property of the TIntRange type.
[BC] TCallableArray and TCallableList removed and replaced with TCallableKeyedArray.
[BC] Class Psalm\Issue\MixedInferredReturnType was removed
[BC] Value of constant Psalm\Type\TaintKindGroup::ALL_INPUT changed to reflect new TaintKind::INPUT_EXTRACT, TaintKind::INPUT_SLEEP and TaintKind::INPUT_XPATH have been added. Accordingly, default values for $taint parameters of Psalm\Codebase::addTaintSource() and Psalm\Codebase::addTaintSink() have been changed as well.
[BC] Property Config::$shepherd_host was replaced with Config::$shepherd_endpoint
[BC] Methods Codebase::getSymbolLocation() and Codebase::getSymbolInformation() were replaced with Codebase::getSymbolLocationByReference()
[BC] Method Psalm\Type\Atomic\TKeyedArray::getList() was removed
[BC] Method Psalm\Storage\FunctionLikeStorage::getSignature() was replaced with FunctionLikeStorage::getCompletionSignature()
[BC] Property Psalm\Storage\FunctionLikeStorage::$unused_docblock_params was replaced with FunctionLikeStorage::$unused_docblock_parameters
[BC] Method Plugin\Shepherd::getCurlErrorMessage() was removed
[BC] Property Config::$find_unused_code changed default value from false to true
[BC] Property Config::$find_unused_baseline_entry changed default value from false to true
[BC] The return type of Psalm\Internal\LanguageServer\ProtocolWriter#write() changed from Amp\Promisetovoid` due to the switch to Amp v3
[BC] All parameters, properties and return typehints are now strictly typed.
[BC] strict_types is now applied to all files of the Psalm codebase.
[BC] Properties Psalm\Type\Atomic\TLiteralFloat::$value and Psalm\Type\Atomic\TLiteralInt::$value became typed (float and int respectively)
[BC] Property Psalm\Storage\EnumCaseStorage::$value changed from int|string|null to TLiteralInt|TLiteralString|null
[BC] Psalm\CodeLocation\Raw, Psalm\CodeLocation\ParseErrorLocation, Psalm\CodeLocation\DocblockTypeLocation, Psalm\Report\CountReport, Psalm\Type\Atomic\TNonEmptyArray are now all final.
[BC] Psalm\Config is now final.
[BC] The return type of Psalm\Plugin\ArgTypeInferer::infer changed from Union|false to Union|null
[BC] The extra_types property and setIntersectionTypes method of Psalm\Type\Atomic\TTypeAlias were removed.
[BC] Methods convertSeverity and calculateFingerprint of Psalm\Report\CodeClimateReport were removed.
[BC] Shaped arrays can now be sealed: this brings many assertion improvements and bugfixes, see the docs for more info.
[BC] All atomic types, Psalm\Type\Union, Psalm\CodeLocation and storages are fully immutable, use the new setter methods or the new constructors to change properties: these setter methods will return new instances without altering the original instance.
Full immutability fixes a whole class of bugs that occurred in multithreaded mode, you can now feel free to use --threads=$(nproc) ;)
Full immutability also makes Psalm run faster, even in single-threaded mode, by removing all superfluous clones!
For this purpose, __clone was also made private, forbidding the cloning of atomics, unions and storages (an old and brittle pattern used to avoid side-effects caused by mutability).
[BC] Psalm\Type\Unions are now fully immutable, pre-existing in-place mutator methods were removed and moved into Psalm\Type\MutableUnion.
To modify a union type, usage of the new setter methods in Psalm\Type\Union is strongly recommended.
When many consecutive property sets are required, use Psalm\Type\Union::setProperties method to avoid creating a new instance for each set.
All setter methods will return a new instance of the type without altering the original instance.
If many property sets are required throughout multiple methods on a single Union instance, use Psalm\Type\Union::getBuilder to turn a Psalm\Type\Union into a Psalm\Type\MutableUnion: once you're done, use Psalm\Type\MutableUnion::freeze to get a new Psalm\Type\Union.
Methods removed from Psalm\Type\Union and moved into Psalm\Type\MutableUnion:
replaceTypesaddTyperemoveTypesubstitutereplaceClassLike[BC] Psalm\Type\TypeNode::getChildNodes() was removed, use Psalm\Type\Union::getAtomicTypes() to get the types of a union, and use Psalm\Type\TypeVisitor with the new Psalm\Type\MutableTypeVisitor class to iterate over a type tree.
[BC] Psalm\Type\TypeVisitor is now fully immutable, implementors MUST NOT alter type nodes during iteration: use Psalm\Type\MutableTypeVisitor if type node mutation is desired.
[BC] TPositiveInt has been removed and replaced by TIntRange
[BC] Property Psalm\Config::$cache_directory is now internal. Use
Psalm\Config::getCacheDirectory() instead.
[BC] The parameter $php_version of Psalm\Type\Atomic::create() renamed
to $analysis_php_version_id and changed from array|null to int|null.
Previously it accepted PHP version as array{major_version, minor_version}
while now it accepts version ID, similar to how PHP_VERSION_ID is
calculated.
[BC] The parameter $php_version of Psalm\Type::parseString() renamed to
$analysis_php_version_id and changed from array|null to int|null.
Previously it accepted PHP version as array{major_version, minor_version}
while now it accepts version ID.
[BC] Parameter 0 of canBeFullyExpressedInPhp() of the classes listed below
changed name from php_major_version to analysis_php_version_id.
Previously it accepted major PHP version as int (e.g. 7), while now it
accepts version ID. Classes affected:
Psalm\Type\AtomicPsalm\Type\Atomic\ScalarPsalm\Type\Atomic\TArrayPsalm\Type\Atomic\TArrayKeyPsalm\Type\Atomic\TCallablePsalm\Type\Atomic\TCallableObjectPsalm\Type\Atomic\TCallableStringPsalm\Type\Atomic\TClassConstantPsalm\Type\Atomic\TClassStringPsalm\Type\Atomic\TClassStringMapPsalm\Type\Atomic\TClosedResourcePsalm\Type\Atomic\TClosurePsalm\Type\Atomic\TConditionalPsalm\Type\Atomic\TDependentGetClassPsalm\Type\Atomic\TDependentGetDebugTypePsalm\Type\Atomic\TDependentGetTypePsalm\Type\Atomic\TDependentListKeyPsalm\Type\Atomic\TEnumCasePsalm\Type\Atomic\TFalsePsalm\Type\Atomic\TGenericObjectPsalm\Type\Atomic\TIntMaskPsalm\Type\Atomic\TIntMaskOfPsalm\Type\Atomic\TIntRangePsalm\Type\Atomic\TIterablePsalm\Type\Atomic\TKeyedArrayPsalm\Type\Atomic\TKeyOfPsalm\Type\Atomic\TListPsalm\Type\Atomic\TLiteralClassStringPsalm\Type\Atomic\TLowercaseStringPsalm\Type\Atomic\TMixedPsalm\Type\Atomic\TNamedObjectPsalm\Type\Atomic\TNeverPsalm\Type\Atomic\TNonEmptyLowercaseStringPsalm\Type\Atomic\TNonspecificLiteralIntPsalm\Type\Atomic\TNonspecificLiteralStringPsalm\Type\Atomic\TNullPsalm\Type\Atomic\TNumericPsalm\Type\Atomic\TNumericStringPsalm\Type\Atomic\TObjectPsalm\Type\Atomic\TObjectWithPropertiesPsalm\Type\Atomic\TResourcePsalm\Type\Atomic\TScalarPsalm\Type\Atomic\TTemplateIndexedAccessPsalm\Type\Atomic\TTemplateParamPsalm\Type\Atomic\TTraitStringPsalm\Type\Atomic\TTruePsalm\Type\Atomic\TTypeAliasPsalm\Type\Atomic\TValueOfPsalm\Type\Atomic\TVoidPsalm\Type\Union[BC] Parameter 3 of toPhpString() of methods listed below changed name
from php_major_version to analysis_php_version_id. Previously it
accepted major PHP version as int (e.g. 7), while now it accepts version
ID. Classes affected:
Psalm\Type\AtomicPsalm\Type\Atomic\CallableTraitPsalm\Type\Atomic\TAnonymousClassInstancePsalm\Type\Atomic\TArrayPsalm\Type\Atomic\TArrayKeyPsalm\Type\Atomic\TBoolPsalm\Type\Atomic\TCallablePsalm\Type\Atomic\TCallableObjectPsalm\Type\Atomic\TClassConstantPsalm\Type\Atomic\TClassStringPsalm\Type\Atomic\TClassStringMapPsalm\Type\Atomic\TClosedResourcePsalm\Type\Atomic\TConditionalPsalm\Type\Atomic\TEmptyPsalm\Type\Atomic\TEnumCasePsalm\Type\Atomic\TFloatPsalm\Type\Atomic\TGenericObjectPsalm\Type\Atomic\TIntPsalm\Type\Atomic\TIterablePsalm\Type\Atomic\TKeyedArrayPsalm\Type\Atomic\TKeyOfPsalm\Type\Atomic\TListPsalm\Type\Atomic\TLiteralClassStringPsalm\Type\Atomic\TMixedPsalm\Type\Atomic\TNamedObjectPsalm\Type\Atomic\TNeverPsalm\Type\Atomic\TNullPsalm\Type\Atomic\TNumericPsalm\Type\Atomic\TObjectPsalm\Type\Atomic\TObjectWithPropertiesPsalm\Type\Atomic\TResourcePsalm\Type\Atomic\TScalarPsalm\Type\Atomic\TStringPsalm\Type\Atomic\TTemplateIndexedAccessPsalm\Type\Atomic\TTemplateParamPsalm\Type\Atomic\TTraitStringPsalm\Type\Atomic\TTypeAliasPsalm\Type\Atomic\TValueOfPsalm\Type\Atomic\TVoidPsalm\Type\UnionWhile not a BC break per se, all classes / interfaces / traits / enums under
Psalm\Internal namespace are now marked @internal.
[BC] Parameter 1 of Psalm\Type\Atomic\TNamedObject::__construct() changed name from was_static to is_static
[BC] Parameter 1 of Psalm\Type\Atomic\TAnonymousClassInstance::__construct() changed name from was_static to is_static
[BC] Parameter 5 of Psalm\Type::getStringFromFQCLN() changed name from was_static to is_static
[BC] Property Psalm\Type\Atomic\TNamedObject::$was_static was renamed to $is_static
[BC] Method Psalm\Type\Union::isFormerStaticObject() was renamed to isStaticObject()
[BC] Method Psalm\Type\Union::hasFormerStaticObject() was renamed to hasStaticObject()
[BC] Function assertions (from @psalm-assert Foo $bar) have been converted from strings to specific Assertion objects.
[BC] Property Psalm\Storage\ClassLikeStorage::$invalid_dependencies changed from array<string> to array<string, true>.
[BC] Property Psalm\Storage\ClassLikeStorage::$template_extended_count was renamed to $template_type_extends_count, its type was changed from int|null to array<string, int>|null.
[BC] Event classes became final and their constructors were marked @internal:
Psalm\Plugin\EventHandler\Event\AddRemoveTaintsEventPsalm\Plugin\EventHandler\Event\AfterAnalysisEventPsalm\Plugin\EventHandler\Event\AfterClassLikeAnalysisEventPsalm\Plugin\EventHandler\Event\AfterClassLikeExistenceCheckEventPsalm\Plugin\EventHandler\Event\AfterClassLikeVisitEventPsalm\Plugin\EventHandler\Event\AfterCodebasePopulatedEventPsalm\Plugin\EventHandler\Event\AfterEveryFunctionCallAnalysisEventPsalm\Plugin\EventHandler\Event\AfterExpressionAnalysisEventPsalm\Plugin\EventHandler\Event\AfterFileAnalysisEventPsalm\Plugin\EventHandler\Event\AfterFunctionCallAnalysisEventPsalm\Plugin\EventHandler\Event\AfterFunctionLikeAnalysisEventPsalm\Plugin\EventHandler\Event\AfterMethodCallAnalysisEventPsalm\Plugin\EventHandler\Event\AfterStatementAnalysisEventPsalm\Plugin\EventHandler\Event\BeforeFileAnalysisEventPsalm\Plugin\EventHandler\Event\FunctionExistenceProviderEventPsalm\Plugin\EventHandler\Event\FunctionParamsProviderEventPsalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEventPsalm\Plugin\EventHandler\Event\MethodExistenceProviderEventPsalm\Plugin\EventHandler\Event\MethodParamsProviderEventPsalm\Plugin\EventHandler\Event\MethodReturnTypeProviderEventPsalm\Plugin\EventHandler\Event\MethodVisibilityProviderEventPsalm\Plugin\EventHandler\Event\PropertyExistenceProviderEventPsalm\Plugin\EventHandler\Event\PropertyTypeProviderEventPsalm\Plugin\EventHandler\Event\PropertyVisibilityProviderEventPsalm\Plugin\EventHandler\Event\StringInterpreterEvent[BC] Atomic::__toString() used to return a string representation of the type that was using double quotes (") to quote literals. This is now using single quotes (') to be more aligned with the rest of the codebase.
[BC] Atomic::__toString() is now final
[BC] Atomic::__toString() now returns a more detailed version of the type (it calls getId() under the hood)
[BC] Atomic::getId() has now a first param $exact. Calling the method with false will return a less detailed version of the type in some cases (similarly to what __toString used to return)
[BC] To remove a variable from the context, use Context::remove(). Calling
unset($context->vars_in_scope[$var_id]) can cause problems when using references.
[BC] TKeyOfClassConstant has been renamed to TKeyOf.
[BC] TValueOfClassConstant has been renamed to TValueOf.
[BC] TKeyOfTemplate base class has been changed from Scalar to Atomic.
[BC] Class Psalm\FileManipulation became final
[BC] Class Psalm\Context became final
[BC] Psalm\Context#__construct() was marked @internal
[BC] Class Psalm\PluginRegistrationSocket became final
[BC] Class Psalm\PluginFileExtensionsSocket became final
[BC] Class Psalm\Config\IssueHandler became final
[BC] Psalm\Config\IssueHandler was marked @internal
[BC] Class Psalm\Config\ProjectFileFilter became final
[BC] Psalm\Config\ProjectFileFilter was marked @internal
[BC] Class Psalm\Config\Creator became final
[BC] Psalm\Config\Creator was marked @internal
[BC] Class Psalm\Config\TaintAnalysisFileFilter became final
[BC] Psalm\Config\TaintAnalysisFileFilter was marked @internal
[BC] Class Psalm\Config\ErrorLevelFileFilter became final
[BC] Psalm\Config\ErrorLevelFileFilter was marked @internal
[BC] Class Psalm\FileBasedPluginAdapter became final
[BC] Psalm\FileBasedPluginAdapter was marked @internal
[BC] Class Psalm\Exception\InvalidMethodOverrideException became final
[BC] Class Psalm\Exception\UnpopulatedClasslikeException became final
[BC] Class Psalm\Exception\ConfigNotFoundException became final
[BC] Class Psalm\Exception\TypeParseTreeException became final
[BC] Class Psalm\Exception\ComplicatedExpressionException became final
[BC] Class Psalm\Exception\ScopeAnalysisException became final
[BC] Class Psalm\Exception\InvalidClasslikeOverrideException became final
[BC] Class Psalm\Exception\CircularReferenceException became final
[BC] Class Psalm\Exception\UnsupportedIssueToFixException became final
[BC] Class Psalm\Exception\CodeException became final
[BC] Class Psalm\Exception\RefactorException became final
[BC] Class Psalm\Exception\UnpreparedAnalysisException became final
[BC] Class Psalm\Exception\IncorrectDocblockException became final
[BC] Class Psalm\Exception\UnanalyzedFileException became final
[BC] Class Psalm\Exception\UnresolvableConstantException became final
[BC] Class Psalm\Exception\FileIncludeException became final
[BC] Class Psalm\Exception\ConfigCreationException became final
[BC] Class Psalm\Aliases became final
[BC] Psalm\Aliases#__construct() was marked @internal
[BC] Class Psalm\Codebase became final
[BC] Psalm\Codebase#__construct() was marked @internal
[BC] Class Psalm\Progress\VoidProgress became final
[BC] Class Psalm\Progress\DebugProgress became final
[BC] Class Psalm\Report\JsonReport became final
[BC] Class Psalm\Report\SonarqubeReport became final
[BC] Class Psalm\Report\CodeClimateReport became final
[BC] Class Psalm\Report\CheckstyleReport became final
[BC] Class Psalm\Report\JsonSummaryReport became final
[BC] Class Psalm\Report\XmlReport became final
[BC] Class Psalm\Report\EmacsReport became final
[BC] Class Psalm\Report\ConsoleReport became final
[BC] Class Psalm\Report\ReportOptions became final
[BC] Class Psalm\Report\PylintReport became final
[BC] Class Psalm\Report\JunitReport became final
[BC] Class Psalm\Report\CompactReport became final
[BC] Class Psalm\Report\GithubActionsReport became final
[BC] Class Psalm\Report\TextReport became final
[BC] Class Psalm\Report\SarifReport became final
[BC] Class Psalm\Report\PhpStormReport became final
[BC] Class Psalm\Plugin\Shepherd became final
[BC] Class Psalm\IssueBuffer became final
[BC] Class Psalm\SourceControl\Git\RemoteInfo became final
[BC] Class Psalm\SourceControl\Git\CommitInfo became final
[BC] Class Psalm\SourceControl\Git\GitInfo became final
[BC] Class Psalm\ErrorBaseline became final
[BC] Psalm\Config#__construct() was marked @internal
[BC] Class Psalm\DocComment became final
All non-abstract issues are now final:
Psalm\Issue\InaccessibleProperty became finalPsalm\Issue\TaintedShell became finalPsalm\Issue\PossiblyInvalidIterator became finalPsalm\Issue\MethodSignatureMustOmitReturnType became finalPsalm\Issue\TaintedHtml became finalPsalm\Issue\DuplicateConstant became finalPsalm\Issue\MissingConstructor became finalPsalm\Issue\PossiblyFalseIterator became finalPsalm\Issue\PossiblyUndefinedArrayOffset became finalPsalm\Issue\FalseOperand became finalPsalm\Issue\MixedArrayAssignment became finalPsalm\Issue\MixedArrayAccess became finalPsalm\Issue\TaintedUnserialize became finalPsalm\Issue\NullFunctionCall became finalPsalm\Issue\UnusedConstructor became finalPsalm\Issue\InvalidEnumCaseValue became finalPsalm\Issue\MissingClosureReturnType became finalPsalm\Issue\LessSpecificClassConstantType became finalPsalm\Issue\MixedPropertyFetch became finalPsalm\Issue\PossiblyNullArrayAccess became finalPsalm\Issue\MissingPropertyType became finalPsalm\Issue\TaintedCallable became finalPsalm\Issue\PossiblyInvalidMethodCall became finalPsalm\Issue\TaintedHeader became finalPsalm\Issue\PossiblyInvalidArrayAssignment became finalPsalm\Issue\PossiblyInvalidCast became finalPsalm\Issue\ImpurePropertyAssignment became finalPsalm\Issue\MixedPropertyTypeCoercion became finalPsalm\Issue\UnresolvableConstant became finalPsalm\Issue\LoopInvalidation became finalPsalm\Issue\TooManyTemplateParams became finalPsalm\Issue\InvalidCatch became finalPsalm\Issue\MismatchingDocblockReturnType became finalPsalm\Issue\PossiblyUndefinedIntArrayOffset became finalPsalm\Issue\NullArrayAccess became finalPsalm\Issue\NoEnumProperties became finalPsalm\Issue\ImpureByReferenceAssignment became finalPsalm\Issue\RedundantConditionGivenDocblockType became finalPsalm\Issue\MixedReturnTypeCoercion became finalPsalm\Issue\PossiblyNullOperand became finalPsalm\Issue\InvalidGlobal became finalPsalm\Issue\PossiblyNullArgument became finalPsalm\Issue\ForbiddenCode became finalPsalm\Issue\RedundantCast became finalPsalm\Issue\UnusedParam became finalPsalm\Issue\DuplicateArrayKey became finalPsalm\Issue\MissingImmutableAnnotation became finalPsalm\Issue\MutableDependency became finalPsalm\Issue\MixedPropertyAssignment became finalPsalm\Issue\DeprecatedTrait became finalPsalm\Issue\InvalidArrayAccess became finalPsalm\Issue\LessSpecificReturnStatement became finalPsalm\Issue\AssignmentToVoid became finalPsalm\Issue\InvalidPropertyAssignment became finalPsalm\Issue\InvalidFalsableReturnType became finalPsalm\Issue\IfThisIsMismatch became finalPsalm\Issue\UndefinedPropertyFetch became finalPsalm\Issue\UndefinedMagicPropertyFetch became finalPsalm\Issue\PossiblyUnusedReturnValue became finalPsalm\Issue\PossiblyNullPropertyFetch became finalPsalm\Issue\PossiblyInvalidPropertyFetch became finalPsalm\Issue\MixedClone became finalPsalm\Issue\DuplicateFunction became finalPsalm\Issue\InaccessibleClassConstant became finalPsalm\Issue\UndefinedGlobalVariable became finalPsalm\Issue\ImplicitToStringCast became finalPsalm\Issue\PossiblyInvalidDocblockTag became finalPsalm\Issue\ReservedWord became finalPsalm\Issue\InvalidOperand became finalPsalm\Issue\UnusedProperty became finalPsalm\Issue\UnevaluatedCode became finalPsalm\Issue\NullPropertyFetch became finalPsalm\Issue\ParamNameMismatch became finalPsalm\Issue\CircularReference became finalPsalm\Issue\UndefinedThisPropertyFetch became finalPsalm\Issue\NonStaticSelfCall became finalPsalm\Issue\NullOperand became finalPsalm\Issue\MixedAssignment became finalPsalm\Issue\MixedFunctionCall became finalPsalm\Issue\InvalidTypeImport became finalPsalm\Issue\PossiblyNullArrayOffset became finalPsalm\Issue\PossiblyInvalidArrayOffset became finalPsalm\Issue\PossiblyInvalidArgument became finalPsalm\Issue\UndefinedPropertyAssignment became finalPsalm\Issue\UnusedReturnValue became finalPsalm\Issue\ImpureFunctionCall became finalPsalm\Issue\RedundantFunctionCallGivenDocblockType became finalPsalm\Issue\PossiblyInvalidPropertyAssignmentValue became finalPsalm\Issue\PossiblyInvalidOperand became finalPsalm\Issue\ArgumentTypeCoercion became finalPsalm\Issue\OverriddenPropertyAccess became finalPsalm\Issue\PossiblyInvalidArrayAccess became finalPsalm\Issue\UnusedForeachValue became finalPsalm\Issue\ImplementedParamTypeMismatch became finalPsalm\Issue\InvalidConstantAssignmentValue became finalPsalm\Issue\PossiblyUndefinedMethod became finalPsalm\Issue\DuplicateEnumCaseValue became finalPsalm\Issue\RawObjectIteration became finalPsalm\Issue\UndefinedVariable became finalPsalm\Issue\MissingDocblockType became finalPsalm\Issue\NullArrayOffset became finalPsalm\Issue\PropertyNotSetInConstructor became finalPsalm\Issue\PossiblyInvalidPropertyAssignment became finalPsalm\Issue\PossiblyNullPropertyAssignmentValue became finalPsalm\Issue\UnsafeInstantiation became finalPsalm\Issue\UnimplementedAbstractMethod became finalPsalm\Issue\UnusedClosureParam became finalPsalm\Issue\PossiblyNullFunctionCall became finalPsalm\Issue\UndefinedAttributeClass became finalPsalm\Issue\NullableReturnStatement became finalPsalm\Issue\DuplicateMethod became finalPsalm\Issue\TooFewArguments became finalPsalm\Issue\UndefinedConstant became finalPsalm\Issue\NullReference became finalPsalm\Issue\ImplementedReturnTypeMismatch became finalPsalm\Issue\InvalidEnumBackingType became finalPsalm\Issue\InvalidNullableReturnType became finalPsalm\Issue\ImpureVariable became finalPsalm\Issue\TypeDoesNotContainNull became finalPsalm\Issue\ConstructorSignatureMismatch became finalPsalm\Issue\ImpurePropertyFetch became finalPsalm\Issue\RedundantCastGivenDocblockType became finalPsalm\Issue\PropertyTypeCoercion became finalPsalm\Issue\InvalidDocblockParamName became finalPsalm\Issue\UnsafeGenericInstantiation became finalPsalm\Issue\MissingClosureParamType became finalPsalm\Issue\TraitMethodSignatureMismatch became finalPsalm\Issue\ImpureStaticProperty became finalPsalm\Issue\InvalidThrow became finalPsalm\Issue\ParentNotFound became finalPsalm\Issue\ImpureStaticVariable became finalPsalm\Issue\PossiblyFalseReference became finalPsalm\Issue\ComplexMethod became finalPsalm\Issue\PossiblyNullArrayAssignment became finalPsalm\Issue\AbstractInstantiation became finalPsalm\Issue\UncaughtThrowInGlobalScope became finalPsalm\Issue\MismatchingDocblockPropertyType became finalPsalm\Issue\UnresolvableInclude became finalPsalm\Issue\DocblockTypeContradiction became finalPsalm\Issue\TaintedEval became finalPsalm\Issue\UnusedVariable became finalPsalm\Issue\DeprecatedConstant became finalPsalm\Issue\TaintedSystemSecret became finalPsalm\Issue\EmptyArrayAccess became finalPsalm\Issue\UndefinedInterface became finalPsalm\Issue\MixedInferredReturnType became finalPsalm\Issue\TaintedCookie became finalPsalm\Issue\UndefinedMagicPropertyAssignment became finalPsalm\Issue\NamedArgumentNotAllowed became finalPsalm\Issue\MethodSignatureMustProvideReturnType became finalPsalm\Issue\MissingParamType became finalPsalm\Issue\InvalidArrayAssignment became finalPsalm\Issue\UnimplementedInterfaceMethod became finalPsalm\Issue\InvalidPassByReference became finalPsalm\Issue\MissingDependency became finalPsalm\Issue\ReferenceConstraintViolation became finalPsalm\Issue\TaintedLdap became finalPsalm\Issue\PossiblyNullIterator became finalPsalm\Issue\InvalidScalarArgument became finalPsalm\Issue\DeprecatedMethod became finalPsalm\Issue\NullPropertyAssignment became finalPsalm\Issue\InvalidExtendClass became finalPsalm\Issue\DeprecatedClass became finalPsalm\Issue\ReferenceReusedFromConfusingScope became finalPsalm\Issue\UndefinedFunction became finalPsalm\Issue\LessSpecificImplementedReturnType became finalPsalm\Issue\NullIterator became finalPsalm\Issue\TaintedInclude became finalPsalm\Issue\UnusedMethodCall became finalPsalm\Issue\InvalidIterator became finalPsalm\Issue\PsalmInternalError became finalPsalm\Issue\InvalidParent became finalPsalm\Issue\AmbiguousConstantInheritance became finalPsalm\Issue\InvalidLiteralArgument became finalPsalm\Issue\MixedReturnStatement became finalPsalm\Issue\AbstractMethodCall became finalPsalm\Issue\InvalidClone became finalPsalm\Issue\DuplicateEnumCase became finalPsalm\Issue\InvalidDocblock became finalPsalm\Issue\RedundantIdentityWithTrue became finalPsalm\Issue\MissingReturnType became finalPsalm\Issue\RedundantCondition became finalPsalm\Issue\UnnecessaryVarAnnotation became finalPsalm\Issue\ConfigIssue became finalPsalm\Issue\InternalClass became finalPsalm\Issue\UndefinedDocblockClass became finalPsalm\Issue\DuplicateParam became finalPsalm\Issue\MismatchingDocblockParamType became finalPsalm\Issue\LessSpecificReturnType became finalPsalm\Issue\PossiblyUnusedProperty became finalPsalm\Issue\PossiblyNullReference became finalPsalm\Issue\MissingFile became finalPsalm\Issue\InvalidArgument became finalPsalm\Issue\PossiblyUndefinedGlobalVariable became finalPsalm\Issue\UndefinedThisPropertyAssignment became finalPsalm\Issue\ConflictingReferenceConstraint became finalPsalm\Issue\InvalidCast became finalPsalm\Issue\MoreSpecificReturnType became finalPsalm\Issue\ImpureMethodCall became finalPsalm\Issue\UnrecognizedExpression became finalPsalm\Issue\NoValue became finalPsalm\Issue\DeprecatedInterface became finalPsalm\Issue\InvalidStringClass became finalPsalm\Issue\MixedMethodCall became finalPsalm\Issue\UndefinedMagicMethod became finalPsalm\Issue\MissingThrowsDocblock became finalPsalm\Issue\TaintedTextWithQuotes became finalPsalm\Issue\InvalidReturnStatement became finalPsalm\Issue\DeprecatedFunction became finalPsalm\Issue\InterfaceInstantiation became finalPsalm\Issue\TooManyArguments became finalPsalm\Issue\PossibleRawObjectIteration became finalPsalm\Issue\PossiblyFalsePropertyAssignmentValue became finalPsalm\Issue\FalsableReturnStatement became finalPsalm\Issue\RedundantFunctionCall became finalPsalm\Issue\ImplementationRequirementViolation became finalPsalm\Issue\InternalMethod became finalPsalm\Issue\PossiblyInvalidFunctionCall became finalPsalm\Issue\OverriddenMethodAccess became finalPsalm\Issue\MixedArgumentTypeCoercion became finalPsalm\Issue\InvalidAttribute became finalPsalm\Issue\UndefinedInterfaceMethod became finalPsalm\Issue\InvalidPropertyFetch became finalPsalm\Issue\PossiblyUnusedMethod became finalPsalm\Issue\UndefinedTrace became finalPsalm\Issue\NullArgument became finalPsalm\Issue\UndefinedMethod became finalPsalm\Issue\TaintedUserSecret became finalPsalm\Issue\UndefinedTrait became finalPsalm\Issue\UnusedClass became finalPsalm\Issue\StringIncrement became finalPsalm\Issue\InaccessibleMethod became finalPsalm\Issue\PossiblyUnusedParam became finalPsalm\Issue\Trace became finalPsalm\Issue\UnhandledMatchCondition became finalPsalm\Issue\DuplicateClass became finalPsalm\Issue\InvalidClass became finalPsalm\Issue\TypeDoesNotContainType became finalPsalm\Issue\InvalidScope became finalPsalm\Issue\TaintedCustom became finalPsalm\Issue\TaintedSSRF became finalPsalm\Issue\InvalidNamedArgument became finalPsalm\Issue\InvalidPropertyAssignmentValue became finalPsalm\Issue\ContinueOutsideLoop became finalPsalm\Issue\MixedArgument became finalPsalm\Issue\TaintedSql became finalPsalm\Issue\UnusedFunctionCall became finalPsalm\Issue\InternalProperty became finalPsalm\Issue\InvalidParamDefault became finalPsalm\Issue\RedundantPropertyInitializationCheck became finalPsalm\Issue\InvalidTraversableImplementation became finalPsalm\Issue\InvalidTemplateParam became finalPsalm\Issue\InvalidStaticInvocation became finalPsalm\Issue\MixedArrayOffset became finalPsalm\Issue\PossiblyInvalidClone became finalPsalm\Issue\InvalidFunctionCall became finalPsalm\Issue\InvalidMethodCall became finalPsalm\Issue\ComplexFunction became finalPsalm\Issue\UnusedPsalmSuppress became finalPsalm\Issue\MixedStringOffsetAssignment became finalPsalm\Issue\UnrecognizedStatement became finalPsalm\Issue\TaintedFile became finalPsalm\Issue\UnusedMethod became finalPsalm\Issue\PossiblyFalseArgument became finalPsalm\Issue\DeprecatedProperty became finalPsalm\Issue\PossiblyUndefinedVariable became finalPsalm\Issue\PossiblyNullPropertyAssignment became finalPsalm\Issue\MixedOperand became finalPsalm\Issue\NoInterfaceProperties became finalPsalm\Issue\InvalidReturnType became finalPsalm\Issue\MixedArrayTypeCoercion became finalPsalm\Issue\ParadoxicalCondition became finalPsalm\Issue\InvalidToString became finalPsalm\Issue\MethodSignatureMismatch became finalPsalm\Issue\PossiblyFalseOperand became finalPsalm\Issue\UndefinedClass became finalPsalm\Issue\OverriddenInterfaceConstant became finalPsalm\Issue\MissingTemplateParam became finalPsalm\Issue\InvalidArrayOffset became finalPsalm\Issue\MoreSpecificImplementedParamType became finalPsalm\Issue\UninitializedProperty became finalPsalm\Issue\ParseError became finalPsalm\Issue\PossiblyUndefinedStringArrayOffset became finalPsalm\Issue\ExtensionRequirementViolation became finalStorage classes became final:
Psalm\Storage\MethodStorage became finalPsalm\Storage\AttributeStorage became finalPsalm\Storage\FileStorage became finalPsalm\Storage\PropertyStorage became finalPsalm\Storage\FunctionStorage became finalPsalm\Storage\Assertion\HasArrayKey became finalPsalm\Storage\Assertion\Truthy became finalPsalm\Storage\Assertion\IsAClass became finalPsalm\Storage\Assertion\HasAtLeastCount became finalPsalm\Storage\Assertion\HasMethod became finalPsalm\Storage\Assertion\HasIntOrStringArrayAccess became finalPsalm\Storage\Assertion\DoesNotHaveMethod became finalPsalm\Storage\Assertion\IsLessThanOrEqualTo became finalPsalm\Storage\Assertion\IsNotAClass became finalPsalm\Storage\Assertion\ArrayKeyDoesNotExist became finalPsalm\Storage\Assertion\IsNotIdentical became finalPsalm\Storage\Assertion\IsClassEqual became finalPsalm\Storage\Assertion\NotNonEmptyCountable became finalPsalm\Storage\Assertion\Any became finalPsalm\Storage\Assertion\IsLooselyEqual became finalPsalm\Storage\Assertion\NonEmpty became finalPsalm\Storage\Assertion\IsGreaterThanOrEqualTo became finalPsalm\Storage\Assertion\HasStringArrayAccess became finalPsalm\Storage\Assertion\IsClassNotEqual became finalPsalm\Storage\Assertion\HasExactCount became finalPsalm\Storage\Assertion\IsNotCountable became finalPsalm\Storage\Assertion\IsIdentical became finalPsalm\Storage\Assertion\IsType became finalPsalm\Storage\Assertion\NotNestedAssertions became finalPsalm\Storage\Assertion\IsGreaterThan became finalPsalm\Storage\Assertion\IsIsset became finalPsalm\Storage\Assertion\Empty_ became finalPsalm\Storage\Assertion\IsNotType became finalPsalm\Storage\Assertion\ArrayKeyExists became finalPsalm\Storage\Assertion\DoesNotHaveAtLeastCount became finalPsalm\Storage\Assertion\IsNotIsset became finalPsalm\Storage\Assertion\NonEmptyCountable became finalPsalm\Storage\Assertion\NestedAssertions became finalPsalm\Storage\Assertion\Falsy became finalPsalm\Storage\Assertion\IsNotLooselyEqual became finalPsalm\Storage\Assertion\IsEqualIsset became finalPsalm\Storage\Assertion\IsLessThan became finalPsalm\Storage\Assertion\DoesNotHaveExactCount became finalPsalm\Storage\Assertion\IsCountable became finalPsalm\Storage\Assertion\NotInArray became finalPsalm\Storage\Assertion\InArray became finalPsalm\Storage\FunctionLikeParameter became finalPsalm\Storage\Possibilities became finalPsalm\Storage\ClassConstantStorage became finalPsalm\Storage\ClassLikeStorage became finalPsalm\Storage\AttributeArg became finalPsalm\Storage\EnumCaseStorage became finalVirtualNode classes became final
Psalm\Node\Stmt\VirtualFunction became finalPsalm\Node\Stmt\VirtualClassConst became finalPsalm\Node\Stmt\VirtualTraitUse became finalPsalm\Node\Stmt\VirtualElseIf became finalPsalm\Node\Stmt\VirtualDeclare became finalPsalm\Node\Stmt\VirtualHaltCompiler became finalPsalm\Node\Stmt\VirtualThrow became finalPsalm\Node\Stmt\TraitUseAdaptation\VirtualAlias became finalPsalm\Node\Stmt\TraitUseAdaptation\VirtualPrecedence became finalPsalm\Node\Stmt\VirtualNamespace became finalPsalm\Node\Stmt\VirtualIf became finalPsalm\Node\Stmt\VirtualStatic became finalPsalm\Node\Stmt\VirtualInlineHTML became finalPsalm\Node\Stmt\VirtualUseUse became finalPsalm\Node\Stmt\VirtualCatch became finalPsalm\Node\Stmt\VirtualDeclareDeclare became finalPsalm\Node\Stmt\VirtualEcho became finalPsalm\Node\Stmt\VirtualFinally became finalPsalm\Node\Stmt\VirtualInterface became finalPsalm\Node\Stmt\VirtualGlobal became finalPsalm\Node\Stmt\VirtualGroupUse became finalPsalm\Node\Stmt\VirtualLabel became finalPsalm\Node\Stmt\VirtualTrait became finalPsalm\Node\Stmt\VirtualClass became finalPsalm\Node\Stmt\VirtualUse became finalPsalm\Node\Stmt\VirtualProperty became finalPsalm\Node\Stmt\VirtualUnset became finalPsalm\Node\Stmt\VirtualPropertyProperty became finalPsalm\Node\Stmt\VirtualExpression became finalPsalm\Node\Stmt\VirtualSwitch became finalPsalm\Node\Stmt\VirtualStaticVar became finalPsalm\Node\Stmt\VirtualClassMethod became finalPsalm\Node\Stmt\VirtualNop became finalPsalm\Node\Stmt\VirtualReturn became finalPsalm\Node\Stmt\VirtualDo became finalPsalm\Node\Stmt\VirtualBreak became finalPsalm\Node\Stmt\VirtualElse became finalPsalm\Node\Stmt\VirtualContinue became finalPsalm\Node\Stmt\VirtualForeach became finalPsalm\Node\Stmt\VirtualGoto became finalPsalm\Node\Stmt\VirtualWhile became finalPsalm\Node\Stmt\VirtualFor became finalPsalm\Node\Stmt\VirtualCase became finalPsalm\Node\Stmt\VirtualTryCatch became finalPsalm\Node\Stmt\VirtualConst became finalPsalm\Node\VirtualAttribute became finalPsalm\Node\VirtualArg became finalPsalm\Node\Expr\VirtualUnaryPlus became finalPsalm\Node\Expr\VirtualMatch became finalPsalm\Node\Expr\VirtualNullsafeMethodCall became finalPsalm\Node\Expr\VirtualTernary became finalPsalm\Node\Expr\VirtualThrow became finalPsalm\Node\Expr\VirtualNew became finalPsalm\Node\Expr\VirtualEmpty became finalPsalm\Node\Expr\VirtualStaticPropertyFetch became finalPsalm\Node\Expr\VirtualUnaryMinus became finalPsalm\Node\Expr\VirtualStaticCall became finalPsalm\Node\Expr\VirtualPostInc became finalPsalm\Node\Expr\VirtualPreDec became finalPsalm\Node\Expr\VirtualAssign became finalPsalm\Node\Expr\VirtualErrorSuppress became finalPsalm\Node\Expr\VirtualPreInc became finalPsalm\Node\Expr\VirtualArray became finalPsalm\Node\Expr\VirtualArrayItem became finalPsalm\Node\Expr\VirtualIsset became finalPsalm\Node\Expr\VirtualClone became finalPsalm\Node\Expr\VirtualConstFetch became finalPsalm\Node\Expr\VirtualEval became finalPsalm\Node\Expr\VirtualPrint became finalPsalm\Node\Expr\VirtualError became finalPsalm\Node\Expr\VirtualClosure became finalPsalm\Node\Expr\VirtualNullsafePropertyFetch became finalPsalm\Node\Expr\VirtualArrowFunction became finalPsalm\Node\Expr\VirtualBooleanNot became finalPsalm\Node\Expr\VirtualPropertyFetch became finalPsalm\Node\Expr\Cast\VirtualArray became finalPsalm\Node\Expr\Cast\VirtualInt became finalPsalm\Node\Expr\Cast\VirtualObject became finalPsalm\Node\Expr\Cast\VirtualDouble became finalPsalm\Node\Expr\Cast\VirtualUnset became finalPsalm\Node\Expr\Cast\VirtualBool became finalPsalm\Node\Expr\Cast\VirtualString became finalPsalm\Node\Expr\VirtualMethodCall became finalPsalm\Node\Expr\BinaryOp\VirtualBitwiseAnd became finalPsalm\Node\Expr\BinaryOp\VirtualCoalesce became finalPsalm\Node\Expr\BinaryOp\VirtualDiv became finalPsalm\Node\Expr\BinaryOp\VirtualNotIdentical became finalPsalm\Node\Expr\BinaryOp\VirtualLogicalAnd became finalPsalm\Node\Expr\BinaryOp\VirtualSpaceship became finalPsalm\Node\Expr\BinaryOp\VirtualGreater became finalPsalm\Node\Expr\BinaryOp\VirtualShiftRight became finalPsalm\Node\Expr\BinaryOp\VirtualIdentical became finalPsalm\Node\Expr\BinaryOp\VirtualMul became finalPsalm\Node\Expr\BinaryOp\VirtualLogicalOr became finalPsalm\Node\Expr\BinaryOp\VirtualBitwiseXor became finalPsalm\Node\Expr\BinaryOp\VirtualSmallerOrEqual became finalPsalm\Node\Expr\BinaryOp\VirtualNotEqual became finalPsalm\Node\Expr\BinaryOp\VirtualGreaterOrEqual became finalPsalm\Node\Expr\BinaryOp\VirtualMinus became finalPsalm\Node\Expr\BinaryOp\VirtualEqual became finalPsalm\Node\Expr\BinaryOp\VirtualSmaller became finalPsalm\Node\Expr\BinaryOp\VirtualLogicalXor became finalPsalm\Node\Expr\BinaryOp\VirtualMod became finalPsalm\Node\Expr\BinaryOp\VirtualBooleanAnd became finalPsalm\Node\Expr\BinaryOp\VirtualPlus became finalPsalm\Node\Expr\BinaryOp\VirtualShiftLeft became finalPsalm\Node\Expr\BinaryOp\VirtualBooleanOr became finalPsalm\Node\Expr\BinaryOp\VirtualBitwiseOr became finalPsalm\Node\Expr\BinaryOp\VirtualConcat became finalPsalm\Node\Expr\BinaryOp\VirtualPow became finalPsalm\Node\Expr\VirtualVariable became finalPsalm\Node\Expr\VirtualBitwiseNot became finalPsalm\Node\Expr\VirtualShellExec became finalPsalm\Node\Expr\VirtualFuncCall became finalPsalm\Node\Expr\VirtualInclude became finalPsalm\Node\Expr\VirtualAssignRef became finalPsalm\Node\Expr\VirtualClassConstFetch became finalPsalm\Node\Expr\VirtualExit became finalPsalm\Node\Expr\VirtualArrayDimFetch became finalPsalm\Node\Expr\VirtualList became finalPsalm\Node\Expr\VirtualYield became finalPsalm\Node\Expr\VirtualYieldFrom became finalPsalm\Node\Expr\VirtualClosureUse became finalPsalm\Node\Expr\VirtualPostDec became finalPsalm\Node\Expr\AssignOp\VirtualBitwiseAnd became finalPsalm\Node\Expr\AssignOp\VirtualCoalesce became finalPsalm\Node\Expr\AssignOp\VirtualDiv became finalPsalm\Node\Expr\AssignOp\VirtualShiftRight became finalPsalm\Node\Expr\AssignOp\VirtualMul became finalPsalm\Node\Expr\AssignOp\VirtualBitwiseXor became finalPsalm\Node\Expr\AssignOp\VirtualMinus became finalPsalm\Node\Expr\AssignOp\VirtualMod became finalPsalm\Node\Expr\AssignOp\VirtualPlus became finalPsalm\Node\Expr\AssignOp\VirtualShiftLeft became finalPsalm\Node\Expr\AssignOp\VirtualBitwiseOr became finalPsalm\Node\Expr\AssignOp\VirtualConcat became finalPsalm\Node\Expr\AssignOp\VirtualPow became finalPsalm\Node\Expr\VirtualInstanceof became finalPsalm\Node\VirtualNullableType became finalPsalm\Node\VirtualMatchArm became finalPsalm\Node\VirtualIdentifier became finalPsalm\Node\VirtualName became finalPsalm\Node\VirtualParam became finalPsalm\Node\VirtualAttributeGroup became finalPsalm\Node\VirtualVarLikeIdentifier became finalPsalm\Node\Name\VirtualRelative became finalPsalm\Node\Name\VirtualFullyQualified became finalPsalm\Node\VirtualUnionType became finalPsalm\Node\Scalar\VirtualLNumber became finalPsalm\Node\Scalar\VirtualDNumber became finalPsalm\Node\Scalar\MagicConst\VirtualFunction became finalPsalm\Node\Scalar\MagicConst\VirtualNamespace became finalPsalm\Node\Scalar\MagicConst\VirtualMethod became finalPsalm\Node\Scalar\MagicConst\VirtualLine became finalPsalm\Node\Scalar\MagicConst\VirtualTrait became finalPsalm\Node\Scalar\MagicConst\VirtualClass became finalPsalm\Node\Scalar\MagicConst\VirtualDir became finalPsalm\Node\Scalar\MagicConst\VirtualFile became finalPsalm\Node\Scalar\VirtualEncapsedStringPart became finalPsalm\Node\Scalar\VirtualString became finalPsalm\Node\Scalar\VirtualEncapsed became finalPsalm\Node\VirtualConst became finalType nodes became final
Psalm\Type\TaintKindGroup became finalPsalm\Type\Atomic\TNumericString became finalPsalm\Type\Atomic\TClassStringMap became finalPsalm\Type\Atomic\TEmptyNumeric became finalPsalm\Type\Atomic\TCallableObject became finalPsalm\Type\Atomic\TSingleLetter became finalPsalm\Type\Atomic\TClosedResource became finalPsalm\Type\Atomic\TIntMaskOf became finalPsalm\Type\Atomic\TNonEmptyScalar became finalPsalm\Type\Atomic\TLowercaseString became finalPsalm\Type\Atomic\TCallable became finalPsalm\Type\Atomic\TFalse became finalPsalm\Type\Atomic\TIterable became finalPsalm\Type\Atomic\TTraitString became finalPsalm\Type\Atomic\TNonEmptyNonspecificLiteralString became finalPsalm\Type\Atomic\TLiteralInt became finalPsalm\Type\Atomic\TTrue became finalPsalm\Type\Atomic\TDependentGetClass became finalPsalm\Type\Atomic\TValueOf became finalPsalm\Type\Atomic\TGenericObject became finalPsalm\Type\Atomic\TNonEmptyLowercaseString became finalPsalm\Type\Atomic\TEnumCase became finalPsalm\Type\Atomic\TCallableKeyedArray became finalPsalm\Type\Atomic\TDependentGetDebugType became finalPsalm\Type\Atomic\TKeyOf became finalPsalm\Type\Atomic\TNonspecificLiteralInt became finalPsalm\Type\Atomic\TObjectWithProperties became finalPsalm\Type\Atomic\TTemplateValueOf became finalPsalm\Type\Atomic\TDependentListKey became finalPsalm\Type\Atomic\TConditional became finalPsalm\Type\Atomic\TIntRange became finalPsalm\Type\Atomic\TCallableString became finalPsalm\Type\Atomic\TClosure became finalPsalm\Type\Atomic\TTypeAlias became finalPsalm\Type\Atomic\TAnonymousClassInstance became finalPsalm\Type\Atomic\TIntMask became finalPsalm\Type\Atomic\TTemplateKeyOf became finalPsalm\Type\Atomic\TDependentGetType became finalPsalm\Type\Atomic\TLiteralFloat became finalPsalm\Type\Atomic\TCallableArray became finalPsalm\Type\Atomic\TNonEmptyMixed became finalPsalm\Type\Atomic\TTemplateParamClass became finalPsalm\Type\Atomic\TTemplateIndexedAccess became finalPsalm\Type\Atomic\TEmptyScalar became finalPsalm\Type\Atomic\TNever became finalPsalm\Type\Atomic\TNull became finalPsalm\Type\Atomic\TTemplateParam became finalPsalm\Type\Atomic\TLiteralClassString became finalPsalm\Type\Atomic\TResource became finalPsalm\Type\Atomic\TVoid became finalPsalm\Type\Atomic\TCallableList became finalPsalm\Type\Atomic\TEmptyMixed became finalPsalm\Type\Atomic\TClassConstant became finalPsalm\Type\TaintKind became finalPsalm\Type\Union became final[BC] Property Psalm\Config::$universal_object_crates changed default value
from array{'stdClass','SimpleXMLElement','SimpleXMLIterator'} to null
Psalm\Codebase::$php_major_version was removed, use
Psalm\Codebase::$analysis_php_version_id.Psalm\Codebase::$php_minor_version was removed, use
Psalm\Codebase::$analysis_php_version_id.Psalm\Type\Atomic\TEmpty was removedPsalm\Type\Union::isEmpty() was removedPsalm\Config::$allow_phpstorm_generics was removedPsalm\Config::$exit_functions was removedPsalm\Config::$forbid_echo was removedPsalm\Config::$load_xdebug_stub was removedPsalm\Type::getEmpty() was removedPsalm\Plugin\Hook\MethodReturnTypeProviderInterfacePsalm\Plugin\Hook\BeforeFileAnalysisInterfacePsalm\Plugin\Hook\AfterFileAnalysisInterfacePsalm\Plugin\Hook\AfterMethodCallAnalysisInterfacePsalm\Plugin\Hook\AfterClassLikeVisitInterfacePsalm\Plugin\Hook\StringInterpreterInterfacePsalm\Plugin\Hook\AfterExpressionAnalysisInterfacePsalm\Plugin\Hook\AfterEveryFunctionCallAnalysisInterfacePsalm\Plugin\Hook\PropertyExistenceProviderInterfacePsalm\Plugin\Hook\AfterFunctionLikeAnalysisInterfacePsalm\Plugin\Hook\FunctionParamsProviderInterfacePsalm\Plugin\Hook\FunctionReturnTypeProviderInterfacePsalm\Plugin\Hook\FunctionExistenceProviderInterfacePsalm\Plugin\Hook\AfterAnalysisInterfacePsalm\Plugin\Hook\MethodVisibilityProviderInterfacePsalm\Plugin\Hook\MethodParamsProviderInterfacePsalm\Plugin\Hook\AfterClassLikeExistenceCheckInterfacePsalm\Plugin\Hook\PropertyTypeProviderInterfacePsalm\Plugin\Hook\AfterFunctionCallAnalysisInterfacePsalm\Plugin\Hook\MethodExistenceProviderInterfacePsalm\Plugin\Hook\AfterCodebasePopulatedInterfacePsalm\Plugin\Hook\AfterClassLikeAnalysisInterfacePsalm\Plugin\Hook\PropertyVisibilityProviderInterfacePsalm\Plugin\Hook\AfterStatementAnalysisInterfacePsalm\Issue\CodeIssue::getLocation() was removedPsalm\Issue\CodeIssue::getFileName() was removedPsalm\Issue\CodeIssue::getMessage() was removedPsalm\DocComment::parse() was removedPsalm\Type\Atomic\THtmlEscapedString has been removedPsalm\Context::$vars_from_global has been renamed to $referenced_globalsPsalm\Plugin\RegistrationInterface::addFileTypeScanner was removedPsalm\Plugin\RegistrationInterface::addFileTypeAnalyzer was removedPsalm\Plugin\FileExtensionsInterfacePsalm\PluginRegistrationSocket::addFileTypeScanner was removedPsalm\PluginRegistrationSocket::getAdditionalFileTypeScanners was removedPsalm\PluginRegistrationSocket::addFileTypeAnalyzer was removedPsalm\PluginRegistrationSocket::getAdditionalFileTypeAnalyzers was removedPsalm\PluginRegistrationSocket::getAdditionalFileExtensions was removedPsalm\PluginRegistrationSocket::addFileExtension was removedPsalm\PluginFileExtensionsSocket\Psalm\Plugin\EventHandler\Event\AfterFunctionLikeAnalysisEvent::getClasslikeStorage() was removed,
use correct \Psalm\Plugin\EventHandler\Event\AfterFunctionLikeAnalysisEvent::getFunctionlikeStorage() instead