|
15 | 15 | use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode; |
16 | 16 | use PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode; |
17 | 17 | use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; |
| 18 | +use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; |
18 | 19 | use PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode; |
19 | 20 | use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; |
20 | 21 | use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; |
@@ -49,6 +50,7 @@ protected function setUp(): void |
49 | 50 | * @dataProvider provideMethodTagsData |
50 | 51 | * @dataProvider provideSingleLinePhpDocData |
51 | 52 | * @dataProvider provideMultiLinePhpDocData |
| 53 | + * @dataProvider provideTemplateTagsData |
52 | 54 | * @param string $label |
53 | 55 | * @param string $input |
54 | 56 | * @param PhpDocNode $expectedPhpDocNode |
@@ -2198,4 +2200,106 @@ public function provideMultiLinePhpDocData(): array |
2198 | 2200 | ]; |
2199 | 2201 | } |
2200 | 2202 |
|
| 2203 | + |
| 2204 | + public function provideTemplateTagsData(): \Iterator |
| 2205 | + { |
| 2206 | + yield [ |
| 2207 | + 'OK without bound and description', |
| 2208 | + '/** @template T */', |
| 2209 | + new PhpDocNode([ |
| 2210 | + new PhpDocTagNode( |
| 2211 | + '@template', |
| 2212 | + new TemplateTagValueNode( |
| 2213 | + 'T', |
| 2214 | + new IdentifierTypeNode('mixed'), |
| 2215 | + '' |
| 2216 | + ) |
| 2217 | + ), |
| 2218 | + ]), |
| 2219 | + ]; |
| 2220 | + |
| 2221 | + yield [ |
| 2222 | + 'OK without bound', |
| 2223 | + '/** @template T the value type*/', |
| 2224 | + new PhpDocNode([ |
| 2225 | + new PhpDocTagNode( |
| 2226 | + '@template', |
| 2227 | + new TemplateTagValueNode( |
| 2228 | + 'T', |
| 2229 | + new IdentifierTypeNode('mixed'), |
| 2230 | + 'the value type' |
| 2231 | + ) |
| 2232 | + ), |
| 2233 | + ]), |
| 2234 | + ]; |
| 2235 | + |
| 2236 | + yield [ |
| 2237 | + 'OK without description', |
| 2238 | + '/** @template T of DateTime */', |
| 2239 | + new PhpDocNode([ |
| 2240 | + new PhpDocTagNode( |
| 2241 | + '@template', |
| 2242 | + new TemplateTagValueNode( |
| 2243 | + 'T', |
| 2244 | + new IdentifierTypeNode('DateTime'), |
| 2245 | + '' |
| 2246 | + ) |
| 2247 | + ), |
| 2248 | + ]), |
| 2249 | + ]; |
| 2250 | + |
| 2251 | + yield [ |
| 2252 | + 'OK with bound and description', |
| 2253 | + '/** @template T of DateTime the value type */', |
| 2254 | + new PhpDocNode([ |
| 2255 | + new PhpDocTagNode( |
| 2256 | + '@template', |
| 2257 | + new TemplateTagValueNode( |
| 2258 | + 'T', |
| 2259 | + new IdentifierTypeNode('DateTime'), |
| 2260 | + 'the value type' |
| 2261 | + ) |
| 2262 | + ), |
| 2263 | + ]), |
| 2264 | + ]; |
| 2265 | + |
| 2266 | + yield [ |
| 2267 | + 'invalid without bound and description', |
| 2268 | + '/** @template */', |
| 2269 | + new PhpDocNode([ |
| 2270 | + new PhpDocTagNode( |
| 2271 | + '@template', |
| 2272 | + new InvalidTagValueNode( |
| 2273 | + '', |
| 2274 | + new \PHPStan\PhpDocParser\Parser\ParserException( |
| 2275 | + '*/', |
| 2276 | + Lexer::TOKEN_CLOSE_PHPDOC, |
| 2277 | + 14, |
| 2278 | + Lexer::TOKEN_IDENTIFIER |
| 2279 | + ) |
| 2280 | + ) |
| 2281 | + ), |
| 2282 | + ]), |
| 2283 | + ]; |
| 2284 | + |
| 2285 | + yield [ |
| 2286 | + 'invalid without bound and with description', |
| 2287 | + '/** @template #desc */', |
| 2288 | + new PhpDocNode([ |
| 2289 | + new PhpDocTagNode( |
| 2290 | + '@template', |
| 2291 | + new InvalidTagValueNode( |
| 2292 | + '#desc', |
| 2293 | + new \PHPStan\PhpDocParser\Parser\ParserException( |
| 2294 | + '#desc', |
| 2295 | + Lexer::TOKEN_OTHER, |
| 2296 | + 14, |
| 2297 | + Lexer::TOKEN_IDENTIFIER |
| 2298 | + ) |
| 2299 | + ) |
| 2300 | + ), |
| 2301 | + ]), |
| 2302 | + ]; |
| 2303 | + } |
| 2304 | + |
2201 | 2305 | } |
0 commit comments