Releases: phpstan/phpstan
Releases · phpstan/phpstan
2.1.38
This version brings another 5-10 % faster performance! 🏎️
Improvements 🔧
- Remove PHP version constraint from the
#[\Override]attribute rules (#4436), thanks @johnbillion! - OverridingPropertyRule - take
checkMissingOverrideMethodAttributeas default only on PHP 8.5+ (phpstan/phpstan-src@64e9776) - Support StaticMethodParameterClosureTypeExtension for New_ expressions (#4819), thanks @ruudk!
- Improve inference on FuncCall === FuncCall (#4513), #13749, thanks @staabm!
- Don't lose known offset-types in
array_merge()(#4554), thanks @staabm!
Bugfixes 🐛
- Fixed escaped hash in regex extended mode (#4814), thanks @dg!
- Fix closure type inference bug related to FNSR (phpstan/phpstan-src@66f2738), #13993
Performance 🏎️
- Rework phpDoc inheritance to resolve through reflection instead of re-walking the hierarchy (#4829), #10771
- TemplateTypeHelper: prevent unnecessary work (#4818), thanks @staabm!
- ConstantArrayType: prevent unnecessary work (#4811), thanks @staabm!
- ImpossibleCheckTypeHelper: Remove unnecessary late-resolving (#4816), thanks @staabm!
- Prevent duplicate logic execution for
createMethodwithincludingAnnotations: trueif@methoddoes not exist (phpstan/phpstan-src@d5da11e) - Find all constant/method types per class at once (#4737), thanks @staabm!
- Speed up CombinationHelper (#4825), thanks @kaja47!
- MutatingScope: Faster createConditionalExpressions (#4831), thanks @staabm!
- Re-use ExpressionTypeHolder (#4832), thanks @staabm!
- IntersectionType cannot be void (#4835), thanks @staabm!
- Cache IntersectionType results (#4836) (#4836), thanks @staabm!
- Prevent unnecessary work in MutatingScope->mergeVariableHolders() (#4837), thanks @staabm!
- Simplify lowercase-string handling (#4838) (#4838), thanks @staabm!
Function signature fixes 🤖
Internals 🔍
- Clarify
new PhpPropertyReflectioncall with named arguments (phpstan/phpstan-src@0f6f059) - Narrow type of reflection
get*Type()after callinghas*Type()(#4806), thanks @paulbalandan! - Add regression test (#4824), #11598, thanks @takaram!
- No need to have generics in class constant-related messages (#4829), #10771
2.1.37
Improvements 🔧
- Show LoC/s performance metric with
-vvv --debug(phpstan/phpstan-src@47936f2) - Configurable memory cache thresholds for eviction (phpstan/phpstan-src@d9a1233)
Bugfixes 🐛
- Fix closure type inference (phpstan/phpstan-src@bcdbfd8), #13993, #10612
- infinite loop in never returning function is allowed (#4516), #6458, #12813, thanks @canvural!
- fix: nested trait
@use, use original class file name to get trait data (#4813), thanks @calebdw!
Performance 🏎️
- Do
gc_disable()inbin/phpstanfor speedup (phpstan/phpstan-src@8acd93b) - Prevent repetitive calls to getArgs() (#4799), thanks @staabm!
- ExpressionTypeHolder: Prevent unnecessary work (#4800), thanks @staabm!
- ExpressionTypeHolder: re-use objects more often (#4801), thanks @staabm!
- PhpDocBlock - only ask immediate interfaces for PHPDocs to inherit (phpstan/phpstan-src@1104170)
- PhpDocBlock - only ask immediate traits (phpstan/phpstan-src@4d9f2b1)
- PhpDocBlock - skip abstract trait methods without PHPDoc (phpstan/phpstan-src@47aa39d)
- NodeDependencies: prevent unnecessary FileHelper::normalizePath() calls (#4809), thanks @staabm!
- FileCacheStorage: Don't use sprintf() on maybe huge strings (#4808), thanks @staabm!
- ConstantStringType: prevent unnecessary work (#4810), thanks @staabm!
- CallPrivateMethodThroughStaticRule: cheap checks first (#4812), thanks @staabm!
Internals 🔍
2.1.36
Bugfixes 🐛
- Fix FNSR false positive about "expr.resultUnused" (phpstan/phpstan-src@ca7ab77)
- Fix named argument parameter matching in getFunctionCallStackWithParameters (#4791), thanks @janedbal!
- Do not deep-clone nodes (phpstan/phpstan-src@9a31328), #13992
- Add getScopeType and getScopeNativeType again (phpstan/phpstan-src@02869f6), #13983
- See discussion #13983 (comment)
- Skip polyfills in
vendorwhen on a higher PHP version (phpstan/phpstan-src@f06c4a2)
Function signature fixes 🤖
Internals 🔍
- Test that expr inside
isset()can be changed with fixable rule (phpstan/phpstan-src@53a03d5), #13983 - Added regression test (#4796), #13694, thanks @staabm!
2.1.35
Bugfixes 🐛
- Fix ArrayCountValuesDynamicReturnTypeExtension (#4618), thanks @VincentLanglet!
- Make processStmtNodesInternal synchronous despite Fibers & Deep-clone synthetic nodes before processing (#4793), #13980, #13983, #13987, #13982, #13978, #13989
Internals 🔍
- RuleTestCase - sort actual and expected errors before comparing (#4790)
- Revert "Keep errors ordering even when nodeCallback executed out of order" (#4790)
- narrowMethodScopeFromConstructor parameter no longer needed because RuleTestCase sorts the errors (#4790)
- Prevent unnecessary work around parametersAcceptor->getParameters() call-sites (#4792), thanks @staabm!
2.1.34
Major new features 🚀
- Optimized performance 🏎️
- Caching of reflection objects and resolved PHPDocs
- Many raw performance optimization tweaks in analyser code (thanks @staabm!)
- Projects typically see 25 % to 40 % faster analysis times. Please test this release and report back, we're looking forward to your numbers as well!
- Utilization of Fibers for more precise analysis (PHP 8.1+)
- Code like
doFoo($a = 1, $a)will see better type inference for 2nd call argument. - When a rule hooked onto MethodCall AST node asks for
$scope->getType($node->args[1]), without Fibers it getsmixed, because$scopesees the state before the method call. - Fibers allow PHPStan to "pause" the execution of the rule until the precise type of
$node->args[1]is available in the analyser. - When the 2nd argument is processed, the execution of the rule is resumed and
$scope->getType($node->args[1])sees1as the type, notmixed. - Solves 10 reported issues: #12234, #11982, #11386, #11079, #10612, #9652, #8936, #12663, #12735, #13353
- Code like
Improvements 🔧
- Add ArrayCountValuesDynamicReturnTypeExtension (#4615), #13816, thanks @mad-briller!
Bugfixes 🐛
- Fix
UnionType::getObjectClassReflections(#4541), #13777, thanks @VincentLanglet! count(non-empty-array, COUNT_RECURSIVE)isint<1, max>(#4515), thanks @staabm!- Fix bitwise operators on mixed (#4423), #8094, thanks @VincentLanglet!
- Immediate unwrap AlwaysRememberedExpr after used on NodeScopeResolver (#4651), thanks @samsonasik!
- Improve return type of
range()function to always yield anon-empty-list(#4688), thanks @FeBe95! - Fix ArgumentsNormalizer - do not overwrite already passed args (phpstan/phpstan-src@7bdd172)
- Prevent crash when analysing curl_setopt (#4722), thanks @schlndh!
- Fix the handling of sealed concrete classes (#4567), #13734, thanks @stof!
- Improve and sync Accessory types
accepts()methods (#4766), #13964, thanks @staabm!
Performance 🏎️
- Prevent unnecessary scope merging (#4640), thanks @staabm!
- Prevent reading & json-decoding composer.json multiple times (#4645), thanks @staabm!
- Cache neon file reads (#4646), thanks @staabm!
- Optimize keepVoidType (phpstan/phpstan-src@ff39220)
- TypeCombinator - assume that inner types in UnionType are already normalized (phpstan/phpstan-src@e8f9992)
- Remember resolved types after pushInFunctionCall (#4648), thanks @staabm!
- Remember function return type extensions (#4644) (#4644), thanks @staabm!
- Use sha256 which is cpu optimized in PHP 8.4+ (#4656), thanks @staabm!
- Cache ast-parsing in RegexGroupParser (#4655), thanks @staabm!
- Microoptimize TypeCombinator (#4657), thanks @staabm!
- TypeCombinator: Remove unnecessary md5 encoding (#4658), thanks @staabm!
- Prevent duplicate super-global-variable detection (#4662) (#4662), thanks @staabm!
- Prevent Scalar expressions to be specified (#4663), thanks @staabm!
- Print more precise elapsed time (#4664), thanks @staabm!
- TypeCombinator: remove unnecessary loop (#4665), thanks @staabm!
- TypeCombinator: Reduce number of intersect() calls (#4668), thanks @staabm!
- TypeCombinator: Simplify ConstantStringType handling (#4666) (#4666), thanks @staabm!
- TypeCombinator: Prevent unnecessary work (#4667) (#4667), thanks @staabm!
- Prevent unnecessary work when resolving Expr\BinaryOp\Coalesce (#4661), thanks @staabm!
- VerbosityLevel: early return type traversal (#4670) (#4670), thanks @staabm!
- ParametersAcceptorSelector: early return type traversal (#4669) (#4669), thanks @staabm!
- UnresolvableTypeHelper: early return type traversal (#4671), thanks @staabm!
- LazyInternalScopeFactory: Prevent expensive repeated getService() calls (#4672), thanks @staabm!
- Use more efficient spl_object_id() over spl_object_hash() (#4674), thanks @staabm!
- Remove
TypeCombinator::union()calls that are not necessary (phpstan/phpstan-src@12f2b23) - Remove
TypeCombinator::intersect()calls that are not necessary (phpstan/phpstan-src@f1f97c3) - Prevent repetative method calls on ParametersAcceptor (#4686), thanks @staabm!
- Prevent unnecessary node-key calculation (#4691), thanks @staabm!
- Prevent maybe unnecessary work in MutatingScope::filterBySpecifiedTypes() (#4690), thanks @staabm!
- Prevent unnecessary work in BetterReflectionProvider (#4687), thanks @staabm!
- Simplify MutatingScope->invalidateMethodsOnExpression() (#4692), thanks @staabm!
- Speedup analysis of arrays containing closures (#4684), thanks @staabm!
- TypeNodeResolver: Reduce number of intersect() calls (#4694), thanks @staabm!
- TypeCombinator: prevent unnecessary work (#4695), thanks @staabm!
- ConstantStringType: Prevent creation of unnecessary constant-object types (#4696), thanks @staabm!
- Remove NodeFinder from MutatingScope->restoreThis() (#4697), thanks @staabm!
- MemoizingContainer - memoize getService (phpstan/phpstan-src@68815ac)
- Use static callback for TypeTraverser::map() (#4701), thanks @staabm!
- Prevent unnecessary work while Ternary analysis (#4704), thanks @staabm!
- Prevent unnecessary work in NodeScopeResolver->processAssignVar() (#4705), thanks @staabm!
- Prevent unnecessary work in While/Do analysis (#4706), thanks @staabm!
- Prevent unnecessary work in TypeSpecifier->createForExpr() (#4707), thanks @staabm!
- NodeScopeResolver: Move condition out of loop (#4708), thanks @staabm!
- NodeScopeResolver: determine callCallbackImmediately only for callables (#4709) (#4709), thanks @staabm!
- NodeScopeResolver: cheap checks first (#4710) (#4710), thanks @staabm!
- NodeScopeResolver: Move assignByReference logic out of generic path (#4711), thanks @staabm!
- Process called methods looking for initialized properties only when called from constructor (phpstan/phpstan-src@c993754)
- Cheap checks first (#4715), thanks @staabm!
- Store only variables as expression types with maybe certainty (#4719)
- Prevent unnecessary work in MutatingScope->mergeVariableHolders() (#4720), thanks @staabm!
- Prevent unnecessary work in
NodeScopeResolver::processAssignVar()(#4716), thanks @staabm! - Minor optimization (phpstan/phpstan-src@21d86f0...
2.1.33
Improvements 🔧
- Cache files in OptimizedDirectorySourceLocatorFactory (#4577), #13852, thanks @staabm!
- Add more numeric-string inferences after string concat (#4447), thanks @VincentLanglet!
- Improve EnumSanityRule (#4543), #13768, thanks @VincentLanglet!
- Too wide bool return type is not reported in trivial methods (#4444), #13482, thanks @staabm!
Bugfixes 🐛
- De-duplicate phpstan.php errors (#4560) (#4560), #13813, thanks @staabm!
- Fix default level message (phpstan/phpstan-src@9ab9647)
- [PHP 8.5]
ini_get("max_memory_limit")is a string (#4574), thanks @staabm! - Revert changes to ArrayMapArgVisitor which switch the order of named arguments (phpstan/phpstan-src@f562834)
- Fix "Array does not have offset" in
curl_setopt_array()(#4590), #13862, thanks @staabm! - OversizedArray is not truthy (#4556), #13797, thanks @VincentLanglet!
- Do not instantiate Accessory without string type (#4550), #13784, thanks @VincentLanglet!
- Narrow CURLOPT_SHARE accepting type (#4611), thanks @staabm!
Function signature fixes 🤖
- Fix return-type for DOMNode::C14N (#4608), thanks @tvdijen!
- Fix DOMNode::C14N bad definition (#4361), #8096, thanks @VincentLanglet!
- Fix time not being considered an impure function. (#4609), #13874, thanks @mad-briller!
Internals 🔍
- Simplify ClassReflection constructor (phpstan/phpstan-src@821ff76)
- Introduce ClassReflectionFactory (phpstan/phpstan-src@35470a0)
- Prevent global side-effect in Bug13813IntegrationTest (#4566), thanks @staabm!
- Parameter narrowMethodScopeFromConstructor in DI (phpstan/phpstan-src@05b80ef)
- Reduce ContainerFactory::postInitializeContainer() calls (#4572), thanks @staabm!
- TypeSpecifier as an interface (phpstan/phpstan-src@fc6a2b1)
- Change where TypeSpecifier is set into TypeSpecifierAwareExtension (phpstan/phpstan-src@36cf9a1)
- Enable FileCacheStorage for OptimizedDirectorySourceLocatorFactory in tests (#4576), thanks @staabm!
- Upload baseline on downgraded code (phpstan/phpstan-src@057c79f)
- More precise return type for gatherAssertTypes (#4614), thanks @staabm!
- AnalyserIntegrationTest uses
narrowMethodScopeFromConstructor: true(phpstan/phpstan-src@dc9bf7f)
2.1.32
Improvements 🔧
- [PHP 8.5] Pipe operator support (phpstan/phpstan-src@e9df52e)
- [PHP 8.5] Report deprecated casts (phpstan/phpstan-src@d0a77d1)
- [PHP 8.5] Report deprecated backtick operator (phpstan/phpstan-src@9405233)
- [PHP 8.5] Added PHP_BUILD_DATE type (#4468), thanks @staabm!
- [PHP 8.5] Global constants support attributes (phpstan/phpstan-src@6958f86)
- [PHP 8.5] Add support for FILTER_THROW_ON_FAILURE for filter_var (#4495), thanks @canvural!
- [PHP 8.5] Add
array_firstandarray_lastreturn type extensions (#4499) (#4499), thanks @canvural! - [PHP 8.5] Support for deprecated traits (phpstan/phpstan-src@f0675a7)
- [PHP 8.5] Support for
#[Override]on properties (phpstan/phpstan-src@8b85e62) - [PHP 8.5] clone with support (phpstan/phpstan-src@5a9471a)
- [PHP 8.5] Support for
Closure::getCurrent()(phpstan/phpstan-src@e3ac5ee) - [PHP 8.5] Support for casts in constant (initializer) expressions (phpstan/phpstan-src@df5ede5)
- [PHP 8.5] Support for first class callables in constant expressions (initializers) (phpstan/phpstan-src@f436abf)
- [PHP 8.5] Support for static Closures in constant expressions (initializers) (phpstan/phpstan-src@ab704f4)
- [PHP 8.5] Support for asymmetric visibility in static properties (phpstan/phpstan-src@8b2b97f)
- NodeCallbackInvoker interface to invoke all PHPStan rules on a synthetic AST node (#4429)
- The interface NodeCallbackInvoker can be typehinted in 2nd parameter of
Rule::processNode() - See full explanation
- CompositeRule can be used to test rules using NodeCallbackInvoker (#4438), thanks @staabm!
- The interface NodeCallbackInvoker can be typehinted in 2nd parameter of
- InvalidIncDecOperationRule - make aware of deprecation of
--(PHP 8.3) and++(PHP 8.5) on non-numeric strings (phpstan/phpstan-src@0ff7e44) - InvalidIncDecOperationRule - make aware of more deprecations (phpstan/phpstan-src@3d6bbe4)
- InvalidPromotedPropertiesRule - report
finalin promoted property on PHP < 8.5 (phpstan/phpstan-src@e5de6b8) - The
(void)cast is supported only on PHP 8.5 and later. (phpstan/phpstan-src@53b87e0) - Rules about
#[NoDiscard]report errors only on PHP 8.5+, errors are non-ignorable (phpstan/phpstan-src@d00b769) - Rules about
#[NoDiscard]report when call is in(void)cast but should not (phpstan/phpstan-src@099b87a) - Understand always-overwritten arrays in foreach (#4534), #2273, #13730
- Support writing to array in foreach with value-by-ref (#4537)
- Report unknown parameter for implicit variadic methods (#4481) (#4481), #13719, thanks @VincentLanglet!
- IgnoreErrorExtension is a valid conditional tag (#4488), thanks @staabm!
- Reduce file-parsing in ResultCacheManager (#4491), thanks @staabm!
- Faster AutowiredAttributeServicesExtension->processParameters() (#4489) (#4489), thanks @staabm!
- Detect duplicated args passed to a variadic parameter (#4498), #13710, thanks @takaram!
- Add support for statement in conditional tags (#4512), thanks @VincentLanglet!
- Include identifier in
gitlaberror format (#4421), thanks @spawnia! - PropertyInClassRule - move supportsPropertyHooks check to bottom to have more errors reported (phpstan/phpstan-src@6ccdba2)
- TooWideMethodThrowTypeRule - new opt-in option for reporting too-wide implicit (inherited)
@throws(phpstan/phpstan-src@b6a2e0f), #13696, #13671
Bugfixes 🐛
- Fixed infinite recursion with late-resolvable types (phpstan/phpstan-src@7f3ad70), #13685
- Infer
non-empty-list/arrayafterarray_key_exists($i, $arr)(#4440) (#4440), thanks @staabm! !array_key_exists()should implyarrayfor PHP8+ (#4417), #6209, #13301, thanks @staabm!- Invalidate native expression types after clearstatcache call (#4448) (#4448), #11484, thanks @VincentLanglet!
- Use the same scalar limit for sprintf and concat (#4454), #13378, thanks @VincentLanglet!
- Handle impure/throw point of inherited constructors of anonymous classes (#4455), #13698, thanks @takaram!
- Adjust a bunch of places for first-class callables and nullsafe operators (phpstan/phpstan-src@e437c5a)
- Fix sprintf() types and placeholders (#4463), thanks @staabm!
- Fix return type inference from immediately invoked closure (phpstan/phpstan-src@3702305)
- Fix crashes in ParametersAcceptorSelector (#4467), #13714, thanks @staabm!
- Fix null coalesce false positive for multi-dimensional array in loop (#4475), thanks @schlndh!
- Fix type of clone expression (phpstan/phpstan-src@020adb5)
- Ensure that JetBrains terminal sees correct relative path (#4479), #13697, thanks @caufang!
- Fix for losing
array_key_existsinference when adding a false condition (#4473) (#4473), #11276, thanks @staabm! - Fix filter var on uncertainty flags (#4418), #11485, thanks @VincentLanglet!
- TestCaseSourceLocatorFactory - skip polyfills based on PHP version (phpstan/phpstan-src@f63b423)
- Fix
composerAutoloaderProjectPathsarray so that the items always refer to dir with composer.json in it (#4522), phpstan/phpstan-doctrine#646 - Add support for union of constant integer for filter_var (#4519), thanks @VincentLanglet!
- Child class of parent class that uses a trait with a constant can redeclare the constant with a different value (phpstan/phpstan-src@9f415ae), #13119
Function signature fixes 🤖
Internals 🔍
- SimultaneousTypeTraverserTest for improved UnionType implementation (phpstan/phpstan-src@0bddac1)
- Fix
BenevolentUnionType::traverseSimultaneously()(phpstan/phpstan-src@856a9f1) - Improve
IntersectionType::traverseSimultaneously()for arrays (phpstan/phpstan-src@0693e5a) - Changelog generator: Use better API to associate commit with a merged PR (phpstan/phpstan-src@e153fa4)
- Use GraphQL to find autoclosed issues when a PR is merged (phpstan/phpstan-src@2f69398)
- GenerateFactory - allow setting the result type in attribute, override create method return type (#4429)
- Narrow errors array type to list (#4445), thanks @staabm!
- No memory_limit for tests as PHPUnit recommends (#4449)
- Compute allowedArrayType only once (#4453), thanks @VincentLanglet!
- Narrow types (#4465), thanks @staabm!
- Revert "MemoryCacheStorage - var_export the data to reproduce certain issues" (ht...
2.1.31
Bleeding edge 🔪
- AssignToByRefExprFromForeachRule (level 1) (phpstan/phpstan-src@0624342), #13625, #11120
- Validate curl_setopt_array parameter array (#4395), #13615, thanks @staabm!
- Restrict accepted args of
php_uname()(#4359), thanks @dktapps! array_rand()requires anon-empty-arrayas of PHP 8 (#4397), thanks @staabm!- Report implicit (inherited) too-wide
@throwstype (phpstan/phpstan-src@3eaad7f)
If you want to see the shape of things to come and adopt bleeding edge features early, you can include this config file in your project's phpstan.neon:
includes:
- vendor/phpstan/phpstan/conf/bleedingEdge.neon
Of course, there are no backwards compatibility guarantees when you include this file. The behaviour and reported errors can change in minor versions with this file included. Learn more
Improvements 🔧
- New config parameter
exceptions.check.throwTypeCovariance(phpstan/phpstan-src@3f7e878), #13649 - New config parameter
checkTooWideThrowTypesInProtectedAndPublicMethods(phpstan/phpstan-src@9fc483d), #13258-
- made TooWideMethodThrowTypeRule behaviour similar to TooWideMethodReturnTypehintRule
-
- made TooWidePropertyHookThrowTypeRule to be similar to TooWideMethodReturnTypehintRule (phpstan/phpstan-src@67ef20b)
-
- Useful tip about what
@throwsshould be added when the implicit one is too wide (phpstan/phpstan-src@8031040) - Relax strict printf parameter check (#4400), thanks @schlndh!
- Support union types in curl_setopt validation (#4396), thanks @staabm!
- Do not report non existent offset for invalid ones (#4398), thanks @VincentLanglet!
- Report float and null offset based on PHP version (#4406), #13592, thanks @VincentLanglet!
Bugfixes 🐛
- Fix list type lost in for loop (#4403), #12807, thanks @staabm!
- Improve support of FILTER_REQUIRE_ARRAY (#4410), #11863, thanks @VincentLanglet!
- Add VersionCompareFunctionDynamicThrowTypeExtension (#4408), #13515, thanks @VincentLanglet!
- Fix
OversizedArrayType::isSubTypeOf()(#4407), #13509, thanks @VincentLanglet! - Fix "array_rand() - offset might not exists" (#4383), #12981, thanks @staabm!
- Avoid crashing on enum without value (#4336) (#4336), #7927, thanks @VincentLanglet!
- Special-case LateResolvableType in
UnionType::isSuperTypeOf()(phpstan/phpstan-src@47a820b), #13652, #11033 - Object with dynamic property assignments cannot report too-wide types on properties (phpstan/phpstan-src@851ab2c), #13624
- Setting array offset on a property should pick types from original UnionType still present in the current property type (phpstan/phpstan-src@a8cae55), #13654, #7880
- Do not compile special DI container for workers (phpstan/phpstan-src@8fd0fda)
- This should solve occasional errors like:
Warning: rename(phpstan/cache/nette.configurator/Container_be4038c220.php.tmp,phpstan/cache/nette.configurator/Container_be4038c220.php): No such file or directory in phar:///vendor/phpstan/phpstan/phpstan.phar/vendor/nette/di/src/DI/ContainerLoader.php on line 68Unable to create file 'phpstan/cache/nette.configurator/Container_be4038c220.php'.
- Result cache - fix restoring errors from stub files (#4424), #12826
- DefaultStubFilesProvider - normalize stub file paths (phpstan/phpstan-src@d78a5d8, phpstan/phpstan-src@e4e4eaa)
- Exclude first-party stubs from validation (#4190), thanks @blyxxyz!
- Overriding
@propertytags - take native type into account if the scope can read the native property (phpstan/phpstan-src@bc20ce4), #13537 - Infer
mixed~array<mixed> | array<string>(#4425) (#4425), #13628, #12930, thanks @VincentLanglet! - Fix reportNestedTooWideType (improve
UnionType::traverseSimultaneously()) (phpstan/phpstan-src@6597ef6)
Function signature fixes 🤖
- Fix extract signature (#4402), #13434, thanks @VincentLanglet!
- Improve is_resource inference (#4411), #10394, thanks @VincentLanglet!
- Mark redis method as impure (#4409), #10215, thanks @VincentLanglet!
- Dynamic DOM return type (#4354), #9200, thanks @VincentLanglet!
- Fix XDOMPath::query() return type (#4373), #13595, thanks @stefanfisk!
Internals 🔍
- MutatingScope::unsetExpression can be private (phpstan/phpstan-src@a2ebe49)
- Reduce visibility of some methods to private (#4404), thanks @staabm!
- Get rid of
instanceof *Typechecks (#4405), thanks @staabm! - Fix PHP version and grammar in README.md (#4420), thanks @spawnia!
- Use
UnionType::filterTypes()in one more place (phpstan/phpstan-src@3e78ccf) - Revert "Narrow type on setting offsets of properties" (phpstan/phpstan-src@4c36e11)
- No longer needed after phpstan/phpstan-src@a8cae55
- Extract ParentMethodHelper (phpstan/phpstan-src@d072ced)
2.1.30
Improvements 🔧
- Alternative solution to disable cloning with
--prefer-sourcethat does not need another repository (0eb327e) - TableErrorFormatter: Link path in JetBrain IDEs (#4369), thanks @vrana!
- Improve ConstantArrayType inference (#4376), thanks @staabm!
- use string instead of
__stringandstringablein printf parameter error message (#4377), thanks @schlndh! - Inherit PHPDoc return type in child method with narrower native return type (#4384), #12481, #11364, #10600, #13588
- Rely on RuleLevelHelper in InvalidKeyInArrayItemRule (#4379), thanks @VincentLanglet!
Bugfixes 🐛
- False positive "
non-empty-array<int, int>might not be a list" when change existing list key (#4351), #13035, thanks @staabm! - Remove duplicate method in error message (#4371), #12557, thanks @VincentLanglet!
- Fix "Offset (int|string) might not exist on array" after
array_keys($arr)(#4381), #12926, thanks @staabm! - Fix "offset might not exist" false-positives when offset is a expression (#4372), #9494, #12115, #12805, #12931, #13214, #13039, #13538, thanks @staabm!
- Skip deep expression when root expression changes while scope generalization (#4390), thanks @staabm!
- When assigning nested array offset, union the value with empty array if the offset might be nonexistent (phpstan/phpstan-src@23dc4e7), #12078, #10640, #10025, #6173
- Fix
ArrayType::hasOffsetValueType(#4387), thanks @VincentLanglet! - Fix regression about appending
[]to existing offsets (phpstan/phpstan-src@f880231), #10438
Function signature fixes 🤖
- add bcround function signature for PHP 8.4 (#4367), #13364, thanks @themasch!
- Remove stream_get_meta_data from delta file (#4360), thanks @miken32!
- Add
stream_socket_{client,server}stubs for@param-out(#4391), #12622, #13605, thanks @msbit!
Internals 🔍
- Simplify ClassReflectionExtensions (#4374), thanks @staabm!
- Simplify *StatementWithoutImpurePointsRule (#4375), thanks @staabm!
- Cleanup
instanceof Typechecks (#4380), thanks @staabm! - Replace instanceof checks in JsonThrowOnErrorDynamicReturnTypeExtension (#4155), thanks @Khartir!
- Added regression test (#4382), #12115, thanks @staabm!
- Get rid of
instanceof ErrorType(phpstan/phpstan-src@3adc625) - Improve CombinationHelper PHPDoc (#4386), thanks @VincentLanglet!
1.12.32
Alternative solution to disable cloning with --prefer-source that does not need another repository