@@ -28,7 +28,7 @@ class FunctionsPHPDocFormattingSniff implements Sniff
28
28
29
29
public function __construct ()
30
30
{
31
- $ this ->functionPHPDocBlock = new FunctionPHPDocBlock ();
31
+ $ this ->functionPHPDocBlock = new FunctionPHPDocBlockParser ();
32
32
}
33
33
34
34
/**
@@ -44,37 +44,44 @@ public function register()
44
44
*/
45
45
public function process (File $ phpcsFile , $ stackPtr )
46
46
{
47
- $ funcReturnType = $ this ->anaylsePhp7ReturnDeclaration ($ phpcsFile , $ stackPtr );
47
+ $ funcReturnType = $ this ->analysePhp7ReturnDeclaration ($ phpcsFile , $ stackPtr );
48
48
$ funcParamTypeList = $ this ->analysePhp7ParamDeclarations ($ phpcsFile , $ stackPtr );
49
49
$ phpDocTokens = $ this ->getPhpDocTokens ($ phpcsFile , $ stackPtr );
50
+ $ hasPhp7TypeDeclarations = $ funcReturnType !== false || count ($ funcParamTypeList ['missing_type ' ]) === 0 ;
50
51
51
- if ($ phpDocTokens === false && $ funcReturnType === false && count ($ funcParamTypeList ['missing_type ' ] !== 0 )) {
52
- $ phpcsFile ->addWarning ('Use php 7 type declarations or an php doc block ' , $ stackPtr , $ this ->warningCode );
53
-
54
- // @fixme find also __constuct that dont have return type
52
+ if ($ phpDocTokens === false && $ hasPhp7TypeDeclarations === true ) {
53
+ // NO check it use all php 7 type declarations and no php doc docblock
55
54
return ;
56
55
}
57
56
58
- if ($ phpDocTokens === false ) {
59
- // @todo impelement checks
57
+ if ($ phpDocTokens === false && $ hasPhp7TypeDeclarations === false ) {
58
+ $ phpcsFile ->addWarning ('Use php 7 type declarations or an php doc block ' , $ stackPtr , $ this ->warningCode );
59
+
60
60
return ;
61
61
}
62
62
63
- $ parsePhpDocTokens = $ this ->functionPHPDocBlock ->execute (
63
+ $ phpDocTokensList = $ this ->functionPHPDocBlock ->execute (
64
64
$ phpcsFile ->getTokens (),
65
65
$ phpDocTokens [0 ],
66
66
$ phpDocTokens [1 ]
67
67
);
68
68
69
- $ warning = $ parsePhpDocTokens ['warning ' ];
69
+ if (array_key_exists ('@inheritdoc ' , array_flip ($ phpDocTokensList ['tags ' ]))) {
70
+ $ phpcsFile ->addWarning ('The @inheritdoc tag SHOULD NOT be used ' , $ stackPtr , $ this ->warningCode );
70
71
71
- if ($ warning !== false ) {
72
- $ phpcsFile ->addWarning ($ warning [0 ], $ warning [1 ], $ this ->warningCode );
73
72
return ;
74
73
}
75
74
75
+ if (count ($ phpDocTokensList ['parameters ' ]) > 0 ) {
76
+ $ phpcsFile = $ this ->comparePhp7WithDocBlock (
77
+ $ funcParamTypeList ,
78
+ $ phpDocTokensList ['parameters ' ],
79
+ $ phpcsFile ,
80
+ $ stackPtr
81
+ );
82
+ }
83
+
76
84
77
- // @todo impelement checks
78
85
}
79
86
80
87
/**
@@ -83,12 +90,17 @@ public function process(File $phpcsFile, $stackPtr)
83
90
* @param $stackPtr
84
91
* @return bool|string
85
92
*/
86
- private function anaylsePhp7ReturnDeclaration (File $ phpcsFile , $ stackPtr )
93
+ private function analysePhp7ReturnDeclaration (File $ phpcsFile , $ stackPtr )
87
94
{
88
95
$ tokens = $ phpcsFile ->getTokens ();
96
+ $ functionNameToken = $ phpcsFile ->findNext (T_STRING , $ stackPtr , $ tokens [$ stackPtr ]['parenthesis_opener ' ]);
97
+ if (strpos ($ tokens [$ functionNameToken ]['content ' ], '__construct ' ) === 0 ) {
98
+ // magic functions start with __construct dont have php7 return type
99
+ return 'void ' ;
100
+ }
101
+
89
102
$ funcParamCloser = $ tokens [$ stackPtr ]['parenthesis_closer ' ];
90
103
$ funcReturnTypePos = $ phpcsFile ->findNext ([T_STRING ], $ funcParamCloser , $ tokens [$ stackPtr ]['scope_opener ' ]);
91
-
92
104
$ funcReturnType = false ;
93
105
if ($ funcReturnTypePos !== false ) {
94
106
$ funcReturnType = $ tokens [$ funcReturnTypePos ]['content ' ];
@@ -130,6 +142,7 @@ private function parseFunctionTokens(array $tokens)
130
142
{
131
143
$ paramType = null ;
132
144
$ functionParameterList = [
145
+ 'count ' => 0 ,
133
146
'missing_type ' => [],
134
147
'has_type ' => [],
135
148
];
@@ -151,8 +164,9 @@ private function parseFunctionTokens(array $tokens)
151
164
continue ;
152
165
}
153
166
167
+ $ functionParameterList ['count ' ]++;
154
168
$ key = $ paramType !== null ? 'has_type ' : 'missing_type ' ;
155
- $ functionParameterList [$ key ][] =
169
+ $ functionParameterList [$ key ][$ content ] =
156
170
[
157
171
'content ' => $ content ,
158
172
'type ' => $ paramType ,
@@ -192,4 +206,49 @@ private function getPhpDocTokens(File $phpcsFile, $stackPtr)
192
206
193
207
return [$ commentStart + 1 , $ commentEnd - 1 ];
194
208
}
209
+
210
+ private function comparePhp7WithDocBlock (array $ php7Tokens , array $ docBlockTokens , File $ phpcsFile , $ stackPtr )
211
+ {
212
+
213
+ $ parsedDocToken = [];
214
+ foreach ($ docBlockTokens as $ token ) {
215
+ $ parameterName = $ token ['content ' ];
216
+ if (isset ($ parsedDocToken [$ parameterName ])) {
217
+ $ phpcsFile ->addWarning (
218
+ sprintf ('Parameter %s is definitely multiple ' , $ parameterName ),
219
+ $ stackPtr ,
220
+ $ this ->warningCode
221
+ );
222
+ return $ phpcsFile ;
223
+ }
224
+
225
+ $ parsedDocToken [$ parameterName ] = $ token ['type ' ];
226
+ }
227
+
228
+ if (count ($ parsedDocToken ) > $ php7Tokens ['count ' ]) {
229
+ $ phpcsFile ->addWarning (
230
+ 'More documented parameter than real function parameter ' ,
231
+ $ stackPtr ,
232
+ $ this ->warningCode
233
+ );
234
+ return $ phpcsFile ;
235
+ }
236
+
237
+ $ parsedDocTokenKeys = array_keys ($ parsedDocToken );
238
+ $ hasMissingTypes = count ($ php7Tokens ['missing_type ' ]) > 0 ;
239
+ if ($ hasMissingTypes === true && array_keys ($ php7Tokens ['missing_type ' ]) !== $ parsedDocTokenKeys ) {
240
+ $ phpcsFile ->addWarning (
241
+ 'Documented parameter and real function parameter dont match ' ,
242
+ $ stackPtr ,
243
+ $ this ->warningCode
244
+ );
245
+
246
+ return $ phpcsFile ;
247
+ }
248
+
249
+ $ t = 12 ;
250
+
251
+
252
+ return $ phpcsFile ;
253
+ }
195
254
}
0 commit comments