src/Composer/DependencyResolver/Pool.php
private function match($candidate, $name, LinkConstraintInterface $constraint = null)
    {
        $candidateName = $candidate->getName();
        $candidateVersion = $candidate->getVersion();
        $isDev = $candidate->getStability() === 'dev';
        $isAlias = $candidate instanceof AliasPackage;

        if (!$isDev && !$isAlias && isset($this->filterRequires[$name])) {
            $requireFilter = $this->filterRequires[$name];
        } else {
            $requireFilter = new EmptyConstraint;
        }

        if ($candidateName === $name) {
            $pkgConstraint = new VersionConstraint('==', $candidateVersion);

            if ($constraint === null || $constraint->matches($pkgConstraint)) {
                return $requireFilter->matches($pkgConstraint) ? self::MATCH : self::MATCH_FILTERED;
            }

            return self::MATCH_NAME;
        }

        $provides = $candidate->getProvides();
        $replaces = $candidate->getReplaces();

        // aliases create multiple replaces/provides for one target so they can not use the shortcut below
        if (isset($replaces[0]) || isset($provides[0])) {
            foreach ($provides as $link) {
                if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) {
                    return $requireFilter->matches($link->getConstraint()) ? self::MATCH_PROVIDE : self::MATCH_FILTERED;
                }
            }

            foreach ($replaces as $link) {
                if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) {
                    return $requireFilter->matches($link->getConstraint()) ? self::MATCH_REPLACE : self::MATCH_FILTERED;
                }
            }

            return self::MATCH_NONE;
        }

        if (isset($provides[$name]) && ($constraint === null || $constraint->matches($provides[$name]->getConstraint()))) {
            return $requireFilter->matches($provides[$name]->getConstraint()) ? self::MATCH_PROVIDE : self::MATCH_FILTERED;
        }

        if (isset($replaces[$name]) && ($constraint === null || $constraint->matches($replaces[$name]->getConstraint()))) {
            return $requireFilter->matches($replaces[$name]->getConstraint()) ? self::MATCH_REPLACE : self::MATCH_FILTERED;
        }

        return self::MATCH_NONE;
    }
private function match($candidate, $name, LinkConstraintInterface $constraint = null)
    {
        $candidateName = $candidate->getName();
        $candidateVersion = $candidate->getVersion();
        $isDev = $candidate->getStability() === 'dev';
        $isAlias = $candidate instanceof AliasPackage;

        if (!$isDev && !$isAlias && isset($this->filterRequires[$name])) {
            $requireFilter = $this->filterRequires[$name];
        } else {
            $requireFilter = new EmptyConstraint;
        }

        if ($candidateName === $name) {
            $pkgConstraint = new VersionConstraint('==', $candidateVersion);

            if ($constraint === null || $constraint->matches($pkgConstraint)) {
                return $requireFilter->matches($pkgConstraint) ? self::MATCH : self::MATCH_FILTERED;
            }

            return self::MATCH_NAME;
        }

        $provides = $candidate->getProvides();
        $replaces = $candidate->getReplaces();

        // aliases create multiple replaces/provides for one target so they can not use the shortcut below
        if (isset($replaces[0]) || isset($provides[0])) {
            foreach ($provides as $link) {
                if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) {
                    return $requireFilter->matches($link->getConstraint()) ? self::MATCH_PROVIDE : self::MATCH_FILTERED;
                }
            }

            foreach ($replaces as $link) {
                if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) {
                    return $requireFilter->matches($link->getConstraint()) ? self::MATCH_REPLACE : self::MATCH_FILTERED;
                }
            }

            return self::MATCH_NONE;
        }

        if (isset($provides[$name]) && ($constraint === null || $constraint->matches($provides[$name]->getConstraint()))) {
            return $requireFilter->matches($provides[$name]->getConstraint()) ? self::MATCH_PROVIDE : self::MATCH_FILTERED;
        }

        if (isset($replaces[$name]) && ($constraint === null || $constraint->matches($replaces[$name]->getConstraint()))) {
            return $requireFilter->matches($replaces[$name]->getConstraint()) ? self::MATCH_REPLACE : self::MATCH_FILTERED;
        }

        return self::MATCH_NONE;
    }
private function match ( $ candidate , $ name , LinkConstraintInterface $ constraint = null ) { $ candidateName = $ candidate -> getName ( ) ; $ candidateVersion = $ candidate -> getVersion ( ) ; $ isDev = $ candidate -> getStability ( ) === 'dev' ; $ isAlias = $ candidate instanceof AliasPackage ; if ( ! $ isDev && ! $ isAlias && isset ( $ this -> filterRequires [ $ name ] ) ) { $ requireFilter = $ this -> filterRequires [ $ name ] ; } else { $ requireFilter = new EmptyConstraint ; } if ( $ candidateName === $ name ) { $ pkgConstraint = new VersionConstraint ( '==' , $ candidateVersion ) ; if ( $ constraint === null || $ constraint -> matches ( $ pkgConstraint ) ) { return $ requireFilter -> matches ( $ pkgConstraint ) ? self :: MATCH : self :: MATCH_FILTERED ; } return self :: MATCH_NAME ; } $ provides = $ candidate -> getProvides ( ) ; $ replaces = $ candidate -> getReplaces ( ) ; // aliases create multiple replaces/provides for one target so they can not use the shortcut below if ( isset ( $ replaces [ 0 ] ) || isset ( $ provides [ 0 ] ) ) { foreach ( $ provides as $ link ) { if ( $ link -> getTarget ( ) === $ name && ( $ constraint === null || $ constraint -> matches ( $ link -> getConstraint ( ) ) ) ) { return $ requireFilter -> matches ( $ link -> getConstraint ( ) ) ? self :: MATCH_PROVIDE : self :: MATCH_FILTERED ; } } foreach ( $ replaces as $ link ) { if ( $ link -> getTarget ( ) === $ name && ( $ constraint === null || $ constraint -> matches ( $ link -> getConstraint ( ) ) ) ) { return $ requireFilter -> matches ( $ link -> getConstraint ( ) ) ? self :: MATCH_REPLACE : self :: MATCH_FILTERED ; } } return self :: MATCH_NONE ; } if ( isset ( $ provides [ $ name ] ) && ( $ constraint === null || $ constraint -> matches ( $ provides [ $ name ] -> getConstraint ( ) ) ) ) { return $ requireFilter -> matches ( $ provides [ $ name ] -> getConstraint ( ) ) ? self :: MATCH_PROVIDE : self :: MATCH_FILTERED ; } if ( isset ( $ replaces [ $ name ] ) && ( $ constraint === null || $ constraint -> matches ( $ replaces [ $ name ] -> getConstraint ( ) ) ) ) { return $ requireFilter -> matches ( $ replaces [ $ name ] -> getConstraint ( ) ) ? self :: MATCH_REPLACE : self :: MATCH_FILTERED ; } return self :: MATCH_NONE ; }
Checks if the package matches the given constraint directly or through
provided or replaced packages

@param  array|PackageInterface  $candidate
@param  string                  $name       Name of the package to be matched
@param  LinkConstraintInterface $constraint The constraint to verify
@return int                     One of the MATCH* constants of this class or 0 if there is no match
Checks if the package matches the given constraint directly or through provided or replaced packages