Как настроить PHP CodeSniffer для разрешения массивов с любым отступом?

У меня есть собственный набор правил, определенный в XML.

Я привык нажимать tab после каждого =>, так что, если мой массив многострочный, все будет хорошо выравниваться. Это стало привычкой, и я также использую это для однострочных массивов. Поэтому многострочный массив может выглядеть так

$array = array(
    'something' =>  array(
        'short'     =>  1,
        'longer'    =>  1,
    ),
);

Проблема в том, что PHP CodeSniffer жалуется, что между => и значением более 1 пробела (поскольку я всегда нажимаю tab, в большинстве случаев будет более одного пробела - конечно, в зависимости от длины строки, поэтому далеко, это может быть и один пробел иногда)

Я попытался добавить токен T_ARRAY в определение правила Generic.WhiteSpace.ScopeIndent, но это не помогло.

<rule ref="Generic.WhiteSpace.ScopeIndent">
    <properties>
        <property name="indent" value="4"/>
        <property name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT_OPEN_TAG,T_ARRAY"/>
    </properties>
</rule>

Есть ли решение для этого?

ОБНОВЛЕНИЕ

Хорошо, я понял, что Generic.WhiteSpace.ScopeIndent не имеет к этому никакого отношения, потому что Squiz.WhiteSpace.OperatorSpacing применяет это правило. Теперь, согласно документации, я не могу настроить это свойство, чтобы исключить оператор =>. Есть ли другой способ сделать это?


person Stefan Gabos    schedule 11.07.2018    source источник


Ответы (1)


К сожалению, у этого сниффа нет никаких параметров конфигурации, чтобы игнорировать этот конкретный случай. Помимо добавления опции в снифф, у вас действительно есть только два способа решить эту проблему. Ни то, ни другое.

1. Вы можете исключить код ошибки Squiz.WhiteSpace.OperatorSpacing.SpacingAfter из своего набора правил. Это по-прежнему позволит сниффу выдавать ошибки для пробелов перед операторами и вокруг побитовых операторов, но вы не получите никаких ошибок, когда у вас есть несколько пробелов после стандартного оператора.

Чтобы исключить код ошибки, вы должны добавить это в свой набор правил:

<exclude name="Squiz.WhiteSpace.OperatorSpacing.SpacingAfter"/>

2. Вы можете написать собственный снифф, который расширяет PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace\OperatorSpacingSniff и переопределяет метод isOperator(). Ваш переопределенный метод обнаружит токен T_DOUBLE_ARROW и вернет false, что приведет к тому, что основной код сниффинга перестанет проверять двойные стрелки. Если это не двойная стрелка, вы можете вернуть запрос родительскому классу.

Если вы делаете это, вам нужно поддерживать свой собственный стандарт с сниффами, что означает размещение где-то каталога со структурой подкаталогов Sniffs для хранения вашего сниффа.

person Greg Sherwood    schedule 11.07.2018
comment
Спасибо за ответ. Есть ли шанс, что функция добавления опций в Squiz.WhiteSpace.OperatorSpacing снифф попадет в кодовую базу CodeSniff? Или можно как-то полностью исключить arrays из проверки? - person Stefan Gabos; 12.07.2018
comment
Можно было бы добавить его в качестве варианта обнюхивания, но в настоящее время у меня есть более 100 элементов в невыполненной работе, поэтому, вероятно, это не будет сделано, если, к сожалению, кто-то не пришлет для него PR. И нет никакого способа заставить сниффер исключить массивы. - person Greg Sherwood; 16.07.2018