• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

keradus / PHP-CS-Fixer / 17253322895

26 Aug 2025 11:52PM UTC coverage: 94.753% (+0.008%) from 94.745%
17253322895

push

github

keradus
add to git-blame-ignore-revs

28316 of 29884 relevant lines covered (94.75%)

45.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.55
/src/Tokenizer/Analyzer/ClassyAnalyzer.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of PHP CS Fixer.
7
 *
8
 * (c) Fabien Potencier <fabien@symfony.com>
9
 *     Dariusz RumiƄski <dariusz.ruminski@gmail.com>
10
 *
11
 * This source file is subject to the MIT license that is bundled
12
 * with this source code in the file LICENSE.
13
 */
14

15
namespace PhpCsFixer\Tokenizer\Analyzer;
16

17
use PhpCsFixer\Tokenizer\CT;
18
use PhpCsFixer\Tokenizer\Tokens;
19

20
/**
21
 * @internal
22
 *
23
 * @no-named-arguments Parameter names are not covered by the backward compatibility promise.
24
 */
25
final class ClassyAnalyzer
26
{
27
    public function isClassyInvocation(Tokens $tokens, int $index): bool
28
    {
29
        $token = $tokens[$index];
44✔
30

31
        if (!$token->isGivenKind(\T_STRING)) {
44✔
32
            throw new \LogicException(\sprintf('No T_STRING at given index %d, got "%s".', $index, $tokens[$index]->getName()));
×
33
        }
34

35
        if ((new Analysis\TypeAnalysis($token->getContent()))->isReservedType()) {
44✔
36
            return false;
16✔
37
        }
38

39
        $next = $tokens->getNextMeaningfulToken($index);
44✔
40
        $nextToken = $tokens[$next];
44✔
41

42
        if ($nextToken->isGivenKind(\T_NS_SEPARATOR)) {
44✔
43
            return false;
6✔
44
        }
45

46
        if ($nextToken->isGivenKind([\T_DOUBLE_COLON, \T_ELLIPSIS, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION, \T_VARIABLE])) {
44✔
47
            return true;
15✔
48
        }
49

50
        $prev = $tokens->getPrevMeaningfulToken($index);
40✔
51

52
        while ($tokens[$prev]->isGivenKind([CT::T_NAMESPACE_OPERATOR, \T_NS_SEPARATOR, \T_STRING])) {
40✔
53
            $prev = $tokens->getPrevMeaningfulToken($prev);
12✔
54
        }
55

56
        $prevToken = $tokens[$prev];
40✔
57

58
        if ($prevToken->isGivenKind([\T_EXTENDS, \T_INSTANCEOF, \T_INSTEADOF, \T_IMPLEMENTS, \T_NEW, CT::T_NULLABLE_TYPE, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION, CT::T_TYPE_COLON, CT::T_USE_TRAIT])) {
40✔
59
            return true;
12✔
60
        }
61

62
        if (\PHP_VERSION_ID >= 8_00_00 && $nextToken->equals(')') && $prevToken->equals('(') && $tokens[$tokens->getPrevMeaningfulToken($prev)]->isGivenKind(\T_CATCH)) {
35✔
63
            return true;
4✔
64
        }
65

66
        if (AttributeAnalyzer::isAttribute($tokens, $index)) {
31✔
67
            return true;
1✔
68
        }
69

70
        // `Foo & $bar` could be:
71
        //   - function reference parameter: function baz(Foo & $bar) {}
72
        //   - bit operator: $x = Foo & $bar;
73
        if ($nextToken->equals('&') && $tokens[$tokens->getNextMeaningfulToken($next)]->isGivenKind(\T_VARIABLE)) {
30✔
74
            $checkIndex = $tokens->getPrevTokenOfKind($prev + 1, [';', '{', '}', [\T_FUNCTION], [\T_OPEN_TAG], [\T_OPEN_TAG_WITH_ECHO]]);
2✔
75

76
            return $tokens[$checkIndex]->isGivenKind(\T_FUNCTION);
2✔
77
        }
78

79
        if (!$prevToken->equals(',')) {
29✔
80
            return false;
29✔
81
        }
82

83
        do {
84
            $prev = $tokens->getPrevMeaningfulToken($prev);
3✔
85
        } while ($tokens[$prev]->equalsAny([',', [\T_NS_SEPARATOR], [\T_STRING], [CT::T_NAMESPACE_OPERATOR]]));
3✔
86

87
        return $tokens[$prev]->isGivenKind([\T_IMPLEMENTS, CT::T_USE_TRAIT]);
3✔
88
    }
89
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc