@@ -263,63 +263,76 @@ protected SourceUnit getSourceUnit() {
263263 return source ;
264264 }
265265
266+ @ Override
267+ public void visitField (final FieldNode node ) {
268+ Map <GenericsTypeName , GenericsType > oldNames = genericParameterNames ;
269+ if (!canSeeTypeVars (node .getModifiers (), node .getDeclaringClass ())) {
270+ genericParameterNames = Collections .emptyMap ();
271+ }
272+
273+ if (!fieldTypesChecked .contains (node )) {
274+ resolveOrFail (node .getType (), node );
275+ }
276+ super .visitField (node );
277+
278+ genericParameterNames = oldNames ;
279+ }
280+
281+ @ Override
282+ public void visitProperty (final PropertyNode node ) {
283+ Map <GenericsTypeName , GenericsType > oldNames = genericParameterNames ;
284+ if (!canSeeTypeVars (node .getModifiers (), node .getDeclaringClass ())) {
285+ genericParameterNames = Collections .emptyMap ();
286+ }
287+
288+ resolveOrFail (node .getType (), node );
289+ fieldTypesChecked .add (node .getField ());
290+
291+ super .visitProperty (node );
292+
293+ genericParameterNames = oldNames ;
294+ }
295+
296+ private static boolean canSeeTypeVars (final int mods , final ClassNode node ) {
297+ return !Modifier .isStatic (mods ) || Traits .isTrait (node ); // GROOVY-8864, GROOVY-11508
298+ }
299+
266300 @ Override
267301 protected void visitConstructorOrMethod (final MethodNode node , final boolean isConstructor ) {
268302 VariableScope oldScope = currentScope ;
269303 currentScope = node .getVariableScope ();
270304 Map <GenericsTypeName , GenericsType > oldNames = genericParameterNames ;
271- genericParameterNames = node .isStatic () && !Traits .isTrait (node .getDeclaringClass ())
272- ? new HashMap <>() : new HashMap <>(genericParameterNames );
305+ genericParameterNames =
306+ canSeeTypeVars (node .getModifiers (), node .getDeclaringClass ())
307+ ? new HashMap <>(genericParameterNames ) : new HashMap <>();
273308
274309 resolveGenericsHeader (node .getGenericsTypes ());
275310
311+ resolveOrFail (node .getReturnType (), node );
276312 for (Parameter p : node .getParameters ()) {
277313 p .setInitialExpression (transform (p .getInitialExpression ()));
278- resolveOrFail (p .getType (), p .getType ());
314+ ClassNode t = p .getType ();
315+ resolveOrFail (t , t );
279316 visitAnnotations (p );
280317 }
281- resolveOrFail (node .getReturnType (), node );
282318 if (node .getExceptions () != null ) {
283319 for (ClassNode t : node .getExceptions ()) {
284- resolveOrFail (t , node );
320+ resolveOrFail (t , t );
285321 }
286322 }
287323
288324 checkGenericsCyclicInheritance (node .getGenericsTypes ());
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 }
@@ -1098,14 +1111,14 @@ protected Expression transformBinaryExpression(final BinaryExpression be) {
10981111 protected Expression transformClosureExpression (final ClosureExpression ce ) {
10991112 boolean oldInClosure = inClosure ;
11001113 inClosure = true ;
1101- for (Parameter para : getParametersSafe (ce )) {
1102- ClassNode t = para .getType ();
1103- resolveOrFail (t , ce );
1104- visitAnnotations (para );
1105- if (para .hasInitialExpression ()) {
1106- para .setInitialExpression (transform (para .getInitialExpression ()));
1114+ for (Parameter p : getParametersSafe (ce )) {
1115+ ClassNode t = p .getType ();
1116+ resolveOrFail (t , t );
1117+ visitAnnotations (p );
1118+ if (p .hasInitialExpression ()) {
1119+ p .setInitialExpression (transform (p .getInitialExpression ()));
11071120 }
1108- visitAnnotations (para );
1121+ visitAnnotations (p );
11091122 }
11101123
11111124 Statement code = ce .getCode ();
0 commit comments