@@ -290,6 +290,8 @@ private function readPhpDoc($doc, string $parameterName): void
290290 $ this ->phpDocRaw = (string ) $ parsedParamTag ;
291291 $ this ->typeFromPhpDocExtended = Utils::modernPhpdoc ($ parsedParamTagParam );
292292 }
293+
294+ break ;
293295 }
294296 }
295297
@@ -298,62 +300,68 @@ private function readPhpDoc($doc, string $parameterName): void
298300
299301 if (!empty ($ parsedParamTags )) {
300302 foreach ($ parsedParamTags as $ parsedParamTag ) {
301- if ($ parsedParamTag instanceof \phpDocumentor \Reflection \DocBlock \Tags \Generic) {
302- $ spitedData = Utils::splitTypeAndVariable ($ parsedParamTag );
303- $ parsedParamTagStr = $ spitedData ['parsedParamTagStr ' ];
304- $ variableName = $ spitedData ['variableName ' ];
303+ if (!$ parsedParamTag instanceof \phpDocumentor \Reflection \DocBlock \Tags \Generic) {
304+ continue ;
305+ }
305306
306- // check only the current "param"-tag
307- if (!$ variableName || \strtoupper ($ parameterName ) !== \strtoupper ($ variableName )) {
308- continue ;
309- }
307+ $ spitedData = Utils::splitTypeAndVariable ($ parsedParamTag );
308+ $ parsedParamTagStr = $ spitedData ['parsedParamTagStr ' ];
309+ $ variableName = $ spitedData ['variableName ' ];
310310
311- $ this ->typeFromPhpDocExtended = Utils::modernPhpdoc ($ parsedParamTagStr );
311+ // check only the current "param"-tag
312+ if (!$ variableName || \strtoupper ($ parameterName ) !== \strtoupper ($ variableName )) {
313+ continue ;
312314 }
315+
316+ $ this ->typeFromPhpDocExtended = Utils::modernPhpdoc ($ parsedParamTagStr );
317+
318+ break ;
313319 }
314320 }
315321
316- if (
317- $ doc instanceof Doc
318- &&
319- !$ this ->phpDocRaw
320- ) {
321- $ tokens = Utils::modernPhpdocTokens ($ doc ->getText ());
322+ // fallback for e.g. `callable()`
323+ if (!$ this ->phpDocRaw || !$ this ->typeFromPhpDocExtended ) {
324+ $ this ->readPhpDocByTokens ($ docComment , $ parameterName );
325+ }
322326
323- $ paramTagFound = null ;
324- $ paramContent = '' ;
325- foreach ($ tokens ->getTokens () as $ token ) {
326- $ content = $ token [0 ] ?? '' ;
327+ } catch (\Exception $ e ) {
328+ $ tmpErrorMessage = $ this ->name . ': ' . ($ this ->line ?? '? ' ) . ' | ' . \print_r ($ e ->getMessage (), true );
329+ $ this ->parseError [\md5 ($ tmpErrorMessage )] = $ tmpErrorMessage ;
330+ }
331+ }
327332
328- if ($ content === '@param ' || $ content === '@psalm-param ' || $ content === '@phpstan-param ' ) {
329- $ paramContent = '' ;
330- $ paramTagFound = true ;
333+ /**
334+ * @throws \PHPStan\PhpDocParser\Parser\ParserException
335+ */
336+ private function readPhpDocByTokens (string $ docComment , string $ parameterName ): void
337+ {
338+ $ tokens = Utils::modernPhpdocTokens ($ docComment );
331339
332- continue ;
333- }
340+ $ paramContent = null ;
341+ foreach ($ tokens ->getTokens () as $ token ) {
342+ $ content = $ token [0 ] ?? '' ;
334343
335- if ( $ content === '$ ' . $ parameterName ) {
336- break ;
337- }
344+ if ( $ content === ' @param ' || $ content === ' @psalm-param ' || $ content === '@phpstan-param ' ) {
345+ // reset
346+ $ paramContent = '' ;
338347
339- if (\strpos ($ content , '$ ' ) === 0 ) {
340- $ paramContent = '' ;
341- $ paramTagFound = false ;
342- }
348+ continue ;
349+ }
343350
344- if ( $ paramTagFound ) {
345- $ paramContent .= $ content ;
346- }
347- }
351+ // We can stop if we found the param variable e.g. `@param array{foo:int} $param`.
352+ if ( $ content === ' $ ' . $ parameterName ) {
353+ break ;
354+ }
348355
349- $ paramContent = \trim ($ paramContent );
350- if ($ paramContent ) {
351- $ this ->typeFromPhpDocExtended = Utils::modernPhpdoc ($ paramContent );
352- }
356+ if ($ paramContent !== null ) {
357+ $ paramContent .= $ content ;
353358 }
354- } catch (\Exception $ e ) {
355- $ tmpErrorMessage = $ this ->name . ': ' . ($ this ->line ?? '? ' ) . ' | ' . \print_r ($ e ->getMessage (), true );
356- $ this ->parseError [\md5 ($ tmpErrorMessage )] = $ tmpErrorMessage ;
359+ }
360+
361+ $ paramContent = $ paramContent ? \trim ($ paramContent ) : null ;
362+ if ($ paramContent ) {
363+ $ this ->phpDocRaw = $ paramContent . ' ' . '$ ' . $ parameterName ;
364+ $ this ->typeFromPhpDocExtended = Utils::modernPhpdoc ($ paramContent );
357365 }
358366 }
359367}
0 commit comments