2015-09-15 7 views
12

Spędziłem ponad 2h próbując dowiedzieć się, jak wymagać { w tym samym wierszu, co deklaracja metody, zamiast domyślnego wymogu jest następny wiersz. Jak mogę to zrobić? Skopiowałem standard PSR2 do nowego folderu o nazwie PSR2, aby móc go zmodyfikować zgodnie z własnymi upodobaniami. Więc podstawą, nad którą pracuję, jest zasadniczo standard PSR2, który chciałbym zmodyfikować.phpcs: Jak mogę zmodyfikować PSR2, aby sprawdzić, czy klamra jest na tej samej linii, co metoda?

Próbowałem już pliku ruleset.xml i próbowałem go zmodyfikować bezpośrednio w kodzie bez powodzenia.

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

Ja już zorientowali się, że jest to źle. EOL jest ustawiany przez phpcs. Ale nie mogę się dowiedzieć, czy w ogóle istnieje wartość, którą mogę skonfigurować za pomocą reguły.

Działa to dobrze dla mnie do tej pory (przykręcić głupie spacji !!!):

<?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> 

Ale chciałbym dodać powyższy przepis.

+0

To również zostało zadane tutaj: https://github.com/squizlabs/PHP_CodeSniffer/issues/703 –

Odpowiedz

9

Umieść ten kod w pliku ruleset.xml:

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

który obejmie standard PSR2, ale wykluczyć konkretny komunikat o klamra, która chciałaby być na tej samej linii. Następnie zawiera ogólne wywołanie sniffa, które wymusza nawiasy klamrowe i metody na następującym wierszu.

Z tej zmiany, ten kod:

<?php 
namespace Test; 

class Foo 
{ 
    public function bar() { 
    } 
} 

przyniesie żadnych błędów, ale działa PSR2 bezpośrednio nad nim produkuje jeden błąd:

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

Dziękujemy! Nie mogłem ustalić, którą zasadę muszę wykluczyć! Jak zarchiwizować to samo dla deklaracji klasy? Czy znasz zasady, które zmieniły się również w tym zakresie? To smutne, że nie ma odpowiedniej dokumentacji dla wszystkich reguł - albo ich nie znalazłem. – burzum

+0

W rzeczywistości nie ma włączonego wąchania, aby wymusić klamrę klasową na tej samej linii i nikt nigdy nie zażądał. Aby to zrobić, musisz napisać niestandardowy sniff lub przesłać żądanie funkcji, aby coś dodać do rdzenia. I tak, wiem, że jest brak dokumentów na ten temat i mam nadzieję, że mogę to zmienić pewnego dnia.Jestem jednak tylko zespołem jednej osoby i mam bardzo pełnoetatową pracę oraz rodzinę, więc mój czas zawsze był dość ograniczony. Na szczęście wielu dobrych ludzi przesłało kod do projektu. Tylko niewielu doktorów :) –

+0

Stara wersja frameworków CakePHP musi mieć na to powąchać, zobaczę, czy mogę go zidentyfikować i zrobię PR do phpcs, jeśli uda mi się to zrobić. Nie zdawałem sobie sprawy, że jesteś głównym programistą tego projektu. Dzięki za to niesamowite narzędzie! W jaki sposób mogę przekazać kilka dolców? :) – burzum

1

Oprócz odpowiedź od Grega, jeśli ciebie używają PHPStorm, przejdź do Settings -> Editor -> Inspections -> PHP -> Code Sniffer, a zobaczysz opcję Show sniff name.

enter image description here

To daje nazwę reguły naruszającego (najpierw skonfigurować kod wykonywalny ścieżkę PHP Sniffer w Settings -> Languages and frameworks -> PHP -> Code sniffer). Następnie na etykiecie narzędzia ostrzegawczego w pliku kodu źródłowego, ostrożnie przesuń kursor, zaznacz tekst i nie zwalniając przycisku, wciśnij Control C, aby go skopiować.

Następnie wklej go w przepisach:

<?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> 

Dodałem tu PSR2.Classes.ClassDeclaration.OpenBraceNewLine do wyłączonych reguł.

Powiązane problemy