@@ -783,6 +783,7 @@ public static ClassNode findParameterizedType(ClassNode genericsClass, ClassNode
783
783
784
784
// Backported from 3.0.0
785
785
private static ClassNode findParameterizedType (ClassNode genericsClass , ClassNode actualType , boolean tryToFindExactType ) {
786
+ /* GRECLIPSE edit -- GROOVY-9945
786
787
ClassNode parameterizedType = null;
787
788
788
789
if (null == genericsClass.getGenericsTypes()) {
@@ -820,8 +821,48 @@ private static ClassNode findParameterizedType(ClassNode genericsClass, ClassNod
820
821
}
821
822
822
823
return parameterizedType;
824
+ */
825
+ final GenericsType [] genericsTypes = genericsClass .getGenericsTypes ();
826
+ if (genericsTypes == null || genericsClass .isGenericsPlaceHolder ()) {
827
+ return null ;
828
+ }
829
+
830
+ if (actualType .equals (genericsClass )) {
831
+ return actualType ;
832
+ }
833
+
834
+ java .util .Set <ClassNode > done = new java .util .HashSet <>();
835
+ LinkedList <ClassNode > todo = new LinkedList <>();
836
+ todo .add (actualType );
837
+ ClassNode type ;
838
+
839
+ while ((type = todo .poll ()) != null ) {
840
+ if (type .equals (genericsClass )) {
841
+ return type ;
842
+ }
843
+ if (done .add (type )) {
844
+ boolean parameterized = (type .getGenericsTypes () != null );
845
+ for (ClassNode cn : type .getInterfaces ()) {
846
+ if (parameterized )
847
+ cn = parameterizeType (type , cn );
848
+ todo .add (cn );
849
+ }
850
+ if (!actualType .isInterface ()) {
851
+ ClassNode cn = type .getUnresolvedSuperClass ();
852
+ if (cn != null && cn .redirect () != ClassHelper .OBJECT_TYPE ) {
853
+ if (parameterized )
854
+ cn = parameterizeType (type , cn );
855
+ todo .add (cn );
856
+ }
857
+ }
858
+ }
859
+ }
860
+
861
+ return null ;
862
+ // GRECLIPSE end
823
863
}
824
864
865
+ /* GRECLIPSE edit
825
866
private static boolean isGenericsTypeArraysLengthEqual(GenericsType[] declaringGenericsTypes, GenericsType[] actualGenericsTypes) {
826
867
return null != actualGenericsTypes && declaringGenericsTypes.length == actualGenericsTypes.length;
827
868
}
@@ -848,6 +889,7 @@ private static List<ClassNode> getAllUnresolvedSuperClasses(ClassNode actualRece
848
889
849
890
return superClassNodeList;
850
891
}
892
+ */
851
893
852
894
private static final EvictableCache <ParameterizedTypeCacheKey , SoftReference <ClassNode >> PARAMETERIZED_TYPE_CACHE = new ConcurrentSoftCache <>(64 );
853
895
@@ -969,18 +1011,11 @@ public static boolean hasPlaceHolders(final ClassNode parameterizedType) {
969
1011
return checkPlaceHolders (parameterizedType , genericsType -> genericsType .isPlaceholder ());
970
1012
}
971
1013
972
- /**
973
- * Check whether the ClassNode has non generics placeholders, aka not placeholder
974
- * <p>
975
- * Backported from 3.0.0
976
- *
977
- * @param parameterizedType the class node
978
- * @return the result
979
- * @since 2.5.9
980
- */
1014
+ /* GRECLIPSE edit
981
1015
private static boolean hasNonPlaceHolders(final ClassNode parameterizedType) {
982
1016
return checkPlaceHolders(parameterizedType, genericsType -> !genericsType.isPlaceholder());
983
1017
}
1018
+ */
984
1019
985
1020
// GRECLIPSE add
986
1021
/**
0 commit comments