@@ -265,61 +265,74 @@ protected SourceUnit getSourceUnit() {
265265 return source ;
266266 }
267267
268+ @ Override
269+ public void visitField (final FieldNode node ) {
270+ Map <GenericsTypeName , GenericsType > oldNames = genericParameterNames ;
271+ if (!canSeeTypeVars (node .getModifiers (), node .getDeclaringClass ())) {
272+ genericParameterNames = Collections .emptyMap ();
273+ }
274+
275+ if (!fieldTypesChecked .contains (node )) {
276+ resolveOrFail (node .getType (), node );
277+ }
278+ super .visitField (node );
279+
280+ genericParameterNames = oldNames ;
281+ }
282+
283+ @ Override
284+ public void visitProperty (final PropertyNode node ) {
285+ Map <GenericsTypeName , GenericsType > oldNames = genericParameterNames ;
286+ if (!canSeeTypeVars (node .getModifiers (), node .getDeclaringClass ())) {
287+ genericParameterNames = Collections .emptyMap ();
288+ }
289+
290+ resolveOrFail (node .getType (), node );
291+ fieldTypesChecked .add (node .getField ());
292+
293+ super .visitProperty (node );
294+
295+ genericParameterNames = oldNames ;
296+ }
297+
298+ private static boolean canSeeTypeVars (final int mods , final ClassNode node ) {
299+ return !Modifier .isStatic (mods ) || Traits .isTrait (node ); // GROOVY-8864, GROOVY-11508
300+ }
301+
268302 @ Override
269303 protected void visitConstructorOrMethod (final MethodNode node , final boolean isConstructor ) {
270304 VariableScope oldScope = currentScope ;
271305 currentScope = node .getVariableScope ();
272306 Map <GenericsTypeName , GenericsType > oldNames = genericParameterNames ;
273- genericParameterNames = node .isStatic () && !Traits .isTrait (node .getDeclaringClass ())
274- ? new HashMap <>() : new HashMap <>(genericParameterNames );
307+ genericParameterNames =
308+ canSeeTypeVars (node .getModifiers (), node .getDeclaringClass ())
309+ ? new HashMap <>(genericParameterNames ) : new HashMap <>();
275310
276311 resolveGenericsHeader (node .getGenericsTypes ());
277312
313+ resolveOrFail (node .getReturnType (), node );
278314 for (Parameter p : node .getParameters ()) {
279315 p .setInitialExpression (transform (p .getInitialExpression ()));
280- resolveOrFail (p .getType (), p .getType ());
316+ ClassNode t = p .getType ();
317+ resolveOrFail (t , t );
281318 visitAnnotations (p );
282319 }
283- resolveOrFail (node .getReturnType (), node );
284320 if (node .getExceptions () != null ) {
285321 for (ClassNode t : node .getExceptions ()) {
286- resolveOrFail (t , node );
322+ resolveOrFail (t , t );
287323 }
288324 }
289325
290326 MethodNode oldCurrentMethod = currentMethod ;
291327 currentMethod = node ;
328+
292329 super .visitConstructorOrMethod (node , isConstructor );
293330
294331 currentMethod = oldCurrentMethod ;
295332 genericParameterNames = oldNames ;
296333 currentScope = oldScope ;
297334 }
298335
299- @ Override
300- public void visitField (final FieldNode node ) {
301- ClassNode t = node .getType ();
302- if (!fieldTypesChecked .contains (node )) {
303- resolveOrFail (t , node );
304- }
305- super .visitField (node );
306- }
307-
308- @ Override
309- public void visitProperty (final PropertyNode node ) {
310- Map <GenericsTypeName , GenericsType > oldPNames = genericParameterNames ;
311- if (node .isStatic () && !Traits .isTrait (node .getDeclaringClass ())) {
312- genericParameterNames = new HashMap <>();
313- }
314-
315- ClassNode t = node .getType ();
316- resolveOrFail (t , node );
317- super .visitProperty (node );
318- fieldTypesChecked .add (node .getField ());
319-
320- genericParameterNames = oldPNames ;
321- }
322-
323336 private void resolveOrFail (final ClassNode type , final ASTNode node ) {
324337 resolveOrFail (type , "" , node );
325338 }
@@ -1108,14 +1121,14 @@ protected Expression transformBinaryExpression(final BinaryExpression be) {
11081121 protected Expression transformClosureExpression (final ClosureExpression ce ) {
11091122 boolean oldInClosure = inClosure ;
11101123 inClosure = true ;
1111- for (Parameter para : getParametersSafe (ce )) {
1112- ClassNode t = para .getType ();
1113- resolveOrFail (t , ce );
1114- visitAnnotations (para );
1115- if (para .hasInitialExpression ()) {
1116- para .setInitialExpression (transform (para .getInitialExpression ()));
1124+ for (Parameter p : getParametersSafe (ce )) {
1125+ ClassNode t = p .getType ();
1126+ resolveOrFail (t , t );
1127+ visitAnnotations (p );
1128+ if (p .hasInitialExpression ()) {
1129+ p .setInitialExpression (transform (p .getInitialExpression ()));
11171130 }
1118- visitAnnotations (para );
1131+ visitAnnotations (p );
11191132 }
11201133
11211134 Statement code = ce .getCode ();
0 commit comments