Skip to content

Commit 437d369

Browse files
committed
Refactor SpecialTypeResolver to extract class and constant names for improved key resolution in reflection contexts to support 8.2 below
1 parent 217b4cf commit 437d369

1 file changed

Lines changed: 24 additions & 2 deletions

File tree

src/Resolver/SpecialTypeResolver.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ public static function resolveForFile(TypeNode $node, string $file): TypeNode
245245
return clone $node;
246246
}
247247

248+
// --- Private Helper Extractions for Reflection Context ---
249+
248250
/**
249251
* @param \ReflectionClass<object>|\ReflectionFunction|\ReflectionMethod|string $context
250252
*
@@ -356,8 +358,17 @@ private static function resolveArrayShape(ArrayShapeNode $node, \ReflectionClass
356358
/** @var ConstExprIntegerNode|ConstExprStringNode|ConstFetchNode|IdentifierTypeNode|null $keyName */
357359
$keyName = $item->keyName;
358360

361+
$className = null;
362+
$constName = null;
363+
359364
if ($keyName instanceof ConstFetchNode && $keyName->className !== '') {
360365
$className = $keyName->className;
366+
$constName = $keyName->name;
367+
} elseif ($keyName instanceof IdentifierTypeNode && str_contains($keyName->name, '::')) {
368+
[$className, $constName] = explode('::', $keyName->name, 2);
369+
}
370+
371+
if ($className !== null && $constName !== null) {
361372
$lowerClassName = strtolower($className);
362373
$declaringClass = $ref instanceof \ReflectionMethod ? $ref->getDeclaringClass()->getName() : null;
363374

@@ -370,7 +381,7 @@ private static function resolveArrayShape(ArrayShapeNode $node, \ReflectionClass
370381
$resolvedClass = self::resolveFqcn($className, $ref);
371382
}
372383

373-
$resolvedKeyNode = self::resolveConstantKeyValue($resolvedClass, $keyName->name);
384+
$resolvedKeyNode = self::resolveConstantKeyValue($resolvedClass, $constName);
374385
if ($resolvedKeyNode !== null) {
375386
$keyName = $resolvedKeyNode;
376387
}
@@ -433,6 +444,8 @@ private static function resolveCallable(CallableTypeNode $node, \ReflectionClass
433444
return new CallableTypeNode($node->identifier, $resolvedParameters, $resolvedReturnType, $node->templateTypes);
434445
}
435446

447+
// --- Private Helper Extractions for File Context ---
448+
436449
private static function resolveConstTypeForFile(ConstTypeNode $node, string $file): ConstTypeNode
437450
{
438451
if ($node->constExpr instanceof ConstFetchNode && $node->constExpr->className !== '') {
@@ -485,13 +498,22 @@ private static function resolveArrayShapeForFile(ArrayShapeNode $node, string $f
485498
/** @var ConstExprIntegerNode|ConstExprStringNode|ConstFetchNode|IdentifierTypeNode|null $keyName */
486499
$keyName = $item->keyName;
487500

501+
$className = null;
502+
$constName = null;
503+
488504
if ($keyName instanceof ConstFetchNode && $keyName->className !== '') {
489505
$className = $keyName->className;
506+
$constName = $keyName->name;
507+
} elseif ($keyName instanceof IdentifierTypeNode && str_contains($keyName->name, '::')) {
508+
[$className, $constName] = explode('::', $keyName->name, 2);
509+
}
510+
511+
if ($className !== null && $constName !== null) {
490512
$lowerClassName = strtolower($className);
491513

492514
if ($lowerClassName !== 'self' && $lowerClassName !== 'parent') {
493515
$resolvedClass = self::resolveFqcnForFile($className, $file);
494-
$resolvedKeyNode = self::resolveConstantKeyValue($resolvedClass, $keyName->name);
516+
$resolvedKeyNode = self::resolveConstantKeyValue($resolvedClass, $constName);
495517
if ($resolvedKeyNode !== null) {
496518
$keyName = $resolvedKeyNode;
497519
}

0 commit comments

Comments
 (0)