2015-09-15 1 views
12

Я потратил более двух часов на попытку выяснить, как требовать { в той же строке, что и декларация метода, вместо требования по умолчанию, являющегося следующей строкой. Как я могу это сделать? Я скопировал стандарт PSR2 в новую папку с именем PSR2, чтобы изменить его по своему вкусу. Итак, базой, над которой я работаю, является, в основном, стандарт PSR2, который я бы хотел изменить.phpcs: Как я могу изменить PSR2, чтобы проверить, что скобка находится на той же линии, что и метод?

Я пробовал файл ruleset.xml, и я попытался изменить его в коде непосредственно без успеха.

<rule ref="PEAR.Classes.ClassDeclaration"> 
    <properties> 
     <property name="eolChar" value="{"/> 
    </properties> 
</rule> 
<rule ref="PSR2R.Classes.ClassDeclaration"> 
    <properties> 
     <property name="eolChar" value="{"/> 
    </properties> 
</rule> 

Я уже понял, что это неправильно . EOL устанавливается с помощью phpcs. Но я не могу понять, есть ли вообще значение, которое я могу настроить с помощью правила.

Это прекрасно работает для меня до сих пор (винта глупых мест !!!):

<?xml version="1.0"?> 
<ruleset name="PSR2R"> 
    <description>PSR2 with tabs instead of spaces.</description> 
    <arg name="tab-width" value="4"/> 
    <rule ref="PSR2"> 
     <exclude name="Generic.WhiteSpace.DisallowTabIndent"/> 
    </rule> 
    <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/> 
    <rule ref="Generic.WhiteSpace.ScopeIndent"> 
     <properties> 
      <property name="indent" value="4"/> 
      <property name="tabIndent" value="true"/> 
     </properties> 
    </rule> 
</ruleset> 

Но я хотел бы добавить правило выше.

+0

Это также было предложено здесь: https://github.com/squizlabs/PHP_CodeSniffer/issues/703 –

ответ

9

Поместите этот код в файле ruleset.xml:

<rule ref="PSR2"> 
    <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine" /> 
</rule> 
<rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie" /> 

Это будет включать в себя стандарт PSR2, но исключить конкретное сообщение о скобкой нуждающейся быть на одной и той же линии. Затем он включает в себя Generic sniff, который заставляет метод и функции фигурные скобки находиться в следующей строке.

С учетом этого изменения, этот код:

<?php 
namespace Test; 

class Foo 
{ 
    public function bar() { 
    } 
} 

не будет производить никаких ошибок, но работает PSR2 непосредственно над ним производит одну ошибку:

FILE: temp.php 
---------------------------------------------------------------------- 
FOUND 1 ERROR AFFECTING 1 LINE 
---------------------------------------------------------------------- 
6 | ERROR | [x] Opening brace should be on a new line 
---------------------------------------------------------------------- 
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY 
---------------------------------------------------------------------- 
+0

Спасибо! Я не мог понять, какое правило я должен был исключить! Как я могу архивировать это для объявления класса? Знаете ли вы правила, которые необходимо изменить для этого? Печально, что нет правильной документации для всех правил - или я их не нашел. – burzum

+0

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

+0

Старая версия CakePHP-структуры должна иметь нюх для этого, я посмотрю, смогу ли я ее идентифицировать и сделаю PR для phpcs, если мне удастся это сделать. Я не понял, что вы являетесь ведущим разработчиком этого проекта. Спасибо за этот замечательный инструмент! В любом случае я могу пожертвовать несколько долларов? :) – burzum

1

В дополнение к ответу от Грега, если вы используют PHPStorm, перейдите к Settings -> Editor -> Inspections -> PHP -> Code Sniffer, и вы увидите опцию Show sniff name.

enter image description here

Это даст вам имя правила нарушившей (первый, настроить PHP Code Sniffer путь к исполняемому файлу в Settings -> Languages and frameworks -> PHP -> Code sniffer). Затем в подсказке с предупреждением в файле исходного кода осторожно переместите курсор, выберите текст и не отпуская кнопку, нажмите Control C, чтобы скопировать его.

Затем вставьте его в правилах:

<?xml version="1.0"?> 
<ruleset name="PSR2R"> 
    <rule ref="PSR2"> 
     <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine" /> 
     <exclude name="PSR2.Classes.ClassDeclaration.OpenBraceNewLine" /> 
    </rule> 
    <rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie" /> 
</ruleset> 

Я добавил сюда PSR2.Classes.ClassDeclaration.OpenBraceNewLine исключенных правил.

Смежные вопросы