@@ -488,12 +488,19 @@ static boolean isAssignableTo(ClassNode type, ClassNode toBeAssignedTo) {
488
488
}
489
489
if (implementsInterfaceOrIsSubclassOf (type , toBeAssignedTo )) {
490
490
if (OBJECT_TYPE .equals (toBeAssignedTo )) return true ;
491
+ /* GRECLIPSE edit -- GROOVY-10067
491
492
if (toBeAssignedTo.isUsingGenerics()) {
492
493
// perform additional check on generics
493
494
// ? extends toBeAssignedTo
494
495
GenericsType gt = GenericsUtils.buildWildcardType(toBeAssignedTo);
495
496
return gt.isCompatibleWith(type);
496
497
}
498
+ */
499
+ if (toBeAssignedTo .getGenericsTypes () != null ) {
500
+ GenericsType gt = toBeAssignedTo .isGenericsPlaceHolder () ? toBeAssignedTo .getGenericsTypes ()[0 ] : GenericsUtils .buildWildcardType (toBeAssignedTo );
501
+ return gt .isCompatibleWith (type );
502
+ }
503
+ // GRECLIPSE end
497
504
return true ;
498
505
}
499
506
@@ -1915,6 +1922,11 @@ static void extractGenericsConnections(Map<GenericsTypeName, GenericsType> conne
1915
1922
// structural match route
1916
1923
if (target .isGenericsPlaceHolder ()) {
1917
1924
connections .put (new GenericsTypeName (target .getUnresolvedName ()), new GenericsType (type ));
1925
+ // GRECLIPSE add -- GROOVY-10067
1926
+ } else if (type .isGenericsPlaceHolder ()) {
1927
+ // "T extends java.util.List<X> -> java.util.List<E>" vs "java.util.List<E>"
1928
+ extractGenericsConnections (connections , extractType (new GenericsType (type )), target );
1929
+ // GRECLIPSE end
1918
1930
} else {
1919
1931
extractGenericsConnections (connections , type .getGenericsTypes (), target .getGenericsTypes ());
1920
1932
}
@@ -2106,11 +2118,12 @@ static ClassNode applyGenericsContext(final Map<GenericsTypeName, GenericsType>
2106
2118
if (type .isArray ()) {
2107
2119
return applyGenericsContext (spec , type .getComponentType ()).makeArray ();
2108
2120
}
2109
- ClassNode newType = type .getPlainNodeReference ();
2121
+ // ClassNode newType = type.getPlainNodeReference();
2110
2122
GenericsType [] gt = type .getGenericsTypes ();
2111
2123
if (asBoolean (spec )) {
2112
2124
gt = applyGenericsContext (spec , gt );
2113
2125
}
2126
+ /* GRECLIPSE edit -- GROOVY-10067
2114
2127
newType.setGenericsTypes(gt);
2115
2128
if (type.isGenericsPlaceHolder()) {
2116
2129
boolean nonTrivial = hasNonTrivialBounds(gt[0]);
@@ -2127,6 +2140,25 @@ static ClassNode applyGenericsContext(final Map<GenericsTypeName, GenericsType>
2127
2140
newType.setGenericsPlaceHolder(true);
2128
2141
}
2129
2142
return newType;
2143
+ */
2144
+ if (!type .isGenericsPlaceHolder ()) {
2145
+ ClassNode cn = type .getPlainNodeReference ();
2146
+ cn .setGenericsTypes (gt );
2147
+ return cn ;
2148
+ }
2149
+ if (gt [0 ].isPlaceholder ()) {
2150
+ if (type .getGenericsTypes ()[0 ] == gt [0 ]) {
2151
+ return type ; // nothing to do
2152
+ } else if (!hasNonTrivialBounds (gt [0 ])) {
2153
+ ClassNode cn = make (gt [0 ].getName ());
2154
+ cn .setRedirect (type );
2155
+ cn .setGenericsTypes (gt );
2156
+ cn .setGenericsPlaceHolder (true );
2157
+ return cn ;
2158
+ }
2159
+ }
2160
+ return getCombinedBoundType (gt [0 ]);
2161
+ // GRECLIPSE end
2130
2162
}
2131
2163
2132
2164
static ClassNode getCombinedBoundType (GenericsType genericsType ) {
0 commit comments