|
3 | 3 | namespace PHPStan\PhpDocParser\Parser; |
4 | 4 |
|
5 | 5 | use Iterator; |
| 6 | +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprArrayItemNode; |
6 | 7 | use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprArrayNode; |
7 | 8 | use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; |
8 | 9 | use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; |
|
44 | 45 | use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode; |
45 | 46 | use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; |
46 | 47 | use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; |
| 48 | +use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode; |
47 | 49 | use PHPStan\PhpDocParser\Ast\Type\OffsetAccessTypeNode; |
48 | 50 | use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; |
49 | 51 | use PHPStan\PhpDocParser\Lexer\Lexer; |
@@ -2201,6 +2203,98 @@ public function provideMethodTagsData(): Iterator |
2201 | 2203 | ), |
2202 | 2204 | ]), |
2203 | 2205 | ]; |
| 2206 | + |
| 2207 | + yield [ |
| 2208 | + 'OK non-static, with return type and parameter with generic type', |
| 2209 | + '/** @method ?T randomElement<T = string>(array<array-key, T> $array = [\'a\', \'b\']) */', |
| 2210 | + new PhpDocNode([ |
| 2211 | + new PhpDocTagNode( |
| 2212 | + '@method', |
| 2213 | + new MethodTagValueNode( |
| 2214 | + false, |
| 2215 | + new NullableTypeNode(new IdentifierTypeNode('T')), |
| 2216 | + 'randomElement', |
| 2217 | + [ |
| 2218 | + new MethodTagValueParameterNode( |
| 2219 | + new GenericTypeNode( |
| 2220 | + new IdentifierTypeNode('array'), |
| 2221 | + [ |
| 2222 | + new IdentifierTypeNode('array-key'), |
| 2223 | + new IdentifierTypeNode('T'), |
| 2224 | + ] |
| 2225 | + ), |
| 2226 | + false, |
| 2227 | + false, |
| 2228 | + '$array', |
| 2229 | + new ConstExprArrayNode([ |
| 2230 | + new ConstExprArrayItemNode( |
| 2231 | + null, |
| 2232 | + new ConstExprStringNode('\'a\'') |
| 2233 | + ), |
| 2234 | + new ConstExprArrayItemNode( |
| 2235 | + null, |
| 2236 | + new ConstExprStringNode('\'b\'') |
| 2237 | + ), |
| 2238 | + ]) |
| 2239 | + ), |
| 2240 | + ], |
| 2241 | + '', |
| 2242 | + [ |
| 2243 | + new TemplateTagValueNode( |
| 2244 | + 'T', |
| 2245 | + null, |
| 2246 | + '', |
| 2247 | + new IdentifierTypeNode('string') |
| 2248 | + ), |
| 2249 | + ] |
| 2250 | + ) |
| 2251 | + ), |
| 2252 | + ]), |
| 2253 | + ]; |
| 2254 | + |
| 2255 | + yield [ |
| 2256 | + 'OK static, with return type and multiple parameters with generic type', |
| 2257 | + '/** @method static bool compare<T1, T2 of Bar, T3 as Baz>(T1 $t1, T2 $t2, T3 $t3) */', |
| 2258 | + new PhpDocNode([ |
| 2259 | + new PhpDocTagNode( |
| 2260 | + '@method', |
| 2261 | + new MethodTagValueNode( |
| 2262 | + true, |
| 2263 | + new IdentifierTypeNode('bool'), |
| 2264 | + 'compare', |
| 2265 | + [ |
| 2266 | + new MethodTagValueParameterNode( |
| 2267 | + new IdentifierTypeNode('T1'), |
| 2268 | + false, |
| 2269 | + false, |
| 2270 | + '$t1', |
| 2271 | + null |
| 2272 | + ), |
| 2273 | + new MethodTagValueParameterNode( |
| 2274 | + new IdentifierTypeNode('T2'), |
| 2275 | + false, |
| 2276 | + false, |
| 2277 | + '$t2', |
| 2278 | + null |
| 2279 | + ), |
| 2280 | + new MethodTagValueParameterNode( |
| 2281 | + new IdentifierTypeNode('T3'), |
| 2282 | + false, |
| 2283 | + false, |
| 2284 | + '$t3', |
| 2285 | + null |
| 2286 | + ), |
| 2287 | + ], |
| 2288 | + '', |
| 2289 | + [ |
| 2290 | + new TemplateTagValueNode('T1', null, ''), |
| 2291 | + new TemplateTagValueNode('T2', new IdentifierTypeNode('Bar'), ''), |
| 2292 | + new TemplateTagValueNode('T3', new IdentifierTypeNode('Baz'), ''), |
| 2293 | + ] |
| 2294 | + ) |
| 2295 | + ), |
| 2296 | + ]), |
| 2297 | + ]; |
2204 | 2298 | } |
2205 | 2299 |
|
2206 | 2300 |
|
@@ -3078,6 +3172,45 @@ public function provideMultiLinePhpDocData(): array |
3078 | 3172 | ), |
3079 | 3173 | ]), |
3080 | 3174 | ], |
| 3175 | + [ |
| 3176 | + 'OK with template method', |
| 3177 | + '/** |
| 3178 | + * @template TKey as array-key |
| 3179 | + * @template TValue |
| 3180 | + * @method TKey|null find(TValue $v) find index of $v |
| 3181 | + */', |
| 3182 | + new PhpDocNode([ |
| 3183 | + new PhpDocTagNode( |
| 3184 | + '@template', |
| 3185 | + new TemplateTagValueNode('TKey', new IdentifierTypeNode('array-key'), '') |
| 3186 | + ), |
| 3187 | + new PhpDocTagNode( |
| 3188 | + '@template', |
| 3189 | + new TemplateTagValueNode('TValue', null, '') |
| 3190 | + ), |
| 3191 | + new PhpDocTagNode( |
| 3192 | + '@method', |
| 3193 | + new MethodTagValueNode( |
| 3194 | + false, |
| 3195 | + new UnionTypeNode([ |
| 3196 | + new IdentifierTypeNode('TKey'), |
| 3197 | + new IdentifierTypeNode('null'), |
| 3198 | + ]), |
| 3199 | + 'find', |
| 3200 | + [ |
| 3201 | + new MethodTagValueParameterNode( |
| 3202 | + new IdentifierTypeNode('TValue'), |
| 3203 | + false, |
| 3204 | + false, |
| 3205 | + '$v', |
| 3206 | + null |
| 3207 | + ), |
| 3208 | + ], |
| 3209 | + 'find index of $v' |
| 3210 | + ) |
| 3211 | + ), |
| 3212 | + ]), |
| 3213 | + ], |
3081 | 3214 | [ |
3082 | 3215 | 'OK with multiline conditional return type', |
3083 | 3216 | '/** |
|
0 commit comments