Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/Analyser/ExpressionTypeHolder.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,33 @@

namespace PHPStan\Analyser;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PHPStan\TrinaryLogic;
use PHPStan\Turbo\ReferencedByTurboExtension;
use PHPStan\Turbo\ShadowedByTurboExtension;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use function array_pop;
use function get_class;
use function is_array;

#[ShadowedByTurboExtension(turboClass: 'PHPStanTurbo\ExpressionTypeHolder', implementation: __DIR__ . '/../../turbo-ext/src/ExpressionTypeHolder.cpp')]
#[ReferencedByTurboExtension(key: 'expressionTypeHolder')]
final class ExpressionTypeHolder
{

/**
* The node key of every sub-expression, keyed to the classes it appears
* as - what MutatingScope::shouldInvalidateExpression()'s AST scan
* established per invalidation. Holders are shared across scope copies,
* so the one-time subtree scan amortizes over the many invalidation
* checks against the same holder.
*
* @var array<string, array<class-string<Expr>, true>>|null
*/
private ?array $containedNodeKeys = null;

public function __construct(
private readonly Expr $expr,
private readonly Type $type,
Expand All @@ -22,6 +37,42 @@ public function __construct(
{
}

/**
* @param callable(Expr): string $keyBuilder
* @return array<string, array<class-string<Expr>, true>>
*/
public function getContainedNodeKeys(callable $keyBuilder): array
{
if ($this->containedNodeKeys !== null) {
return $this->containedNodeKeys;
}

$keys = [];
$stack = [$this->expr];
while ($stack !== []) {
$node = array_pop($stack);
if ($node instanceof Expr) {
$keys[$keyBuilder($node)][get_class($node)] = true;
}
foreach ($node->getSubNodeNames() as $subNodeName) {
$subNode = $node->$subNodeName;
if ($subNode instanceof Node) {
$stack[] = $subNode;
} elseif (is_array($subNode)) {
foreach ($subNode as $subNodeItem) {
if (!($subNodeItem instanceof Node)) {
continue;
}

$stack[] = $subNodeItem;
}
}
}
}

return $this->containedNodeKeys = $keys;
}

public static function createYes(Expr $expr, Type $type): self
{
return new self($expr, $type, TrinaryLogic::createYes());
Expand Down
2 changes: 1 addition & 1 deletion src/Analyser/MutatingScope.php
Original file line number Diff line number Diff line change
Expand Up @@ -3893,7 +3893,7 @@ private function generalizeVariableTypeHolders(
$newVariableTypeHolders = [];
foreach ($variableTypeHolders as $variableExprString => $variableTypeHolder) {
foreach ($generalizedExpressions as $generalizedExprString => $generalizedExpr) {
if (!ScopeOps::shouldInvalidateExpression($this, $this->exprPrinter, $generalizedExprString, $generalizedExpr, $variableTypeHolder->getExpr(), $variableExprString)) {
if (!ScopeOps::shouldInvalidateExpression($this, $this->exprPrinter, $generalizedExprString, $generalizedExpr, $variableTypeHolder, $variableExprString)) {
continue;
}

Expand Down
26 changes: 18 additions & 8 deletions src/Analyser/ScopeOps.php
Original file line number Diff line number Diff line change
Expand Up @@ -623,8 +623,7 @@ public static function invalidateExpressionEntries(
) {
continue;
}
$exprExpr = $exprTypeHolder->getExpr();
if (!self::shouldInvalidateExpression($scope, $exprPrinter, $exprStringToInvalidate, $expressionToInvalidate, $exprExpr, $exprString, $requireMoreCharacters, $invalidatingClass)) {
if (!self::shouldInvalidateExpression($scope, $exprPrinter, $exprStringToInvalidate, $expressionToInvalidate, $exprTypeHolder, $exprString, $requireMoreCharacters, $invalidatingClass)) {
continue;
}

Expand All @@ -647,8 +646,8 @@ public static function invalidateExpressionEntries(
|| str_contains($conditionalExprString, $exprStringToInvalidate)
|| self::keyMayHideSubExpressions($conditionalExprString)
) {
$firstExpr = $holders[array_key_first($holders)]->getTypeHolder()->getExpr();
if (self::shouldInvalidateExpression($scope, $exprPrinter, $exprStringToInvalidate, $expressionToInvalidate, $firstExpr, $conditionalExprString, $requireMoreCharacters, $invalidatingClass)) {
$firstHolder = $holders[array_key_first($holders)]->getTypeHolder();
if (self::shouldInvalidateExpression($scope, $exprPrinter, $exprStringToInvalidate, $expressionToInvalidate, $firstHolder, $conditionalExprString, $requireMoreCharacters, $invalidatingClass)) {
$invalidated = true;
continue;
}
Expand Down Expand Up @@ -678,7 +677,7 @@ public static function invalidateExpressionEntries(
$shouldKeep = true;
$conditionalTypeHolders = $holder->getConditionExpressionTypeHolders();
foreach ($conditionalTypeHolders as $conditionalTypeHolderExprString => $conditionalTypeHolder) {
if (self::shouldInvalidateExpression($scope, $exprPrinter, $exprStringToInvalidate, $expressionToInvalidate, $conditionalTypeHolder->getExpr(), (string) $conditionalTypeHolderExprString, invalidatingClass: $invalidatingClass)) {
if (self::shouldInvalidateExpression($scope, $exprPrinter, $exprStringToInvalidate, $expressionToInvalidate, $conditionalTypeHolder, (string) $conditionalTypeHolderExprString, invalidatingClass: $invalidatingClass)) {
$invalidated = true;
$shouldKeep = false;
break;
Expand Down Expand Up @@ -797,10 +796,14 @@ private static function keyMayHideSubExpressions(string $exprString): bool
}

/**
* Mirrors the former MutatingScope::shouldInvalidateExpression().
* Answers one (stored holder, invalidated expression) containment check
* from the holder's contained-node-keys index; '$this' invalidations keep
* the finder because they also match self/static/parent and the current
* class name, whose resolution depends on the asking scope.
*/
public static function shouldInvalidateExpression(MutatingScope $scope, ExprPrinter $exprPrinter, string $exprStringToInvalidate, Expr $exprToInvalidate, Expr $expr, string $exprString, bool $requireMoreCharacters = false, ?ClassReflection $invalidatingClass = null): bool
public static function shouldInvalidateExpression(MutatingScope $scope, ExprPrinter $exprPrinter, string $exprStringToInvalidate, Expr $exprToInvalidate, ExpressionTypeHolder $exprTypeHolder, string $exprString, bool $requireMoreCharacters = false, ?ClassReflection $invalidatingClass = null): bool
{
$expr = $exprTypeHolder->getExpr();
if (
$expr instanceof IntertwinedVariableByReferenceWithExpr
&& $exprToInvalidate instanceof Variable
Expand Down Expand Up @@ -852,7 +855,14 @@ public static function shouldInvalidateExpression(MutatingScope $scope, ExprPrin
return false;
}

if (!self::containsExpressionToInvalidate($scope, $exprPrinter, $expr, get_class($exprToInvalidate), $exprStringToInvalidate)) {
if ($exprStringToInvalidate === '$this') {
// '$this' also matches self/static/parent and the current class name -
// name resolution depends on this scope, so the holder-cached key
// index below cannot answer it
if (!self::containsExpressionToInvalidate($scope, $exprPrinter, $expr, get_class($exprToInvalidate), $exprStringToInvalidate)) {
return false;
}
} elseif (!isset($exprTypeHolder->getContainedNodeKeys(static fn (Expr $node): string => self::nodeKey($node, $exprPrinter))[$exprStringToInvalidate][get_class($exprToInvalidate)])) {
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion src/Turbo/TurboExtensionEnabler.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ final class TurboExtensionEnabler
* version is the short SHA of the last commit touching turbo-ext/src/,
* enforced by the phar.yml turbo-version job.
*/
public const EXPECTED_EXTENSION_VERSION = '86312b7';
public const EXPECTED_EXTENSION_VERSION = '29d230d';

private static bool $typeCombinatorCacheEnabled = false;

Expand Down
86 changes: 86 additions & 0 deletions turbo-ext/src/ArenaCache.dep
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
src/ArenaCache.lo: \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/ArenaCache.cpp \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/support.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_version.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_types.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_portability.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_config.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/../main/php_config.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/../TSRM/TSRM.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_config.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_range_check.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_long.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_map_ptr.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_errors.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_alloc.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_alloc_sizes.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_llist.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_string.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_gc.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_hrtime.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_hash.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_sort.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_ast.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_variables.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_iterators.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_stream.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_smart_str_public.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_smart_string_public.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_signal.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_max_execution_timer.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_object_handlers.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_property_hooks.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_lazy_objects.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_operators.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_strtod.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_multiply.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_compat.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_API.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_modules.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_compile.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_vm_opcodes.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_frameless_function.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_globals.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_globals_macros.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_atomic.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_stack.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_ptr_stack.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_objects.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_objects_API.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_float.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_multibyte.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_arena.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_call_stack.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_build.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_list.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_execute.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_constants.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_type_info.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/build-defs.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/snprintf.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/spprintf.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_syslog.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_output.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_streams.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_context.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_filter_api.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_transport.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_plain_wrapper.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_glob_wrapper.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_userspace.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_mmap.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_memory_streams.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/fopen_wrappers.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_globals.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_ini.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_ini.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_virtual_cwd.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/TSRM/TSRM.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_reentrancy.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_exceptions.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_interfaces.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_smart_str.h \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/reg.h \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/zv.h
86 changes: 86 additions & 0 deletions turbo-ext/src/CombinationsHelper.dep
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
src/CombinationsHelper.lo: \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/CombinationsHelper.cpp \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/support.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_version.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_types.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_portability.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_config.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/../main/php_config.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/../TSRM/TSRM.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_config.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_range_check.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_long.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_map_ptr.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_errors.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_alloc.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_alloc_sizes.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_llist.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_string.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_gc.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_hrtime.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_hash.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_sort.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_ast.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_variables.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_iterators.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_stream.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_smart_str_public.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_smart_string_public.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_signal.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_max_execution_timer.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_object_handlers.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_property_hooks.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_lazy_objects.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_operators.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_strtod.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_multiply.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_compat.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_API.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_modules.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_compile.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_vm_opcodes.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_frameless_function.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_globals.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_globals_macros.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_atomic.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_stack.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_ptr_stack.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_objects.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_objects_API.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_float.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_multibyte.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_arena.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_call_stack.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_build.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_list.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_execute.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_constants.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_type_info.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/build-defs.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/snprintf.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/spprintf.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_syslog.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_output.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_streams.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_context.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_filter_api.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_transport.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_plain_wrapper.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_glob_wrapper.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_userspace.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/streams/php_stream_mmap.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_memory_streams.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/fopen_wrappers.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_globals.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_ini.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_ini.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_virtual_cwd.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/TSRM/TSRM.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/main/php_reentrancy.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_exceptions.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_interfaces.h \
/opt/homebrew/Cellar/php/8.5.5_1/include/php/Zend/zend_smart_str.h \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/zv.h \
/Users/ondrej/Development/phpstan/.claude/worktrees/scopeops-invalidation/turbo-ext/src/reg.h
Loading
Loading