sadovnik/hexlet-psr-linter

View on GitHub
src/Rules/RuleCollection.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace PsrLinter\Rules;

use PhpParser\Node;

class RuleCollection
{
    /**
     * @var AbstractRule[]
     */
    private $rules;

    /**
     * @var array
     */
    private $map = null;

    /**
     * @param AbstractRule[] $rules
     */
    public function __construct(array $rules)
    {
        $this->rules = $rules;
    }

    /**
     * @param Node $node
     */
    public function getAssociatedRules(Node $node)
    {
        foreach ($this->getNodeTypeMap() as $nodeType => $rules) {
            if ($node instanceof $nodeType) {
                return $rules;
            }
        }
        return [];
    }

    /**
     * @return AbstractRule[]
     */
    protected function getNodeTypeMap()
    {
        if ($this->map === null) {
            $this->map = [];
            foreach ($this->rules as $rule) {
                $nodeTypes = $rule->getNodeTypes();
                foreach ($nodeTypes as $nodeType) {
                    if (!array_key_exists($nodeType, $this->map)) {
                        $this->map[$nodeType] = [];
                    }
                    array_push($this->map[$nodeType], $rule);
                }
            }
        }

        return $this->map;
    }

    /**
     * @return AbstractRule[]
     */
    public function getFilewideRules()
    {
        return array_filter(
            $this->rules,
            function ($rule) {
                return $rule instanceof FilewideRuleInterface;
            }
        );
    }
}