@@ -47,79 +47,124 @@ public function register()
47
47
*/
48
48
public function process (File $ phpcsFile , $ stackPtr )
49
49
{
50
- $ tokens = $ phpcsFile ->getTokens ();
51
-
52
- if ($ tokens [($ stackPtr - 1 )]['code ' ] !== T_WHITESPACE ) {
53
- $ error = 'Expected 1 space before opening brace of class definition; 0 found ' ;
54
- $ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'NoneBefore ' );
55
- if ($ fix === true ) {
56
- $ phpcsFile ->fixer ->addContentBefore ($ stackPtr , ' ' );
57
- }
58
- } else {
59
- $ content = $ tokens [($ stackPtr - 1 )]['content ' ];
60
- if ($ content !== ' ' ) {
61
- if ($ tokens [($ stackPtr - 1 )]['line ' ] < $ tokens [$ stackPtr ]['line ' ]) {
62
- $ length = 'newline ' ;
50
+ $ tokens = $ phpcsFile ->getTokens ();
51
+ $ prevNonWhitespace = $ phpcsFile ->findPrevious (T_WHITESPACE , ($ stackPtr - 1 ), null , true );
52
+
53
+ if ($ prevNonWhitespace !== false ) {
54
+ $ length = 0 ;
55
+ if ($ tokens [$ stackPtr ]['line ' ] !== $ tokens [$ prevNonWhitespace ]['line ' ]) {
56
+ $ length = 'newline ' ;
57
+ } else if ($ tokens [($ stackPtr - 1 )]['code ' ] === T_WHITESPACE ) {
58
+ if (strpos ($ tokens [($ stackPtr - 1 )]['content ' ], "\t" ) !== false ) {
59
+ $ length = 'tab ' ;
63
60
} else {
64
- $ length = strlen ($ content );
65
- if ($ length === 1 ) {
66
- $ length = 'tab ' ;
67
- }
61
+ $ length = $ tokens [($ stackPtr - 1 )]['length ' ];
68
62
}
63
+ }
69
64
65
+ if ($ length === 0 ) {
66
+ $ error = 'Expected 1 space before opening brace of class definition; 0 found ' ;
67
+ $ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'NoneBefore ' );
68
+ if ($ fix === true ) {
69
+ $ phpcsFile ->fixer ->addContentBefore ($ stackPtr , ' ' );
70
+ }
71
+ } else if ($ length !== 1 ) {
70
72
$ error = 'Expected 1 space before opening brace of class definition; %s found ' ;
71
73
$ data = [$ length ];
72
74
$ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'Before ' , $ data );
73
75
if ($ fix === true ) {
74
- $ phpcsFile ->fixer ->replaceToken (($ stackPtr - 1 ), ' ' );
76
+ $ phpcsFile ->fixer ->beginChangeset ();
77
+
78
+ for ($ i = ($ stackPtr - 1 ); $ i > $ prevNonWhitespace ; $ i --) {
79
+ $ phpcsFile ->fixer ->replaceToken ($ i , '' );
80
+ }
81
+
82
+ $ phpcsFile ->fixer ->addContentBefore ($ stackPtr , ' ' );
83
+ $ phpcsFile ->fixer ->endChangeset ();
75
84
}
76
- }
85
+ }//end if
77
86
}//end if
78
87
79
- $ next = $ phpcsFile ->findNext (Tokens::$ emptyTokens , ($ stackPtr + 1 ), null , true );
80
- if ($ next === false ) {
88
+ $ nextNonEmpty = $ phpcsFile ->findNext (Tokens::$ emptyTokens , ($ stackPtr + 1 ), null , true );
89
+ if ($ nextNonEmpty === false ) {
81
90
return ;
82
91
}
83
92
84
- // Check for nested class definitions.
85
- $ nested = false ;
86
- $ found = $ phpcsFile ->findNext (
87
- T_OPEN_CURLY_BRACKET ,
88
- ($ stackPtr + 1 ),
89
- $ tokens [$ stackPtr ]['bracket_closer ' ]
90
- );
91
-
92
- if ($ found !== false ) {
93
- $ nested = true ;
94
- }
95
-
96
- if ($ tokens [$ next ]['line ' ] === $ tokens [$ stackPtr ]['line ' ]) {
93
+ if ($ tokens [$ nextNonEmpty ]['line ' ] === $ tokens [$ stackPtr ]['line ' ]) {
97
94
$ error = 'Opening brace should be the last content on the line ' ;
98
95
$ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'ContentBefore ' );
99
96
if ($ fix === true ) {
97
+ $ phpcsFile ->fixer ->beginChangeset ();
100
98
$ phpcsFile ->fixer ->addNewline ($ stackPtr );
99
+
100
+ // Remove potentially left over trailing whitespace.
101
+ if ($ tokens [($ stackPtr + 1 )]['code ' ] === T_WHITESPACE ) {
102
+ $ phpcsFile ->fixer ->replaceToken (($ stackPtr + 1 ), '' );
103
+ }
104
+
105
+ $ phpcsFile ->fixer ->endChangeset ();
101
106
}
102
107
} else {
103
- $ foundLines = ($ tokens [$ next ]['line ' ] - $ tokens [$ stackPtr ]['line ' ] - 1 );
104
- if ($ nested === true ) {
105
- if ($ foundLines !== 1 ) {
106
- $ error = 'Expected 1 blank line after opening brace of nesting class definition; %s found ' ;
107
- $ data = [$ foundLines ];
108
- $ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'AfterNesting ' , $ data );
109
-
110
- if ($ fix === true ) {
111
- if ($ foundLines === 0 ) {
112
- $ phpcsFile ->fixer ->addNewline ($ stackPtr );
113
- } else {
114
- $ next = $ phpcsFile ->findNext (T_WHITESPACE , ($ stackPtr + 1 ), null , true );
115
- $ phpcsFile ->fixer ->beginChangeset ();
116
- for ($ i = ($ stackPtr + 1 ); $ i < ($ next + 1 ); $ i ++) {
117
- $ phpcsFile ->fixer ->replaceToken ($ i , '' );
108
+ if (isset ($ tokens [$ stackPtr ]['bracket_closer ' ]) === false ) {
109
+ // Syntax error or live coding, bow out.
110
+ return ;
111
+ }
112
+
113
+ // Check for nested class definitions.
114
+ $ found = $ phpcsFile ->findNext (
115
+ T_OPEN_CURLY_BRACKET ,
116
+ ($ stackPtr + 1 ),
117
+ $ tokens [$ stackPtr ]['bracket_closer ' ]
118
+ );
119
+
120
+ if ($ found === false ) {
121
+ // Not nested.
122
+ return ;
123
+ }
124
+
125
+ $ lastOnLine = $ stackPtr ;
126
+ for ($ lastOnLine ; $ lastOnLine < $ tokens [$ stackPtr ]['bracket_closer ' ]; $ lastOnLine ++) {
127
+ if ($ tokens [$ lastOnLine ]['line ' ] !== $ tokens [($ lastOnLine + 1 )]['line ' ]) {
128
+ break ;
129
+ }
130
+ }
131
+
132
+ $ nextNonWhiteSpace = $ phpcsFile ->findNext (T_WHITESPACE , ($ lastOnLine + 1 ), null , true );
133
+ if ($ nextNonWhiteSpace === false ) {
134
+ return ;
135
+ }
136
+
137
+ $ foundLines = ($ tokens [$ nextNonWhiteSpace ]['line ' ] - $ tokens [$ stackPtr ]['line ' ] - 1 );
138
+ if ($ foundLines !== 1 ) {
139
+ $ error = 'Expected 1 blank line after opening brace of nesting class definition; %s found ' ;
140
+ $ data = [max (0 , $ foundLines )];
141
+ $ fix = $ phpcsFile ->addFixableError ($ error , $ stackPtr , 'AfterNesting ' , $ data );
142
+
143
+ if ($ fix === true ) {
144
+ $ firstOnNextLine = $ nextNonWhiteSpace ;
145
+ while ($ tokens [$ firstOnNextLine ]['column ' ] !== 1 ) {
146
+ --$ firstOnNextLine ;
147
+ }
148
+
149
+ if ($ found < 0 ) {
150
+ // First statement on same line as the opening brace.
151
+ $ phpcsFile ->fixer ->addContentBefore ($ nextNonWhiteSpace , $ phpcsFile ->eolChar .$ phpcsFile ->eolChar );
152
+ } else if ($ found === 0 ) {
153
+ // Next statement on next line, no blank line.
154
+ $ phpcsFile ->fixer ->addNewlineBefore ($ firstOnNextLine );
155
+ } else {
156
+ // Too many blank lines.
157
+ $ phpcsFile ->fixer ->beginChangeset ();
158
+ for ($ i = ($ firstOnNextLine - 1 ); $ i > $ stackPtr ; $ i --) {
159
+ if ($ tokens [$ i ]['code ' ] !== T_WHITESPACE ) {
160
+ break ;
118
161
}
119
162
120
- $ phpcsFile ->fixer ->addNewline ($ stackPtr );
121
- $ phpcsFile ->fixer ->endChangeset ();
163
+ $ phpcsFile ->fixer ->replaceToken ($ i , '' );
122
164
}
165
+
166
+ $ phpcsFile ->fixer ->addContentBefore ($ firstOnNextLine , $ phpcsFile ->eolChar .$ phpcsFile ->eolChar );
167
+ $ phpcsFile ->fixer ->endChangeset ();
123
168
}
124
169
}//end if
125
170
}//end if
0 commit comments