Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
Alternative
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
2 / 2
5
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 generateMatches
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2/**
3 * @file
4 * @license https://opensource.org/licenses/Apache-2.0 Apache-2.0
5 */
6
7namespace Wikimedia\CSS\Grammar;
8
9use Wikimedia\CSS\Objects\ComponentValueList;
10use Wikimedia\CSS\Util;
11
12/**
13 * Matcher that matches one out of a set of Matchers ("|" combiner).
14 * @see https://www.w3.org/TR/2019/CR-css-values-3-20190606/#comb-one
15 */
16class Alternative extends Matcher {
17    /** @var Matcher[] */
18    protected $matchers;
19
20    /**
21     * @param Matcher[] $matchers
22     */
23    public function __construct( array $matchers ) {
24        Util::assertAllInstanceOf( $matchers, Matcher::class, '$matchers' );
25        $this->matchers = $matchers;
26    }
27
28    /** @inheritDoc */
29    protected function generateMatches( ComponentValueList $values, $start, array $options ) {
30        $used = [];
31        foreach ( $this->matchers as $matcher ) {
32            foreach ( $matcher->generateMatches( $values, $start, $options ) as $match ) {
33                $newMatch = $this->makeMatch( $values, $start, $match->getNext(), $match );
34                $mid = $newMatch->getUniqueID();
35                if ( !isset( $used[$mid] ) ) {
36                    $used[$mid] = 1;
37                    yield $newMatch;
38                }
39            }
40        }
41    }
42}