You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/01/24 03:10:26 UTC
[groovy] branch master updated: GROOVY-8433: Category transform implies static methods
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 3c37c58 GROOVY-8433: Category transform implies static methods
3c37c58 is described below
commit 3c37c5856f3fd5e4bdc8cf9bdc4645101e7d3303
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Jan 23 11:14:03 2022 -0600
GROOVY-8433: Category transform implies static methods
---
.../codehaus/groovy/classgen/InnerClassVisitor.java | 5 ++++-
src/spec/test/metaprogramming/CategoryTest.groovy | 20 ++++++++++++++++++++
2 files changed, 24 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 8fd2cd4..3855d95 100644
--- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java
+++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java
@@ -227,7 +227,7 @@ public class InnerClassVisitor extends InnerClassVisitorHelper {
innerClass.addConstructor(ACC_SYNTHETIC, parameters.toArray(Parameter.EMPTY_ARRAY), ClassNode.EMPTY_ARRAY, block);
}
- private boolean isStatic(InnerClassNode innerClass, VariableScope scope, ConstructorCallExpression call) {
+ private boolean isStatic(final ClassNode innerClass, final VariableScope scope, final ConstructorCallExpression call) {
boolean isStatic = innerClass.isStaticClass();
if (!isStatic) {
if (currentMethod != null) {
@@ -255,6 +255,9 @@ public class InnerClassVisitor extends InnerClassVisitorHelper {
isStatic = currentField.isStatic();
}
}
+ // GROOVY-8433: Category transform implies static method
+ isStatic = isStatic || innerClass.getOuterClass().getAnnotations().stream()
+ .anyMatch(a -> a.getClassNode().getName().equals("groovy.lang.Category"));
return isStatic;
}
diff --git a/src/spec/test/metaprogramming/CategoryTest.groovy b/src/spec/test/metaprogramming/CategoryTest.groovy
index 16bd7b0..1d528c6 100644
--- a/src/spec/test/metaprogramming/CategoryTest.groovy
+++ b/src/spec/test/metaprogramming/CategoryTest.groovy
@@ -56,4 +56,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'
+ }
+ '''
+ }
}