Skip to content

Commit 846d7bd

Browse files
Introduce all-methods-are-(im)pure
1 parent 71f7b78 commit 846d7bd

File tree

11 files changed

+101
-324
lines changed

11 files changed

+101
-324
lines changed

bin/functionMetadata_original.php

Lines changed: 0 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -170,168 +170,6 @@
170170
'DateTimeImmutable::getTimestamp' => ['hasSideEffects' => false],
171171
'DateTimeImmutable::getTimezone' => ['hasSideEffects' => false],
172172

173-
'Redis::append' => ['hasSideEffects' => true],
174-
'Redis::bitcount' => ['hasSideEffects' => true],
175-
'Redis::bitop' => ['hasSideEffects' => true],
176-
'Redis::bitpos' => ['hasSideEffects' => true],
177-
'Redis::blPop' => ['hasSideEffects' => true],
178-
'Redis::blmove' => ['hasSideEffects' => true],
179-
'Redis::blmpop' => ['hasSideEffects' => true],
180-
'Redis::brPop' => ['hasSideEffects' => true],
181-
'Redis::brpoplpush' => ['hasSideEffects' => true],
182-
'Redis::bzmpop' => ['hasSideEffects' => true],
183-
'Redis::bzPopMax' => ['hasSideEffects' => true],
184-
'Redis::bzPopMin' => ['hasSideEffects' => true],
185-
'Redis::connect' => ['hasSideEffects' => true],
186-
'Redis::dbSize' => ['hasSideEffects' => true],
187-
'Redis::decr' => ['hasSideEffects' => true],
188-
'Redis::decrBy' => ['hasSideEffects' => true],
189-
'Redis::del' => ['hasSideEffects' => true],
190-
'Redis::delete' => ['hasSideEffects' => true],
191-
'Redis::exists' => ['hasSideEffects' => true],
192-
'Redis::expire' => ['hasSideEffects' => true],
193-
'Redis::expireAt' => ['hasSideEffects' => true],
194-
'Redis::expiretime' => ['hasSideEffects' => true],
195-
'Redis::flushAll' => ['hasSideEffects' => true],
196-
'Redis::flushDB' => ['hasSideEffects' => true],
197-
'Redis::function' => ['hasSideEffects' => true],
198-
'Redis::geoadd' => ['hasSideEffects' => true],
199-
'Redis::geodist' => ['hasSideEffects' => true],
200-
'Redis::geohash' => ['hasSideEffects' => true],
201-
'Redis::geopos' => ['hasSideEffects' => true],
202-
'Redis::georadius' => ['hasSideEffects' => true],
203-
'Redis::georadiusbymember' => ['hasSideEffects' => true],
204-
'Redis::georadiusbymember_ro' => ['hasSideEffects' => true],
205-
'Redis::geosearch' => ['hasSideEffects' => true],
206-
'Redis::geosearchstore' => ['hasSideEffects' => true],
207-
'Redis::get' => ['hasSideEffects' => true],
208-
'Redis::getBit' => ['hasSideEffects' => true],
209-
'Redis::getEx' => ['hasSideEffects' => true],
210-
'Redis::getDBNum' => ['hasSideEffects' => true],
211-
'Redis::getDel' => ['hasSideEffects' => true],
212-
'Redis::getLastError' => ['hasSideEffects' => true],
213-
'Redis::getMode' => ['hasSideEffects' => true],
214-
'Redis::getOption' => ['hasSideEffects' => true],
215-
'Redis::getPersistentID' => ['hasSideEffects' => true],
216-
'Redis::getRange' => ['hasSideEffects' => true],
217-
'Redis::lcs' => ['hasSideEffects' => true],
218-
'Redis::lmpop' => ['hasSideEffects' => true],
219-
'Redis::getReadTimeout' => ['hasSideEffects' => true],
220-
'Redis::getset' => ['hasSideEffects' => true],
221-
'Redis::getTimeout' => ['hasSideEffects' => true],
222-
'Redis::getTransferredBytes' => ['hasSideEffects' => true],
223-
'Redis::hDel' => ['hasSideEffects' => true],
224-
'Redis::hExists' => ['hasSideEffects' => true],
225-
'Redis::hGet' => ['hasSideEffects' => true],
226-
'Redis::hGetAll' => ['hasSideEffects' => true],
227-
'Redis::hIncrBy' => ['hasSideEffects' => true],
228-
'Redis::hIncrByFloat' => ['hasSideEffects' => true],
229-
'Redis::hKeys' => ['hasSideEffects' => true],
230-
'Redis::hLen' => ['hasSideEffects' => true],
231-
'Redis::hMget' => ['hasSideEffects' => true],
232-
'Redis::hMset' => ['hasSideEffects' => true],
233-
'Redis::hRandField' => ['hasSideEffects' => true],
234-
'Redis::hscan' => ['hasSideEffects' => true],
235-
'Redis::hSet' => ['hasSideEffects' => true],
236-
'Redis::hSetNx' => ['hasSideEffects' => true],
237-
'Redis::hStrLen' => ['hasSideEffects' => true],
238-
'Redis::hVals' => ['hasSideEffects' => true],
239-
'Redis::incr' => ['hasSideEffects' => true],
240-
'Redis::incrBy' => ['hasSideEffects' => true],
241-
'Redis::incrByFloat' => ['hasSideEffects' => true],
242-
'Redis::isConnected' => ['hasSideEffects' => true],
243-
'Redis::keys' => ['hasSideEffects' => true],
244-
'Redis::lastSave' => ['hasSideEffects' => true],
245-
'Redis::lInsert' => ['hasSideEffects' => true],
246-
'Redis::lLen' => ['hasSideEffects' => true],
247-
'Redis::lMove' => ['hasSideEffects' => true],
248-
'Redis::lPop' => ['hasSideEffects' => true],
249-
'Redis::lPos' => ['hasSideEffects' => true],
250-
'Redis::lPush' => ['hasSideEffects' => true],
251-
'Redis::lPushx' => ['hasSideEffects' => true],
252-
'Redis::lSet' => ['hasSideEffects' => true],
253-
'Redis::lindex' => ['hasSideEffects' => true],
254-
'Redis::lrange' => ['hasSideEffects' => true],
255-
'Redis::lrem' => ['hasSideEffects' => true],
256-
'Redis::ltrim' => ['hasSideEffects' => true],
257-
'Redis::mget' => ['hasSideEffects' => true],
258-
'Redis::move' => ['hasSideEffects' => true],
259-
'Redis::mset' => ['hasSideEffects' => true],
260-
'Redis::msetnx' => ['hasSideEffects' => true],
261-
'Redis::pconnect' => ['hasSideEffects' => true],
262-
'Redis::persist' => ['hasSideEffects' => true],
263-
'Redis::pexpire' => ['hasSideEffects' => true],
264-
'Redis::pexpireAt' => ['hasSideEffects' => true],
265-
'Redis::pexpiretime' => ['hasSideEffects' => true],
266-
'Redis::rpoplpush' => ['hasSideEffects' => true],
267-
'Redis::rPush' => ['hasSideEffects' => true],
268-
'Redis::rPushx' => ['hasSideEffects' => true],
269-
'Redis::sAdd' => ['hasSideEffects' => true],
270-
'Redis::sAddArray' => ['hasSideEffects' => true],
271-
'Redis::scan' => ['hasSideEffects' => true],
272-
'Redis::scard' => ['hasSideEffects' => true],
273-
'Redis::script' => ['hasSideEffects' => true],
274-
'Redis::sDiff' => ['hasSideEffects' => true],
275-
'Redis::sDiffStore' => ['hasSideEffects' => true],
276-
'Redis::set' => ['hasSideEffects' => true],
277-
'Redis::setBit' => ['hasSideEffects' => true],
278-
'Redis::setRange' => ['hasSideEffects' => true],
279-
'Redis::setOption' => ['hasSideEffects' => true],
280-
'Redis::setex' => ['hasSideEffects' => true],
281-
'Redis::setnx' => ['hasSideEffects' => true],
282-
'Redis::sInter' => ['hasSideEffects' => true],
283-
'Redis::sintercard' => ['hasSideEffects' => true],
284-
'Redis::sInterStore' => ['hasSideEffects' => true],
285-
'Redis::sismember' => ['hasSideEffects' => true],
286-
'Redis::sMembers' => ['hasSideEffects' => true],
287-
'Redis::sMisMember' => ['hasSideEffects' => true],
288-
'Redis::sMove' => ['hasSideEffects' => true],
289-
'Redis::sPop' => ['hasSideEffects' => true],
290-
'Redis::sort' => ['hasSideEffects' => true],
291-
'Redis::sort_ro' => ['hasSideEffects' => true],
292-
'Redis::sRandMember' => ['hasSideEffects' => true],
293-
'Redis::srem' => ['hasSideEffects' => true],
294-
'Redis::sscan' => ['hasSideEffects' => true],
295-
'Redis::sUnion' => ['hasSideEffects' => true],
296-
'Redis::sUnionStore' => ['hasSideEffects' => true],
297-
'Redis::time' => ['hasSideEffects' => true],
298-
'Redis::touch' => ['hasSideEffects' => true],
299-
'Redis::ttl' => ['hasSideEffects' => true],
300-
'Redis::type' => ['hasSideEffects' => true],
301-
'Redis::unlink' => ['hasSideEffects' => true],
302-
'Redis::zAdd' => ['hasSideEffects' => true],
303-
'Redis::zCard' => ['hasSideEffects' => true],
304-
'Redis::zCount' => ['hasSideEffects' => true],
305-
'Redis::zdiff' => ['hasSideEffects' => true],
306-
'Redis::zdiffstore' => ['hasSideEffects' => true],
307-
'Redis::zIncrBy' => ['hasSideEffects' => true],
308-
'Redis::zinter' => ['hasSideEffects' => true],
309-
'Redis::zintercard' => ['hasSideEffects' => true],
310-
'Redis::zinterstore' => ['hasSideEffects' => true],
311-
'Redis::zLexCount' => ['hasSideEffects' => true],
312-
'Redis::zmpop' => ['hasSideEffects' => true],
313-
'Redis::zMscore' => ['hasSideEffects' => true],
314-
'Redis::zPopMax' => ['hasSideEffects' => true],
315-
'Redis::zPopMin' => ['hasSideEffects' => true],
316-
'Redis::zRange' => ['hasSideEffects' => true],
317-
'Redis::zRangeByLex' => ['hasSideEffects' => true],
318-
'Redis::zRangeByScore' => ['hasSideEffects' => true],
319-
'Redis::zrangestore' => ['hasSideEffects' => true],
320-
'Redis::zRandMember' => ['hasSideEffects' => true],
321-
'Redis::zRank' => ['hasSideEffects' => true],
322-
'Redis::zRem' => ['hasSideEffects' => true],
323-
'Redis::zRemRangeByLex' => ['hasSideEffects' => true],
324-
'Redis::zRemRangeByRank' => ['hasSideEffects' => true],
325-
'Redis::zRemRangeByScore' => ['hasSideEffects' => true],
326-
'Redis::zRevRange' => ['hasSideEffects' => true],
327-
'Redis::zRevRangeByLex' => ['hasSideEffects' => true],
328-
'Redis::zRevRangeByScore' => ['hasSideEffects' => true],
329-
'Redis::zRevRank' => ['hasSideEffects' => true],
330-
'Redis::zscan' => ['hasSideEffects' => true],
331-
'Redis::zScore' => ['hasSideEffects' => true],
332-
'Redis::zunion' => ['hasSideEffects' => true],
333-
'Redis::zunionstore' => ['hasSideEffects' => true],
334-
335173
'SplDoublyLinkedList::pop' => ['hasSideEffects' => true],
336174
'SplDoublyLinkedList::shift' => ['hasSideEffects' => true],
337175

conf/config.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ parameters:
113113
universalObjectCratesClasses:
114114
- stdClass
115115
stubFiles:
116+
- ../stubs/Redis.stub
116117
- ../stubs/ReflectionAttribute.stub
117118
- ../stubs/ReflectionClassConstant.stub
118119
- ../stubs/ReflectionFunctionAbstract.stub

resources/functionMetadata.php

Lines changed: 0 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -452,167 +452,6 @@
452452
'NumberFormatter::getPattern' => ['hasSideEffects' => false],
453453
'NumberFormatter::getSymbol' => ['hasSideEffects' => false],
454454
'NumberFormatter::getTextAttribute' => ['hasSideEffects' => false],
455-
'Redis::append' => ['hasSideEffects' => true],
456-
'Redis::bitcount' => ['hasSideEffects' => true],
457-
'Redis::bitop' => ['hasSideEffects' => true],
458-
'Redis::bitpos' => ['hasSideEffects' => true],
459-
'Redis::blPop' => ['hasSideEffects' => true],
460-
'Redis::blmove' => ['hasSideEffects' => true],
461-
'Redis::blmpop' => ['hasSideEffects' => true],
462-
'Redis::brPop' => ['hasSideEffects' => true],
463-
'Redis::brpoplpush' => ['hasSideEffects' => true],
464-
'Redis::bzPopMax' => ['hasSideEffects' => true],
465-
'Redis::bzPopMin' => ['hasSideEffects' => true],
466-
'Redis::bzmpop' => ['hasSideEffects' => true],
467-
'Redis::connect' => ['hasSideEffects' => true],
468-
'Redis::dbSize' => ['hasSideEffects' => true],
469-
'Redis::decr' => ['hasSideEffects' => true],
470-
'Redis::decrBy' => ['hasSideEffects' => true],
471-
'Redis::del' => ['hasSideEffects' => true],
472-
'Redis::delete' => ['hasSideEffects' => true],
473-
'Redis::exists' => ['hasSideEffects' => true],
474-
'Redis::expire' => ['hasSideEffects' => true],
475-
'Redis::expireAt' => ['hasSideEffects' => true],
476-
'Redis::expiretime' => ['hasSideEffects' => true],
477-
'Redis::flushAll' => ['hasSideEffects' => true],
478-
'Redis::flushDB' => ['hasSideEffects' => true],
479-
'Redis::function' => ['hasSideEffects' => true],
480-
'Redis::geoadd' => ['hasSideEffects' => true],
481-
'Redis::geodist' => ['hasSideEffects' => true],
482-
'Redis::geohash' => ['hasSideEffects' => true],
483-
'Redis::geopos' => ['hasSideEffects' => true],
484-
'Redis::georadius' => ['hasSideEffects' => true],
485-
'Redis::georadiusbymember' => ['hasSideEffects' => true],
486-
'Redis::georadiusbymember_ro' => ['hasSideEffects' => true],
487-
'Redis::geosearch' => ['hasSideEffects' => true],
488-
'Redis::geosearchstore' => ['hasSideEffects' => true],
489-
'Redis::get' => ['hasSideEffects' => true],
490-
'Redis::getBit' => ['hasSideEffects' => true],
491-
'Redis::getDBNum' => ['hasSideEffects' => true],
492-
'Redis::getDel' => ['hasSideEffects' => true],
493-
'Redis::getEx' => ['hasSideEffects' => true],
494-
'Redis::getLastError' => ['hasSideEffects' => true],
495-
'Redis::getMode' => ['hasSideEffects' => true],
496-
'Redis::getOption' => ['hasSideEffects' => true],
497-
'Redis::getPersistentID' => ['hasSideEffects' => true],
498-
'Redis::getRange' => ['hasSideEffects' => true],
499-
'Redis::getReadTimeout' => ['hasSideEffects' => true],
500-
'Redis::getTimeout' => ['hasSideEffects' => true],
501-
'Redis::getTransferredBytes' => ['hasSideEffects' => true],
502-
'Redis::getset' => ['hasSideEffects' => true],
503-
'Redis::hDel' => ['hasSideEffects' => true],
504-
'Redis::hExists' => ['hasSideEffects' => true],
505-
'Redis::hGet' => ['hasSideEffects' => true],
506-
'Redis::hGetAll' => ['hasSideEffects' => true],
507-
'Redis::hIncrBy' => ['hasSideEffects' => true],
508-
'Redis::hIncrByFloat' => ['hasSideEffects' => true],
509-
'Redis::hKeys' => ['hasSideEffects' => true],
510-
'Redis::hLen' => ['hasSideEffects' => true],
511-
'Redis::hMget' => ['hasSideEffects' => true],
512-
'Redis::hMset' => ['hasSideEffects' => true],
513-
'Redis::hRandField' => ['hasSideEffects' => true],
514-
'Redis::hSet' => ['hasSideEffects' => true],
515-
'Redis::hSetNx' => ['hasSideEffects' => true],
516-
'Redis::hStrLen' => ['hasSideEffects' => true],
517-
'Redis::hVals' => ['hasSideEffects' => true],
518-
'Redis::hscan' => ['hasSideEffects' => true],
519-
'Redis::incr' => ['hasSideEffects' => true],
520-
'Redis::incrBy' => ['hasSideEffects' => true],
521-
'Redis::incrByFloat' => ['hasSideEffects' => true],
522-
'Redis::isConnected' => ['hasSideEffects' => true],
523-
'Redis::keys' => ['hasSideEffects' => true],
524-
'Redis::lInsert' => ['hasSideEffects' => true],
525-
'Redis::lLen' => ['hasSideEffects' => true],
526-
'Redis::lMove' => ['hasSideEffects' => true],
527-
'Redis::lPop' => ['hasSideEffects' => true],
528-
'Redis::lPos' => ['hasSideEffects' => true],
529-
'Redis::lPush' => ['hasSideEffects' => true],
530-
'Redis::lPushx' => ['hasSideEffects' => true],
531-
'Redis::lSet' => ['hasSideEffects' => true],
532-
'Redis::lastSave' => ['hasSideEffects' => true],
533-
'Redis::lcs' => ['hasSideEffects' => true],
534-
'Redis::lindex' => ['hasSideEffects' => true],
535-
'Redis::lmpop' => ['hasSideEffects' => true],
536-
'Redis::lrange' => ['hasSideEffects' => true],
537-
'Redis::lrem' => ['hasSideEffects' => true],
538-
'Redis::ltrim' => ['hasSideEffects' => true],
539-
'Redis::mget' => ['hasSideEffects' => true],
540-
'Redis::move' => ['hasSideEffects' => true],
541-
'Redis::mset' => ['hasSideEffects' => true],
542-
'Redis::msetnx' => ['hasSideEffects' => true],
543-
'Redis::pconnect' => ['hasSideEffects' => true],
544-
'Redis::persist' => ['hasSideEffects' => true],
545-
'Redis::pexpire' => ['hasSideEffects' => true],
546-
'Redis::pexpireAt' => ['hasSideEffects' => true],
547-
'Redis::pexpiretime' => ['hasSideEffects' => true],
548-
'Redis::rPush' => ['hasSideEffects' => true],
549-
'Redis::rPushx' => ['hasSideEffects' => true],
550-
'Redis::rpoplpush' => ['hasSideEffects' => true],
551-
'Redis::sAdd' => ['hasSideEffects' => true],
552-
'Redis::sAddArray' => ['hasSideEffects' => true],
553-
'Redis::sDiff' => ['hasSideEffects' => true],
554-
'Redis::sDiffStore' => ['hasSideEffects' => true],
555-
'Redis::sInter' => ['hasSideEffects' => true],
556-
'Redis::sInterStore' => ['hasSideEffects' => true],
557-
'Redis::sMembers' => ['hasSideEffects' => true],
558-
'Redis::sMisMember' => ['hasSideEffects' => true],
559-
'Redis::sMove' => ['hasSideEffects' => true],
560-
'Redis::sPop' => ['hasSideEffects' => true],
561-
'Redis::sRandMember' => ['hasSideEffects' => true],
562-
'Redis::sUnion' => ['hasSideEffects' => true],
563-
'Redis::sUnionStore' => ['hasSideEffects' => true],
564-
'Redis::scan' => ['hasSideEffects' => true],
565-
'Redis::scard' => ['hasSideEffects' => true],
566-
'Redis::script' => ['hasSideEffects' => true],
567-
'Redis::set' => ['hasSideEffects' => true],
568-
'Redis::setBit' => ['hasSideEffects' => true],
569-
'Redis::setOption' => ['hasSideEffects' => true],
570-
'Redis::setRange' => ['hasSideEffects' => true],
571-
'Redis::setex' => ['hasSideEffects' => true],
572-
'Redis::setnx' => ['hasSideEffects' => true],
573-
'Redis::sintercard' => ['hasSideEffects' => true],
574-
'Redis::sismember' => ['hasSideEffects' => true],
575-
'Redis::sort' => ['hasSideEffects' => true],
576-
'Redis::sort_ro' => ['hasSideEffects' => true],
577-
'Redis::srem' => ['hasSideEffects' => true],
578-
'Redis::sscan' => ['hasSideEffects' => true],
579-
'Redis::time' => ['hasSideEffects' => true],
580-
'Redis::touch' => ['hasSideEffects' => true],
581-
'Redis::ttl' => ['hasSideEffects' => true],
582-
'Redis::type' => ['hasSideEffects' => true],
583-
'Redis::unlink' => ['hasSideEffects' => true],
584-
'Redis::zAdd' => ['hasSideEffects' => true],
585-
'Redis::zCard' => ['hasSideEffects' => true],
586-
'Redis::zCount' => ['hasSideEffects' => true],
587-
'Redis::zIncrBy' => ['hasSideEffects' => true],
588-
'Redis::zLexCount' => ['hasSideEffects' => true],
589-
'Redis::zMscore' => ['hasSideEffects' => true],
590-
'Redis::zPopMax' => ['hasSideEffects' => true],
591-
'Redis::zPopMin' => ['hasSideEffects' => true],
592-
'Redis::zRandMember' => ['hasSideEffects' => true],
593-
'Redis::zRange' => ['hasSideEffects' => true],
594-
'Redis::zRangeByLex' => ['hasSideEffects' => true],
595-
'Redis::zRangeByScore' => ['hasSideEffects' => true],
596-
'Redis::zRank' => ['hasSideEffects' => true],
597-
'Redis::zRem' => ['hasSideEffects' => true],
598-
'Redis::zRemRangeByLex' => ['hasSideEffects' => true],
599-
'Redis::zRemRangeByRank' => ['hasSideEffects' => true],
600-
'Redis::zRemRangeByScore' => ['hasSideEffects' => true],
601-
'Redis::zRevRange' => ['hasSideEffects' => true],
602-
'Redis::zRevRangeByLex' => ['hasSideEffects' => true],
603-
'Redis::zRevRangeByScore' => ['hasSideEffects' => true],
604-
'Redis::zRevRank' => ['hasSideEffects' => true],
605-
'Redis::zScore' => ['hasSideEffects' => true],
606-
'Redis::zdiff' => ['hasSideEffects' => true],
607-
'Redis::zdiffstore' => ['hasSideEffects' => true],
608-
'Redis::zinter' => ['hasSideEffects' => true],
609-
'Redis::zintercard' => ['hasSideEffects' => true],
610-
'Redis::zinterstore' => ['hasSideEffects' => true],
611-
'Redis::zmpop' => ['hasSideEffects' => true],
612-
'Redis::zrangestore' => ['hasSideEffects' => true],
613-
'Redis::zscan' => ['hasSideEffects' => true],
614-
'Redis::zunion' => ['hasSideEffects' => true],
615-
'Redis::zunionstore' => ['hasSideEffects' => true],
616455
'ReflectionAttribute::getArguments' => ['hasSideEffects' => false],
617456
'ReflectionAttribute::getName' => ['hasSideEffects' => false],
618457
'ReflectionAttribute::getTarget' => ['hasSideEffects' => false],

src/PhpDoc/PhpDocNodeResolver.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,16 @@ public function resolveIsImpure(PhpDocNode $phpDocNode): bool
705705
return false;
706706
}
707707

708+
public function resolveAllMethodsArePure(PhpDocNode $phpDocNode): bool
709+
{
710+
return count($phpDocNode->getTagsByName('@phpstan-all-methods-pure')) > 0;
711+
}
712+
713+
public function resolveAllMethodsAreImpure(PhpDocNode $phpDocNode): bool
714+
{
715+
return count($phpDocNode->getTagsByName('@phpstan-all-methods-impure')) > 0;
716+
}
717+
708718
public function resolveIsReadOnly(PhpDocNode $phpDocNode): bool
709719
{
710720
foreach (['@readonly', '@phan-read-only', '@psalm-readonly', '@phpstan-readonly', '@phpstan-readonly-allow-private-mutation', '@psalm-readonly-allow-private-mutation'] as $tagName) {

0 commit comments

Comments
 (0)