diff --git a/src/Psalm/Internal/Analyzer/CommentAnalyzer.php b/src/Psalm/Internal/Analyzer/CommentAnalyzer.php index b2d34db5199..15e93908ba4 100644 --- a/src/Psalm/Internal/Analyzer/CommentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/CommentAnalyzer.php @@ -346,6 +346,11 @@ public static function splitDocLine(string $return_block): array continue; } + if ($next_char === '{') { + $type .= ' '; + continue; + } + if ($next_char === '|' || $next_char === '&') { $nexter_char = $i < $l - 2 ? $return_block[$i + 2] : null; diff --git a/tests/CommentAnalyzerTest.php b/tests/CommentAnalyzerTest.php index 63c22f8ecaf..b034627fa64 100644 --- a/tests/CommentAnalyzerTest.php +++ b/tests/CommentAnalyzerTest.php @@ -75,4 +75,71 @@ public function testDocblockDescriptionWithVarDescription(): void $comment_docblock = CommentAnalyzer::getTypeFromComment($php_parser_doc, new FileScanner('somefile.php', 'somefile.php', false), new Aliases); $this->assertSame('Use a string', $comment_docblock[0]->description); } + + /** + * @dataProvider providerSplitDocLine + * @param string[] $expected + */ + public function testSplitDocLine(string $doc_line, array $expected): void + { + $this->assertSame($expected, CommentAnalyzer::splitDocLine($doc_line)); + } + + /** + * @return iterable + */ + public function providerSplitDocLine(): iterable + { + return [ + 'typeWithVar' => [ + 'doc_line' => + 'TArray $array', + 'expected' => [ + 'TArray', + '$array', + ], + ], + 'arrayShape' => [ + 'doc_line' => + 'array{ + * a: int, + * b: string, + * }', + 'expected' => [ + 'array{ + * a: int, + * b: string, + * }', + ], + ], + 'arrayShapeWithSpace' => [ + 'doc_line' => + 'array { + * a: int, + * b: string, + * }', + 'expected' => [ + 'array { + * a: int, + * b: string, + * }', + ], + ], + 'func_num_args' => [ + 'doc_line' => + '( + * func_num_args() is 1 + * ? array{dirname: string, basename: string, extension?: string, filename: string} + * : string + * )', + 'expected' => [ + '( + * func_num_args() is 1 + * ? array{dirname: string, basename: string, extension?: string, filename: string} + * : string + * )', + ], + ], + ]; + } }