|
1 | 1 | # PHPantom — Ignored Fixture Tasks |
2 | 2 |
|
3 | | -There are **228 fixture tests** in `tests/fixtures/`. Of these, **183 |
4 | | -pass** and **45 are ignored** because they exercise features or bug |
| 3 | +There are **228 fixture tests** in `tests/fixtures/`. Of these, **188 |
| 4 | +pass** and **40 are ignored** because they exercise features or bug |
5 | 5 | fixes that are not yet implemented. Each ignored fixture has a |
6 | 6 | `// ignore:` comment explaining what is missing. |
7 | 7 |
|
8 | | -This document groups the 45 ignored fixtures by the underlying work |
| 8 | +This document groups the 40 ignored fixtures by the underlying work |
9 | 9 | needed to un-ignore them. Tasks are ordered by the number of fixtures |
10 | 10 | they unblock (descending), then by estimated effort. Once a task is |
11 | 11 | complete, remove the `// ignore:` line from each fixture, verify the |
@@ -218,29 +218,6 @@ name is a variable, resolve the variable's type. If it is |
218 | 218 |
|
219 | 219 | --- |
220 | 220 |
|
221 | | -## 10. Mixed `->` then `::` accessor chaining (2 fixtures) |
222 | | - |
223 | | -**Ref:** [bugs.md §10](bugs.md#10-mixed-arrow-then-static-accessor-chaining-not-resolved) |
224 | | -**Impact: Low · Effort: Low** |
225 | | - |
226 | | -`$obj->prop::$staticProp` and `$obj->method()::staticMethod()` are not |
227 | | -resolved. The subject extractor does not handle a transition from `->` |
228 | | -to `::` within the same chain. |
229 | | - |
230 | | -**Fixtures:** |
231 | | - |
232 | | -- [ ] `completion/static_prop_after_arrow.fixture` — `$obj->prop::$staticProp` chain |
233 | | -- [ ] `member_access/static_property_instance.fixture` — same pattern in member_access context |
234 | | - |
235 | | -**Implementation notes:** |
236 | | - |
237 | | -In subject extraction (or the AST-based chain walker), when processing |
238 | | -a chain segment that switches from instance (`->`) to static (`::`) |
239 | | -access, resolve the instance segment first, then use its result type as |
240 | | -the class for the static access. |
241 | | - |
242 | | ---- |
243 | | - |
244 | 221 | ## 11. `class-string<T>` on interface method not inherited (1 fixture) |
245 | 222 |
|
246 | 223 | **Ref:** [type-inference.md §25](type-inference.md#25-class-stringt-on-interface-method-not-inherited) |
@@ -303,21 +280,6 @@ class-string argument at the call site. |
303 | 280 |
|
304 | 281 | --- |
305 | 282 |
|
306 | | -## 19. Inline `(new Foo)->method()` chaining (1 fixture) |
307 | | - |
308 | | -**Ref:** [bugs.md §12](bugs.md#12-inline-new-foo-method-chaining-not-resolved) |
309 | | -**Impact: Medium · Effort: Low-Medium** |
310 | | - |
311 | | -Parenthesized `new` expressions used inline as the root of a method |
312 | | -chain do not resolve for completion. `$x = (new Foo())` works, but |
313 | | -`(new Foo())->method()->` does not. |
314 | | - |
315 | | -**Fixture:** |
316 | | - |
317 | | -- [ ] `member_access/new_no_parenthesis.fixture` — `(new Foo)->bar()->` resolves |
318 | | - |
319 | | ---- |
320 | | - |
321 | 283 | ## 20. Elseif chain narrowing with `is_*()` (1 fixture) |
322 | 284 |
|
323 | 285 | **Ref:** [type-inference.md §3](type-inference.md#3-parse-and-resolve-param-is-t--a--b-return-types) (related) |
@@ -350,36 +312,6 @@ existing `array_pop`/`array_shift` handling. |
350 | 312 |
|
351 | 313 | --- |
352 | 314 |
|
353 | | -## 22. Literal string conditional return type (1 fixture) |
354 | | - |
355 | | -**Ref:** [type-inference.md §24](type-inference.md#24-literal-string-conditional-return-type) |
356 | | -**Impact: Low · Effort: Low-Medium** |
357 | | - |
358 | | -Conditional return types using literal string comparison |
359 | | -(`$param is "foo"`) are not resolved. Only class/interface type |
360 | | -conditions work today. |
361 | | - |
362 | | -**Fixture:** |
363 | | - |
364 | | -- [ ] `type/conditional_return_type_string.fixture` — literal string conditional resolves correct branch |
365 | | - |
366 | | ---- |
367 | | - |
368 | | -## 23. `@phpstan-type` alias in foreach context (1 fixture) |
369 | | - |
370 | | -**Ref:** [type-inference.md §29](type-inference.md#29-phpstan-type-alias-in-foreach-context) |
371 | | -**Impact: Low · Effort: Low** |
372 | | - |
373 | | -When a method's return type uses a `@phpstan-type` alias and the result |
374 | | -is iterated in a `foreach`, the alias is not resolved before extracting |
375 | | -the foreach value type. |
376 | | - |
377 | | -**Fixture:** |
378 | | - |
379 | | -- [ ] `type/phpstan_type_alias.fixture` — type alias resolves for foreach iteration |
380 | | - |
381 | | ---- |
382 | | - |
383 | 315 | ## 24. Variable scope isolation in closures (1 fixture) |
384 | 316 |
|
385 | 317 | **Impact: Low · Effort: Low-Medium** |
@@ -435,17 +367,13 @@ argument to the right side and returns the result. |
435 | 367 |
|
436 | 368 | ## Summary by effort |
437 | 369 |
|
438 | | -Quick wins (Low effort, 1 fixture each): |
439 | | - |
440 | | -| Task | Fixture | |
441 | | -|---|---| |
442 | | -| §23 `@phpstan-type` in foreach | `type/phpstan_type_alias` | |
443 | | - |
444 | | -Moderate wins (Low-Medium effort, multiple fixtures): |
| 370 | +Moderate wins (Low-Medium effort, few fixtures): |
445 | 371 |
|
446 | 372 | | Task | Fixtures | |
447 | 373 | |---|---| |
448 | | -| §10 Mixed `->` then `::` chaining | 2 | |
| 374 | +| §24 Variable scope isolation in closures | 1 | |
| 375 | +| §25 Pass-by-reference parameter type inference | 1 | |
| 376 | +| §26 Pipe operator (PHP 8.5) | 1 | |
449 | 377 |
|
450 | 378 | Biggest unlocks (Medium effort, many fixtures): |
451 | 379 |
|
|
0 commit comments