matcherDefinitions = $matcherDefinitions; $this->validateMatcherDefinitions(['numberOfMandatoryArguments', 'maximumNumberOfArguments']); $this->initializeFlatMatcherDefinitions(); } /** * Called by PhpParser. * Test for "foo\bar::deprecated()" (strong match) * Test for "::deprecated()" (weak match) */ public function enterNode(Node $node): null { // Static call, not method call if (!$this->isFileIgnored($node) && !$this->isLineIgnored($node) && $node instanceof StaticCall ) { if ($node->class instanceof FullyQualified && $node->name instanceof Identifier) { // 'Foo\Bar::deprecated()' -> strong match $fqdnClassWithMethod = $node->class->toString() . '::' . $node->name->name; if (array_key_exists($fqdnClassWithMethod, $this->matcherDefinitions)) { $this->matches[] = [ 'restFiles' => $this->matcherDefinitions[$fqdnClassWithMethod]['restFiles'], 'line' => $node->getAttribute('startLine'), 'message' => 'Use of static class method call "' . $fqdnClassWithMethod . '()"', 'indicator' => 'strong', ]; } } elseif ($node->class instanceof Variable && $node->name instanceof Identifier && array_key_exists($node->name->name, $this->flatMatcherDefinitions) ) { $match = [ 'restFiles' => [], 'line' => $node->getAttribute('startLine'), 'message' => 'Use of static class method call "' . $node->name->name . '()"', 'indicator' => 'weak', ]; $numberOfArguments = count($node->args); $isArgumentUnpackingUsed = $this->isArgumentUnpackingUsed($node->args); $isPossibleMatch = false; foreach ($this->flatMatcherDefinitions[$node->name->name]['candidates'] as $candidate) { // A method call is considered a match if it is called with argument unpacking, or // if the number of given arguments is within range of mandatory / max number of arguments if ($isArgumentUnpackingUsed || ($numberOfArguments >= $candidate['numberOfMandatoryArguments'] && $numberOfArguments <= $candidate['maximumNumberOfArguments']) ) { $isPossibleMatch = true; $match['restFiles'] = array_unique(array_merge($match['restFiles'], $candidate['restFiles'])); } } if ($isPossibleMatch) { $this->matches[] = $match; } } } return null; } }