1717use TypePHP \Internal \TypeFormatter ;
1818use TypePHP \Resolver \SpecialTypeResolver ;
1919use TypePHP \Resolver \TemplateManager ;
20+ use TypePHP \Resolver \TemplateSubstitutor ;
2021use TypePHP \Validator \TypeValidatorRegistry ;
2122
2223/**
@@ -78,6 +79,9 @@ public static function checkParams(string $function, array $vars, object|string|
7879 TemplateManager::resolveInheritedTemplates ($ thisObj , $ declaringClass );
7980 }
8081
82+ $ boundTemplates = TemplateManager::getBoundTemplates ($ effectiveFunction , $ thisObj , $ templates );
83+ $ declaredTemplates = $ templates ;
84+
8185 foreach ($ contract ['types ' ] as $ paramName => $ typeNode ) {
8286 if (! \array_key_exists ($ paramName , $ vars )) {
8387 continue ;
@@ -94,6 +98,18 @@ public static function checkParams(string $function, array $vars, object|string|
9498 $ typeNode = $ aliases [$ typeNode ->name ];
9599 }
96100
101+ $ isClassStringT = ($ typeNode instanceof GenericTypeNode && self ::isClassStringTemplate ($ typeNode , $ templates ));
102+
103+ $ isBareTemplate = ($ typeNode instanceof IdentifierTypeNode && isset ($ templates [$ typeNode ->name ]))
104+ || ($ typeNode instanceof ArrayTypeNode && $ typeNode ->type instanceof IdentifierTypeNode && isset ($ templates [$ typeNode ->type ->name ]));
105+
106+ $ shouldSkipTemplateSub = $ isBareTemplate || $ isClassStringT ;
107+
108+ if (! $ shouldSkipTemplateSub && (\count ($ boundTemplates ) > 0 || \count ($ declaredTemplates ) > 0 )) {
109+ $ typeNode = TemplateSubstitutor::substitute ($ typeNode , $ boundTemplates , $ declaredTemplates );
110+ $ typeNode = SpecialTypeResolver::resolve ($ typeNode , $ effectiveFunction , $ thisObj );
111+ }
112+
97113 if ($ typeNode instanceof GenericTypeNode && self ::isClassStringTemplate ($ typeNode , $ templates )) {
98114 $ err = self ::resolveClassStringTemplate ($ typeNode , $ val , $ paramName , $ effectiveFunction , $ thisObj , $ templates );
99115 if ($ err !== null ) {
@@ -342,4 +358,4 @@ private static function resolveTemplateParam(TypeNode $typeNode, mixed $val, str
342358
343359 return null ;
344360 }
345- }
361+ }
0 commit comments