@@ -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