You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/02/23 17:18:13 UTC

[groovy] 01/03: GROOVY-8433: Category transform implies static methods

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 <er...@thomsonreuters.com>
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'
+            }
+        '''
+    }
 }