@@ -328,7 +328,15 @@ private int validateTypeParameters(Type node) {
328328 for ( int j = 0 ; j < thisLevelTypeParams .length ; j ++ ) {
329329 String patternSig = new String (thisLevelTypeParams [j ]);
330330 IBinding patternTypeBinding = JdtCoreDomPackagePrivateUtility .findBindingForType (node , patternSig );
331- IBinding domBinding = DOMASTNodeUtils .getBinding ((ASTNode )typeArgs .get (j ));
331+ if ( patternTypeBinding == null ) {
332+ boolean plusOrMinus = patternSig .startsWith ("+" ) || patternSig .startsWith ("-" );
333+ String safePatternString = plusOrMinus ? patternSig .substring (1 ) : patternSig ;
334+ if ( safePatternString .startsWith ("Q" )) {
335+ patternTypeBinding = JdtCoreDomPackagePrivateUtility .findUnresolvedBindingForType (node , safePatternString );
336+ }
337+ }
338+ ASTNode argj = (ASTNode )typeArgs .get (j );
339+ IBinding domBinding = DOMASTNodeUtils .getBinding (argj );
332340 String domSig = domBinding == null ? null : domBinding instanceof JavacTypeBinding jctb ? jctb .getGenericTypeSignature (false ) : domBinding .getKey ();
333341 if ( patternSig .equals (("*" )))
334342 continue ;
@@ -359,9 +367,18 @@ private int validateTypeParameters(Type node) {
359367 String patternSigWithoutPrefix = patternSig .startsWith ("+" ) || patternSig .startsWith ("-" ) ? patternSig .substring (1 ) : patternSig ;
360368 String domSigWithoutPrefix = domSig .startsWith ("+" ) || domSig .startsWith ("-" ) ? domSig .substring (1 ) : domSig ;
361369 String patternSig2 = patternSigWithoutPrefix .substring (1 );
362- if ( !patternSig2 .equals (domSigWithoutPrefix .substring (1 )) && !domSig .endsWith ("." + patternSig2 )) {
363- return TYPE_PARAMS_COUNT_MATCH ;
370+ if ( patternSig2 .equals (domSigWithoutPrefix .substring (1 )))
371+ continue ;
372+ if ( domSig .endsWith ("." + patternSig2 ) )
373+ continue ;
374+ if ( argj instanceof SimpleType stt && stt .getName () instanceof SimpleName snn ) {
375+ String identifier = snn .getIdentifier ();
376+ String patternSig3 = patternSig2 .endsWith (";" ) ? patternSig2 .substring (0 , patternSig2 .length () - 1 ) : patternSig2 ;
377+ if ( matchesName (patternSig3 .toCharArray (), identifier .toCharArray ()) ) {
378+ continue ;
379+ }
364380 }
381+ return TYPE_PARAMS_COUNT_MATCH ;
365382 } else if ( !patternSig .equals (domSig )) {
366383 return TYPE_PARAMS_COUNT_MATCH ;
367384 }
@@ -409,7 +426,7 @@ private boolean validateOneTypeParameterExtends(String criteriaSignature, ITypeB
409426 if ( evaluateSigIsUnresolved && boundSig .endsWith ("." + evaluateSigTrimmed )) {
410427 return true ;
411428 }
412- if ( ! evaluateSigIsUnresolved && evaluateBinding instanceof ITypeBinding itb ) {
429+ if ( evaluateBinding instanceof ITypeBinding itb ) {
413430 ITypeBinding working = itb ;
414431 while (working != null ) {
415432 ITypeBinding superClaz = working .getSuperclass ();
0 commit comments