Вход Регистрация
Файл: gapps/vendor/psy/psysh/src/Psy/Command/ListCommand/Enumerator.php
Строк: 157
<?php

/*
 * This file is part of Psy Shell.
 *
 * (c) 2012-2015 Justin Hileman
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace PsyCommandListCommand;

use 
PsyFormatterSignatureFormatter;
use 
PsyUtilMirror;
use 
PsyVarDumperPresenter;
use 
SymfonyComponentConsoleInputInputInterface;

/**
 * Abstract Enumerator class.
 */
abstract class Enumerator
{
    
// Output styles
    
const IS_PUBLIC    'public';
    const 
IS_PROTECTED 'protected';
    const 
IS_PRIVATE   'private';
    const 
IS_GLOBAL    'global';
    const 
IS_CONSTANT  'const';
    const 
IS_CLASS     'class';
    const 
IS_FUNCTION  'function';

    private 
$presenter;

    private 
$filter       false;
    private 
$invertFilter false;
    private 
$pattern;

    
/**
     * Enumerator constructor.
     *
     * @param Presenter $presenter
     */
    
public function __construct(Presenter $presenter)
    {
        
$this->presenter $presenter;
    }

    
/**
     * Return a list of categorized things with the given input options and target.
     *
     * @param InputInterface $input
     * @param Reflector      $reflector
     * @param mixed          $target
     *
     * @return array
     */
    
public function enumerate(InputInterface $inputReflector $reflector null$target null)
    {
        
$this->setFilter($input);

        return 
$this->listItems($input$reflector$target);
    }

    
/**
     * Enumerate specific items with the given input options and target.
     *
     * Implementing classes should return an array of arrays:
     *
     *     [
     *         'Constants' => [
     *             'FOO' => [
     *                 'name'  => 'FOO',
     *                 'style' => 'public',
     *                 'value' => '123',
     *             ],
     *         ],
     *     ]
     *
     * @param InputInterface $input
     * @param Reflector      $reflector
     * @param mixed          $target
     *
     * @return array
     */
    
abstract protected function listItems(InputInterface $inputReflector $reflector null$target null);

    protected function 
presentRef($value)
    {
        return 
$this->presenter->presentRef($value);
    }

    protected function 
showItem($name)
    {
        return 
$this->filter === false || (preg_match($this->pattern$name) xor $this->invertFilter);
    }

    private function 
setFilter(InputInterface $input)
    {
        if (
$pattern $input->getOption('grep')) {
            if (
substr($pattern01) !== '/' || substr($pattern, -1) !== '/' || strlen($pattern) < 3) {
                
$pattern '/' preg_quote($pattern'/') . '/';
            }

            if (
$input->getOption('insensitive')) {
                
$pattern .= 'i';
            }

            
$this->validateRegex($pattern);

            
$this->filter       true;
            
$this->pattern      $pattern;
            
$this->invertFilter $input->getOption('invert');
        } else {
            
$this->filter false;
        }
    }

    
/**
     * Validate that $pattern is a valid regular expression.
     *
     * @param string $pattern
     *
     * @return bool
     */
    
private function validateRegex($pattern)
    {
        
set_error_handler(array('PsyExceptionErrorException''throwException'));
        try {
            
preg_match($pattern'');
        } catch (
ErrorException $e) {
            throw new 
RuntimeException(str_replace('preg_match(): ''Invalid regular expression: '$e->getRawMessage()));
        }
        
restore_error_handler();
    }

    protected function 
presentSignature($target)
    {
        
// This might get weird if the signature is actually for a reflector. Hrm.
        
if (!$target instanceof Reflector) {
            
$target Mirror::get($target);
        }

        return 
SignatureFormatter::format($target);
    }
}
Онлайн: 1
Реклама