@@ -65,42 +65,51 @@ public function processOpen(File $phpcsFile, $stackPtr)
65
65
$ stackPtrType = strtolower ($ tokens [$ stackPtr ]['content ' ]);
66
66
67
67
// Check alignment of the keyword and braces.
68
- if ($ tokens [($ stackPtr - 1 )]['code ' ] === T_WHITESPACE ) {
69
- $ prevContent = $ tokens [($ stackPtr - 1 )]['content ' ];
70
- if ($ prevContent !== $ phpcsFile ->eolChar ) {
71
- $ blankSpace = substr ($ prevContent , strpos ($ prevContent , $ phpcsFile ->eolChar ));
72
- $ spaces = strlen ($ blankSpace );
73
-
74
- if (in_array ($ tokens [($ stackPtr - 2 )]['code ' ], [T_ABSTRACT , T_FINAL , T_READONLY ], true ) === true
75
- && $ spaces !== 1
76
- ) {
77
- $ prevContent = strtolower ($ tokens [($ stackPtr - 2 )]['content ' ]);
78
- $ error = 'Expected 1 space between %s and %s keywords; %s found ' ;
79
- $ data = [
80
- $ prevContent ,
81
- $ stackPtrType ,
82
- $ spaces ,
83
- ];
84
-
85
- $ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'SpaceBeforeKeyword ' , $ data );
86
- if ($ fix === true ) {
87
- $ phpcsFile ->fixer ->replaceToken (($ stackPtr - 1 ), ' ' );
88
- }
89
- }
90
- } else if ($ tokens [($ stackPtr - 2 )]['code ' ] === T_ABSTRACT
91
- || $ tokens [($ stackPtr - 2 )]['code ' ] === T_FINAL
92
- || $ tokens [($ stackPtr - 2 )]['code ' ] === T_READONLY
93
- ) {
94
- $ prevContent = strtolower ($ tokens [($ stackPtr - 2 )]['content ' ]);
95
- $ error = 'Expected 1 space between %s and %s keywords; newline found ' ;
96
- $ data = [
97
- $ prevContent ,
68
+ $ classModifiers = [
69
+ T_ABSTRACT => T_ABSTRACT ,
70
+ T_FINAL => T_FINAL ,
71
+ T_READONLY => T_READONLY ,
72
+ ];
73
+
74
+ $ prevNonSpace = $ phpcsFile ->findPrevious (T_WHITESPACE , ($ stackPtr - 1 ), null , true );
75
+ $ prevNonEmpty = $ phpcsFile ->findPrevious (Tokens::$ emptyTokens , ($ stackPtr - 1 ), null , true );
76
+
77
+ if (isset ($ classModifiers [$ tokens [$ prevNonEmpty ]['code ' ]]) === true ) {
78
+ $ spaces = 0 ;
79
+ $ errorCode = 'SpaceBeforeKeyword ' ;
80
+ if ($ tokens [$ prevNonEmpty ]['line ' ] !== $ tokens [$ stackPtr ]['line ' ]) {
81
+ $ spaces = 'newline ' ;
82
+ $ errorCode = 'NewlineBeforeKeyword ' ;
83
+ } else if ($ tokens [($ stackPtr - 1 )]['code ' ] === T_WHITESPACE ) {
84
+ $ spaces = $ tokens [($ stackPtr - 1 )]['length ' ];
85
+ }
86
+
87
+ if ($ spaces !== 1 ) {
88
+ $ error = 'Expected 1 space between %s and %s keywords; %s found ' ;
89
+ $ data = [
90
+ strtolower ($ tokens [$ prevNonEmpty ]['content ' ]),
98
91
$ stackPtrType ,
92
+ $ spaces ,
99
93
];
100
94
101
- $ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'NewlineBeforeKeyword ' , $ data );
102
- if ($ fix === true ) {
103
- $ phpcsFile ->fixer ->replaceToken (($ stackPtr - 1 ), ' ' );
95
+ if ($ prevNonSpace !== $ prevNonEmpty ) {
96
+ // Comment found between modifier and class keyword. Do not auto-fix.
97
+ $ phpcsFile ->addError ($ error , $ stackPtr , $ errorCode , $ data );
98
+ } else {
99
+ $ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , $ errorCode , $ data );
100
+ if ($ fix === true ) {
101
+ if ($ spaces === 0 ) {
102
+ $ phpcsFile ->fixer ->addContentBefore ($ stackPtr , ' ' );
103
+ } else {
104
+ $ phpcsFile ->fixer ->beginChangeset ();
105
+ $ phpcsFile ->fixer ->replaceToken (($ stackPtr - 1 ), ' ' );
106
+ for ($ i = ($ stackPtr - 2 ); $ i > $ prevNonSpace ; $ i --) {
107
+ $ phpcsFile ->fixer ->replaceToken ($ i , ' ' );
108
+ }
109
+
110
+ $ phpcsFile ->fixer ->endChangeset ();
111
+ }
112
+ }
104
113
}
105
114
}//end if
106
115
}//end if
0 commit comments