This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_2_5_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 1af1874ab0ff9d2d7347913b166106b6ec3865d4 Author: Eric Milles <[email protected]> AuthorDate: Sun Jan 23 11:14:03 2022 -0600 GROOVY-8433: Category transform implies static methods Conflicts: src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java --- .../codehaus/groovy/classgen/InnerClassVisitor.java | 11 ++++++++++- src/spec/test/metaprogramming/CategoryTest.groovy | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java index 635f236..9a5826d 100644 --- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java +++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java @@ -18,6 +18,7 @@ */ package org.codehaus.groovy.classgen; +import org.codehaus.groovy.ast.AnnotationNode; import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.CodeVisitorSupport; @@ -224,7 +225,7 @@ public class InnerClassVisitor extends InnerClassVisitorHelper implements Opcode innerClass.addConstructor(ACC_SYNTHETIC, parameters.toArray(Parameter.EMPTY_ARRAY), ClassNode.EMPTY_ARRAY, block); } - private boolean isStatic(InnerClassNode innerClass, VariableScope scope, final ConstructorCallExpression call) { + private boolean isStatic(final ClassNode innerClass, final VariableScope scope, final ConstructorCallExpression call) { boolean isStatic = innerClass.isStaticClass(); if (!isStatic) { if (currentMethod != null) { @@ -259,6 +260,14 @@ public class InnerClassVisitor extends InnerClassVisitorHelper implements Opcode isStatic = currentField.isStatic(); } } + if (!isStatic) { // GROOVY-8433: Category transform implies static method + for (AnnotationNode an : innerClass.getOuterClass().getAnnotations()) { + if (an.getClassNode().getName().equals("groovy.lang.Category")) { + isStatic = true; + break; + } + } + } return isStatic; } diff --git a/src/spec/test/metaprogramming/CategoryTest.groovy b/src/spec/test/metaprogramming/CategoryTest.groovy index 8123cf7..1350602 100644 --- a/src/spec/test/metaprogramming/CategoryTest.groovy +++ b/src/spec/test/metaprogramming/CategoryTest.groovy @@ -55,4 +55,24 @@ class CategoryTest extends GroovyTestCase { // end::time_category_anno[] ''' } + + // GROOVY-8433 + void testCategoryAnnotationAndAIC() { + assertScript ''' + @Category(Number) + class NumberCategory { + def m() { + String variable = 'works' + new Object() { // "Cannot cast object '1' with class 'java.lang.Integer' to class 'NumberCategory'" due to implicit "this" + String toString() { variable } + } + } + } + + use (NumberCategory) { + String result = 1.m() + assert result == 'works' + } + ''' + } }
